-
-
Notifications
You must be signed in to change notification settings - Fork 410
Expand file tree
/
Copy pathtest_FinFXLookbackOption.py
More file actions
140 lines (117 loc) · 3.16 KB
/
Copy pathtest_FinFXLookbackOption.py
File metadata and controls
140 lines (117 loc) · 3.16 KB
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# Copyright (C) 2018, 2019, 2020 Dominic O'Kane
from financepy.utils.date import Date
from financepy.market.curves.discount_curve_flat import DiscountCurveFlat
from financepy.products.fx.fx_fixed_lookback_option import (
FXFixedLookbackOption,
)
from financepy.products.fx.fx_float_lookback_option import (
FXFloatLookbackOption,
)
from financepy.utils.global_types import OptionTypes
value_dt = Date(1, 1, 2015)
expiry_dt = Date(1, 1, 2016)
stock_price = 100.0
volatility = 0.3
num_paths = 10000
stock_price_range = range(90, 110, 5)
num_steps_per_year = 252
domestic_rate = 0.05
domestic_curve = DiscountCurveFlat(value_dt, domestic_rate)
foreign_rate = 0.02
foreign_curve = DiscountCurveFlat(value_dt, foreign_rate)
########################################################################################
def test_european_call():
opt_type = OptionTypes.EUROPEAN_CALL
option = FXFloatLookbackOption(expiry_dt, opt_type)
stock_min = stock_price - 10
value = option.value(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
)
value_mc = option.value_mc(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
num_paths,
num_steps_per_year,
)
assert round(value, 4) == 23.7455
assert round(value_mc, 4) == 23.2553
k = 100.0
option = FXFixedLookbackOption(expiry_dt, opt_type, k)
stock_min = stock_price
value = option.value(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
)
value_mc = option.value_mc(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
num_paths,
num_steps_per_year,
)
assert round(value, 4) == 26.8608
assert round(value_mc, 4) == 25.7191
########################################################################################
def test_european_put():
opt_type = OptionTypes.EUROPEAN_PUT
option = FXFloatLookbackOption(expiry_dt, opt_type)
stock_max = stock_price + 10
value = option.value(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_max,
)
value_mc = option.value_mc(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_max,
num_paths,
num_steps_per_year,
)
assert round(value, 4) == 25.2429
assert round(value_mc, 4) == 24.3641
k = 105.0
option = FXFixedLookbackOption(expiry_dt, opt_type, k)
stock_min = stock_price - 10.0
value = option.value(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
)
value_mc = option.value_mc(
value_dt,
stock_price,
domestic_curve,
foreign_curve,
volatility,
stock_min,
num_paths,
num_steps_per_year,
)
assert round(value, 4) == 25.6047
assert round(value_mc, 4) == 25.0960