A library to bring actuarial modeling to Julia.
Julia
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
src
test
.codecov.yml
.gitignore
.travis.yml
LICENSE.md
README.md
REQUIRE
appveyor.yml

README.md

ActuarialScience - v0.0.3

A new actuarial modeling library

Code Review: Build Status Coverage Status codecov.io

A library to bring actuarial science to Julia.

Project Goals

The goal is ultimately to build out a modeling package, capable of doing much more than simple commutations.

New in this version

  • Refine interest rate periods:
    • Period 0 now is meaningless, period 1 now refers to the time period (0,1]
  • Add ability to use serial correlation to interest rates (see interest rate section for example)
  • Add memory of functional interest rates
    • Prior calls to interest rates record the interst rate, so each call to a stochastic interest rate function don't generate an entirely new stream of interest rates, even if it's the same interest rate object

Usage

using ActuarialScience
using Plots
plotlyjs()
using Distributions

Mortality

# ActuarialScience will have a number of mortality tables built into the package
# for now, there are two Social Security tables built in, maleMort and femaleMort
# e.g. femaleMort = femaleMort = [0.005728,0.000373,0.000241,...]

# to turn a vector into an interactable mortality table object, create a MortalityTable Object
m = MortalityTable(maleMort)
f = MortalityTable(femaleMort)

t = MortalityTable(maleMort)



## Examples ##

# 0.00699 ≈ qx(t,0)
# 0.000447 ≈ qx(t,1)
# 1000.0 == lx(t,0)  # the convention is that lx is based on 1000 lives
# 993.010 ≈ lx(t,1) 
# 1000.0-1000*qx(t,0) ≈ lx(t,1)
# 992.5661245 ≈ lx(t,2)
# 120 == w(t)
# 0 == dx(t,150)
# 6.99 ≈ dx(t,0)
# 76.8982069 ≈ ex(t,0)
# tpx(t,15,3) >= tpx(t,15,4)
# tqx(t,16,2) >= tqx(t,15,2)
# 0 <= ex(t,15)
# 0.003664839851 ≈ tpx(t,22,80)

Interest

# ActuarialScience provides an easy way to specify interest rates:

i = InterestRate(.05) # you can pass interest rate a decimal value, a vector, or a function that returns a value 

# ActuarialScience currently lets you use a basic stochastic interest rate form

i2 = InterestRate((x -> rand(Normal(.05,.01))))  # anonymous function provides an easy way to add a stochastic interest rate

# Serial correlation is also allowed:
i3 = InterestRate((x -> rand(Normal(i(i3,-1),0.01))), .05)
# InterestRate(f,x...) where x is the first x... interest rates
# i(i3,-1) returns the prior period's interest rate

# Julia's power as a language comes in really handy here!

Modeling

## the assumptiosn are joined with a "LifeInsurance" Object
insM = LifeInsurance(m,i2) 
insF = LifeInsurance(f,i2)

## from there, you can calculate a number of actuarial commutations:

ins = LifeInsurance(t,i)
# Ax(ins,0) ≈ 0.04223728223

# Axn(ins,26,1) ≈ 0.001299047619
# Ax(ins,26) ≈ 0.1082172434
# äx(ins,26) = 18.727437887738578 # Julia lets you use unicode characters, so you can use the a-dot-dot as the actual function
# äx(ins,26) = 18.727437887738578 # many code editors make the unicode characters really easy, but helper functions provide compatibility
# calculating the net premium for a whole life policy for males and females
# using a random interest rate on


plot([map((x->1000000*Ax(insM,x)/äx(insM,x)),0:100),map((x->1000000*Ax(insF,x)/äx(insF,x)),0:100)],xlabel="Age",ylabel="Yearly Cost",yscale = :log10)

The annual net premium for a whole life policy, by age, with a random discount rate.

plot of insurance premiums

This is different than what you'd actually pay for a policy, which is called a "gross premium".

Roadmap

  • Continue building out basic life and annuity functions
  • Implement lapses
  • Add reserves
  • Docs
  • More robust tests
  • More built-in mortality tables
  • TBD

References

Sources for help with the commutation functions (since I have long since taken MLC)

Shout out to a similar Python project, whose Readme I one day hope to live up to and provided inspiration, including some of the function syntax.

Disclaimer

I provide no warranty or guarantees. This is an open source project and I encourage you to submit feedback or pull requests. It's my first foray into the promising language of Juilia, so I encourage feedback about the package desgin and code architecture.