Black Scholes看跌期权,解析解实现-Python
Black Scholes put option, analytical solution implementation - Python
我正在尝试创建一个简单的函数来求解给定股票价值数组 x0、特定执行价格 K、无风险利率 r、波动率和到期时间 T 的看跌期权的价值. 公式在这里找到:
https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model
我认为这是一个相对简单的功能来实现,但我似乎得到了更大股票价格的错误值。这是我的代码:
def FinalTimeAnalyticalSolution(x0,K,r,vol,T):
x0 = np.array(x0)
N = len(x0) - 1
t = 0.0
U = np.empty(N+1)
U[0] = K * math.exp(-r * (T - t))
for i in range(1,N+1):
d1 = (1.0/(vol*(math.sqrt(T - t)))) * (math.log(x0[i]/K) + (r - (vol**2)/2)*(T-t))
d2 = d1 - vol * math.sqrt(T-t)
U[i] = norm.cdf(-d2) * K * math.exp(-r * (T - t)) - norm.cdf(-d1) * x0[i]
return U
例如,
x = np.linspace(0,3,7)
U = FinalTimeAnalyticalSolution(x,2.0,0.04,0.2,2.0)
for i in range(len(x)):
print x[i]
print U[i]
给我结果
0.0, 1.84623269277
0.5, 1.34623275338
1.0, 0.847891622826
1.5, 0.404448071531
2.0, 0.139395618544
2.5, 0.0372942572641
3.0, 0.00832440115615
我一直在用期权价值计算器在线测试它,比如
http://www.danielsoper.com/fincalc/calc.aspx?id=38 我得到以下信息。
0.0, 1.834133,
0.5, 1.334133,
1.0, 0.836973,
1.5, 0.405401,
2.0, 0.15085,
2.5, 0.047112,
3.0, 0.013392,
如您所见,我的解决方案对于较小的 x 相对正确,但随着它的增加,它们变得越来越远。我真的不知道为什么。我觉得这是我代码中的一个小错误,但我现在已经卡住了一天。
提前致谢
詹姆斯
错误是d1公式中的单号:而不是
... (r - (vol**2)/2) ...
应该是
... (r + (vol**2)/2) ...
我正在尝试创建一个简单的函数来求解给定股票价值数组 x0、特定执行价格 K、无风险利率 r、波动率和到期时间 T 的看跌期权的价值. 公式在这里找到:
https://en.wikipedia.org/wiki/Black%E2%80%93Scholes_model
我认为这是一个相对简单的功能来实现,但我似乎得到了更大股票价格的错误值。这是我的代码:
def FinalTimeAnalyticalSolution(x0,K,r,vol,T):
x0 = np.array(x0)
N = len(x0) - 1
t = 0.0
U = np.empty(N+1)
U[0] = K * math.exp(-r * (T - t))
for i in range(1,N+1):
d1 = (1.0/(vol*(math.sqrt(T - t)))) * (math.log(x0[i]/K) + (r - (vol**2)/2)*(T-t))
d2 = d1 - vol * math.sqrt(T-t)
U[i] = norm.cdf(-d2) * K * math.exp(-r * (T - t)) - norm.cdf(-d1) * x0[i]
return U
例如,
x = np.linspace(0,3,7)
U = FinalTimeAnalyticalSolution(x,2.0,0.04,0.2,2.0)
for i in range(len(x)):
print x[i]
print U[i]
给我结果
0.0, 1.84623269277
0.5, 1.34623275338
1.0, 0.847891622826
1.5, 0.404448071531
2.0, 0.139395618544
2.5, 0.0372942572641
3.0, 0.00832440115615
我一直在用期权价值计算器在线测试它,比如 http://www.danielsoper.com/fincalc/calc.aspx?id=38 我得到以下信息。
0.0, 1.834133,
0.5, 1.334133,
1.0, 0.836973,
1.5, 0.405401,
2.0, 0.15085,
2.5, 0.047112,
3.0, 0.013392,
如您所见,我的解决方案对于较小的 x 相对正确,但随着它的增加,它们变得越来越远。我真的不知道为什么。我觉得这是我代码中的一个小错误,但我现在已经卡住了一天。
提前致谢 詹姆斯
错误是d1公式中的单号:而不是
... (r - (vol**2)/2) ...
应该是
... (r + (vol**2)/2) ...