-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsim.go
60 lines (43 loc) · 1.15 KB
/
sim.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package blackscholes
import (
"errors"
"math"
)
const defaultNumPaths uint = 10000000
func PriceSim(
vol, timeToExpiry, spot, strike, interestRate, dividendYield float64,
optionType OptionType,
numPaths ...uint,
) (price float64, err error) {
npaths := defaultNumPaths
if len(numPaths) > 0 {
npaths = numPaths[0]
}
price = math.NaN()
if npaths == 0 {
err = errors.New("number of paths must be positive")
return
}
if !ValidOptionType(optionType) {
err = ErrUnknownOptionType
return
}
expectedSpot := spot * math.Exp((interestRate-dividendYield)*timeToExpiry)
sigma := vol * math.Sqrt(timeToExpiry)
mu := -0.5 * sigma * sigma
sum := 0.0
for i := uint(1); i < npaths; i += 2 {
u := float64(i) / float64(npaths)
z := NormCDFInverse(u)
spot = expectedSpot * math.Exp(mu+sigma*z)
sum += Intrinsic(0, spot, strike, 0, 0, optionType)
spot = expectedSpot * math.Exp(mu-sigma*z)
sum += Intrinsic(0, spot, strike, 0, 0, optionType)
}
if npaths%2 == 1 {
spot = expectedSpot * math.Exp(mu)
sum += Intrinsic(0, spot, strike, 0, 0, optionType)
}
price = math.Exp(-interestRate*timeToExpiry) * sum / float64(npaths)
return
}