Machine Reserving DIY
ASM 5th General Insurance &
Takaful Actuarial Seminar
Teh Loo Hai
16 June 2015
Motivation
2 www.actuaries.com.my
Motivation
3 www.actuaries.com.my
Handwritten digit classification
[Courtesy of Yann LeCun] Standford Machine Learning – Andrew Ng
5 www.actuaries.com.my
Begin with the End in Mind
6 www.actuaries.com.my
DIY Tools
and Design
7 www.actuaries.com.my
Tools
• Programming Language
• Database
• User Interface
8 www.actuaries.com.my
Choice of Tools - Options
Programming Language
• VBA
• C++
• R
• Python
• Matlab / Octave
Database
• Microsoft Access
• MySQL
• Foxpro
User Interface
• csv
• Excel
• Word
9 www.actuaries.com.my
Choice of Tools - Considerations
Programming language
• Modern
• Object Oriented
• Easy to learn
• Good support
• Cost
Database
• Scalability
• Corporate policy
• Cost
User Interface
• GUI
• Easy to use
• Seamless integration with other tools
10 www.actuaries.com.my
11 www.actuaries.com.my
Common Design
12 www.actuaries.com.my
Common Design
Design
• Good design
– Input
– Formulae
– Output
– Locked cells
– Colour coded
13 www.actuaries.com.my
Design
14 www.actuaries.com.my
Achieving
Our Goals
15 www.actuaries.com.my
Data Processing – Source Data
• Raw data from IT and Finance
– EP UPR (Forms G6-1, GT5)
– Movement (SMCD, GT6-3)
16 www.actuaries.com.my
Data Processing – Old Way
• Extract data
– Links in Excel
– Copy and paste
• Check data
17 www.actuaries.com.my
TAS Insurance Berhad Appendix C
IBNR Claims Reserves as of 31 December 2015 (Net of Reinsurance)
Line of Business: Fire
Cumulative Case Incurred Claims (RM)
Accident
Years 1 2 3 4 5 6 7 8 9 10
1999 215,866 871,110 928,106 930,550 934,611 934,813 934,858 935,186 935,186 935,186
2000 767,646 1,166,909 1,267,393 1,280,629 1,282,589 1,284,484 1,284,733 1,291,834 1,291,834 1,291,834
2001 782,381 1,607,080 1,632,763 1,657,273 1,666,970 1,678,659 1,678,978 1,679,351 1,679,551 1,688,814
2002 665,999 2,100,588 2,121,569 2,183,857 2,185,328 2,186,078 2,186,182 2,186,284 2,187,124 2,187,180
2003 1,022,481 2,111,509 2,199,423 2,201,940 2,202,435 2,203,168 2,203,467 2,203,484 2,203,486 2,203,698
2004 1,373,693 2,358,457 2,400,493 2,401,215 2,406,367 2,435,974 2,437,065 2,437,066 2,438,381 2,438,579
2005 1,225,050 2,120,952 2,139,366 2,140,661 2,139,161 2,139,263 2,139,265 2,145,751 2,145,876 2,145,876
2006 771,585 2,163,239 2,249,387 2,274,637 2,347,728 2,346,574 2,346,689 2,347,018 2,426,424 2,426,424
2007 1,220,201 2,176,725 2,259,247 2,272,395 2,276,744 2,286,908 2,288,388 2,295,798 2,301,598
2008 1,282,605 3,186,543 3,409,922 3,575,135 3,577,580 3,578,484 3,628,339 3,628,343
2009 1,712,756 3,367,208 3,411,042 3,466,220 3,554,236 3,564,663 3,574,632
2010 1,802,255 3,493,096 3,591,755 3,603,286 3,603,868 3,612,691
2011 2,098,531 3,523,062 3,687,143 3,692,780 3,695,161
2012 1,709,421 3,167,251 3,260,509 3,280,668
2013 1,760,948 3,249,338 3,414,481
2014 2,425,184 4,322,212
2015 2,258,609
Years of Development
Data Processing – Ideal Way
• Extract data
• Check data
18 www.actuaries.com.my
Data Processing – Under the Hood
• readin = pd.io.sql.frame_query(‘’.join(q), cnx)
• err1 = pd.concat([readin[readin.cuincur < 0],
[readin[readin.cupaid < 0])
• err1.pr2xl(sh)
• err2 = readin[readin.cuincur < readin.cupaid]
• err2.pr2xl(sh)
19 www.actuaries.com.my
IBNR – Old Way
20 www.actuaries.com.my
• Extend runoff
triangle
• Choose link ratios,
loss ratios
spreadsheets
• Repeat for
another class
IBNR – Ideal Way
21 www.actuaries.com.my
IBNR – Under the Hood
• movm = gipy.Movm.fromdb(cmpy.constr, …)
• movm = gipy.Movm.fromXl(xlfile, …)
• devfact = gipy.Devfact(movm, weighted=True, …)
• linkratios = gipy.Linkratios(method, movm, devfact, …)
• movm.proj(linkratios)
• movm.qtr2yr(inplace=True)
• movm.pr2xl(sh)
22 www.actuaries.com.my
Reporting – Old Way vs Ideal Way
Old Way
Summary spreadsheet
linking all results
Make sure links updated
correctly
23 www.actuaries.com.my
Ideal Way
Specify runtime
parameters
Nicely formatted tables as
output
Reporting – Under the Hood
• tbl[‘becl’] = db.retr_becl(cmpy.constr, …)
• tbl[‘pradpc’] = db.retr_pradpc(cmpy.constr, …)
• tbl[‘prad’] = tbl.becl * tbl.pradpc
• fprad_tot = max(sum(tbl.becl) * pradpc[‘Total’],
0.5 * sum(tbl.prad))
• tbl[‘fprad’] = tbl.prad * fprad_tot / sum(tbl.prad)
• tbl[‘cl’] = tbl.becl + tbl.fprad
24 www.actuaries.com.my
Are We There Yet?
25 www.actuaries.com.my
Way Forward – Scaling New Heights
• Depth
– Data frequency
– Individual data
• Width
– Budget
– Stress Test
– DST
– ITCL
26 www.actuaries.com.my
27 www.actuaries.com.my