Skip to content

Instantly share code, notes, and snippets.

@ecounysis
Created July 13, 2010 00:45
Show Gist options
  • Save ecounysis/473293 to your computer and use it in GitHub Desktop.
Save ecounysis/473293 to your computer and use it in GitHub Desktop.
Black-Scholes Option Pricing Model in F#
let normal zz =
let p = 0.2316419
let b = [0.31938153;-0.356563782;1.781477937;-1.821255978;1.330274428]
let f = 1.0/(sqrt (2.0*3.1415926))
let abszz = abs zz
let ff = f*(exp((-(abszz**2.0)/2.0)))
let sfunc e b = b/((1.0+p*abszz)**e)
let sfunclist = List.init 6 (fun x->(sfunc (float x)))
let s = List.init 5 (fun x->List.nth sfunclist (x+1) (List.nth b x))
let sz = ff * (List.sum s)
match zz with
|v when v = 0.0 -> 0.5
|v when v >= 6.0 -> 1.0
|v when v <= -6.0 -> 0.0
|v when v < 0.0 -> sz
|v -> 1.0 - sz
let blackscholes strike asset standarddev riskfreerate days2expiration =
let daysinyear = 365.0
let sqrtt days = sqrt (days/daysinyear)
let n strike s sd r days =
let ls = log s
let lx = log strike
let t = days/daysinyear
let sd2 = sd**2.0
ls-lx+r*t+(sd2*t/2.0)
let delta strike s sd r days =
let n = n strike s sd r days
let sqT = sqrtt days
let d = sd*sqT
let d1 = n/d
normal d1
let delta2 n sd days =
let sqT = sqrtt days
let d = sd*sqT
let d1 = n/d
normal d1
let nd2 n sd days =
let sqT = sqrtt days
let d = sd*sqT
let d1 = n/d
let d2 = d1-sd*sqT
normal d2
let bond strike s sd r days =
let n = n strike s sd r days
let t = days/daysinyear
let nd1 = delta2 n sd days
let nd2 = nd2 n sd days
-strike*nd2*(exp (-r*t))
let callValue strike s sd r days =
let n = n strike s sd r days
let t = days/daysinyear
let nd1 = delta2 n sd days
let nd2 = nd2 n sd days
let b = bond strike s sd r days
s*nd1+b
let putValue strike s sd r days =
let t = days/daysinyear
let call = callValue strike s sd r days
(exp (-r*t)) * strike - s + call
[putValue strike asset standarddev riskfreerate days2expiration;
callValue strike asset standarddev riskfreerate days2expiration;
delta strike asset standarddev riskfreerate days2expiration;
bond strike asset standarddev riskfreerate days2expiration]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment