A library to bring actuarial modeling to Julia.
Switch branches/tags
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.


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


using ActuarialScience
using Plots
using Distributions


# 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)


# 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!


## 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".


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


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.


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.