f# at pfa pension - meetupfiles.meetup.com/10193032/fsharp_at_pfa_pension.pdf · f# at pfa pension...

40
F# AT PFA PENSION KRISTIAN SCHMIDT - ACTUARIAL MODELLING MAIL: [email protected] WEB: WWW.KREUTZ.US TWITTER: @KREUTZSCHMIDT

Upload: others

Post on 17-Jul-2020

6 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

F# AT PFA PENSIONKRISTIAN SCHMIDT - ACTUARIAL MODELLING

MAIL: [email protected]

WEB: WWW.KREUTZ.US

TWITTER: @KREUTZSCHMIDT

Page 2: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

WHAT DO WE DO?Insurance mathematicsLife insurance in PFA's caseLiability calculations, making sure we will be able to fulfillour obligationsPricing. What do our customers need to pay for insurance?

Page 3: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

WHAT DO WE DO? MY DEPARTMENTSize: One manager and three analystsInsurance contract valuationMortality rate modellingLiability calculations for all policiesAd hoc analysis of potential model changes

Page 4: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE EVOLUTION OF OUR F# USERewrite of our pricing engine from C++ to C#Heard some buzz about functional programmingStarted intro to scala course

Page 5: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THEN I TRIED TO GET SBT WORKING

Page 6: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

FAST FORWARD A FEW MONTHSSomehow heard about F#Start fiddling at home, read a lot offsharpforfunandprofit.comProposed rewriting some of the existing classesFirst F# commit 23/05/2014

Page 7: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

A YEAR AND A HALF LATERThe department's projects are a mix of C#, F# and SASF# is the default language for new projectsA rewrite of our SAS code in F# is under wayThe manager and one other analyst completedProgramming in F# on edX.org

Page 8: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

LANGUAGE UPS AND DOWNSTHE GOOD PARTS

Page 9: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

IMMUTABILITYSensible defaultAlso very nice to have mutability in a pinch!

Page 10: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

TYPESDiscriminated unions: Where have you been all my life?!The killer app - ease of declarationStructural equality by default

Page 11: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

PATTERN MATCHINGSAS

1: 2: 3: 4: 5: 6: 7: 8: 9: 10:

* Pi faktorer, pi(i, j). Vi skelner imellem STDLIV 2,0% (j=3), STDLIV 3,pi(01, 3) = 11.040000/12; pi(03, 3) = 03.686074/4; pi(06, 3) = 01.847599/2; pi(12, 3) = 00.928373/1; pi(01, 2) = 11.040000/12; pi(03, 2) = 03.690555/4; pi(06, 2) = 01.853212/2; pi(12, 2) = 00.934575/1; ...

Page 12: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

F# - STARTING WITH THE TYPES

1: 2: 3: 4: 5: 6: 7: 8: 9:

type Period = | ``One Month`` | ``Three Months`` | ``Six Months`` | ``Twelve Months``

type Basis = | ``STDLIV 3,5%`` | ``STDLIV 2%`` | ``Five %`` | Other

Page 13: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

F# - THEN THE LOOKUP FUNCTION

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:

let PiFaktor period basis = match period, basis with | ``One Month``, ``STDLIV 2%`` ­> 11.040000m / 12m | ``Three Months``, ``STDLIV 2%`` ­> 3.686074m / 4m | ``Six Months``, ``STDLIV 2%`` ­> 1.847599m / 2m | ``Twelve Months``, ``STDLIV 2%`` ­> 0.928373m | ``One Month``, ``STDLIV 3,5%`` ­> 11.040000m / 12m | ``Three Months``, ``STDLIV 3,5%`` ­> 3.690555m / 4m | ``Six Months``, ``STDLIV 3,5%`` ­> 1.853212m / 2m | ``Twelve Months``, ``STDLIV 3,5%`` ­> 0.934575m ...

Page 14: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

EASY TO USE STANDARD LIBRARYThe core sequence modules (Array, List, Seq) have a ton ofuseful functionsFold, reduce, scan, partition, groupByNone of these are hard to implement, but easy to screw up

Page 15: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

EASY TO USE STANDARD LIBRARYEXAMPLE - GROUPBY F#

1: let groups = list |> List.groupBy f

Page 16: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

EASY TO USE STANDARD LIBRARYEXAMPLE - GROUPBY C#

Page 17: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

LANGUAGE UPS AND DOWNSTHE NOT-SO-GOOD PARTS

Page 18: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

VISUAL STUDIO SUPPORTIntellisense pales in comparison to C#VS Power Tools help, but it's not R#erC#/F# project interop, find references/gotoDoesn't feel like a first class citizen

Page 19: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

DEBUGGING PIPES1: 2: 3: 4:

let result = initialValue |> operation1 |> operation2 |> operation3

Page 20: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

DEBUGGING PIPES1: 2: 3:

let result1 = operation1 initialValue let result2 = operation2 result1 let result = operation3 result2

Page 21: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

VARYING QUALITY OF OPEN SOURCE LIBRARIESLacking docs/tutorialsStill in their infancy, feature wise

Page 22: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

MODEL INTROCONTRACT VALUATION

Page 23: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

AN EXAMPLEI am a healthy 29 year old maleIf I die before age 67, my wife gets 1.000.000 DKKWhat is the probability weighed value of this contract?

Page 24: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

A MODEL FRAMEWORK

Key conceptsState: Active, Disabled & DeadIntensity: "Probability" of jumping from one state toanotherPayment: Money received jumping to (or staying in) a givenstate

Page 25: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

SOLUTIONMath: Set of ordinary differential equationsNumerical procedures: Runge-Kutta methodsCode: Model setup in F#, numerical procedure in C#, bulkcalculator in F#

Page 26: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

SCALEProcess about 25 million contracts at the start of everymonthTakes about 15 hours on a 64 core server~150 ms average compute time

Page 27: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

COMMERCIAL SOLUTIONS

Edlund's ActulusSchantz Valuation

Page 28: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

DECLARATIVE COMPUTATION EXPRESSIONSAND THE PROBLEM IT HELPED US SOLVE

Page 29: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

REGULAR COMPUTATION EXPRESSIONSDefines a series of computations in a specific contextSee for example: async, seq

Page 30: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

DECLARATIVE COMPUTATION EXPRESSIONSDefines custom operators that augment a record type

Example from F# DSL Cheatsheet

1: 2: 3: 4: 5: 6:

let example = trade buy 100 "IBM" Shares At Max 45 sell 40 "Sun" Shares At Min 24 buy 25 "CISCO" Shares At Max 56

Page 31: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

DECLARATIVE COMPUTATION EXPRESSIONS - WHY?No need to write your own parserGet type checking for freeTradeoff between compile time type checking and syntaxflexibility

Page 32: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

A MODEL FRAMEWORK

State: Active, Disabled & DeadIntensity: "Probability" of jumping from one state toanotherThe problem: Keeping track of the intensities

Page 33: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE OLD SOLUTION

Page 34: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE NEW SOLUTION - STATES1: 2: 3: 4:

type State = | Active | Dead | Disabled

Page 35: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE NEW SOLUTION - INTENSITIES1: 2: 3: 4: 5:

type InputJumpIntensity = | GM of a : float * b : float * c : float | Interpolated of float list | Constant of value : float | ...

G (age) = a +M(a,b,c) 10b+c∗age−10

Implements common operators (+, -, *)Enables us to express computations previously done inexcel directly in the code

Page 36: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE NEW SOLUTION 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:

let (=>) a b = (a,b)

let ``ValuationBasis Name`` = valuationBasis intensity Male (Active => Dead) ``Intensity 1`` intensity Male (Active => Disabled) ``Intensity 2`` intensity Male (Disabled => Active) ``Intensity 3`` intensity Male (Disabled => Dead) ``Intensity 4``

...

Page 37: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

THE NEW SOLUTION1: 2: 3:

[<ContainsValuationBases>] module InputValuationBases = let ``ValuationBasis Name`` = ...

Valuation bases are automatically added where they areneededAutomatic report generation (Word / )LT XA E

Page 38: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

SUMMARY

Page 39: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

QUESTIONS?THANK YOU FOR YOUR TIME

MAIL: [email protected]

WEB: WWW.KREUTZ.US

TWITTER: @KREUTZSCHMIDT

Page 40: F# AT PFA PENSION - Meetupfiles.meetup.com/10193032/FSharp_at_PFA_Pension.pdf · f# at pfa pension kristian schmidt - actuarial modelling mail: kristian@kreutz.us web: twitter: @kreutzschmidt

1: 2: 3: 4: 5: 6:

type Builder() = member __.Yield(()) = The default record

[<CustomOperation("customOp")>] member __.CustomOp(record, parameters) = The augmented record