python - 在 Python 中使用二叉树计算股票期权价格
问题描述
我正在尝试计算期权的价格,下面的代码基于我在其中一个线程中找到的文本。我现在想可视化二叉树,以便在每个节点上显示以下内容:
1) 股票价格
2) 当我们从尾端回溯时的期权价格,即欧式期权的
收益 3) 提前行权的收益,即美式期权
该代码正确计算了这些值,但我在视觉上显示相同的值时遇到了挑战。我想将数组的 numpy 数组转换为 df 但我得到了奇怪的结果。
有人可以帮忙吗?
这设置了计算价格的关键参数
""" Store common attributes of a stock option """
import math
class StockOption(object):
def __init__(self, S0, K, r, T, N, params):
self.S0 = S0
self.K = K
self.r = r
self.T = T
self.N = max(1, N) # Ensure N have at least 1 time step
self.STs = None # Declare the stock prices tree
""" Optional parameters used by derived classes """
self.pu = params.get("pu", 0) # Probability of up state
self.pd = params.get("pd", 0) # Probability of down state
self.div = params.get("div", 0) # Dividend yield
self.sigma = params.get("sigma", 0) # Volatility
self.is_call = params.get("is_call", True) # Call or put
self.is_european = params.get("is_eu", True) # Eu or Am
""" Computed values """
self.dt = T/float(N) # Single time step, in years
self.df = math.exp(-(r-self.div) * self.dt) # Discount factor
这是计算所有未来股票价格然后通过回溯计算收益的练习的核心
""" Price a European or American option by the binomial tree """
from StockOption1 import StockOption
import math
import numpy as np
import pandas as pd
class BinomialTreeOption(StockOption):
def _setup_parameters_(self):
self.u = 1 + self.pu # Expected value in the up state
self.d = 1 - self.pd # Expected value in the down state
self.qu = (math.exp((self.r-self.div)*self.dt) -
self.d)/(self.u-self.d)
self.qd = 1-self.qu
def payoff(self):
self._setup_parameters_()
self.STs = [np.array([self.S0])]
for i in range(self.N):
prev_branches = self.STs[-1]
st = np.concatenate((prev_branches*self.u,
[prev_branches[-1]*self.d]))
self.STs.append(st)
## Compute payoff at the last node
payoffs = np.maximum(0, (self.STs[self.N]-self.K) if self.is_call
else (self.K-self.STs[self.N]))
for i in reversed(range(self.N)):
# The payoffs from NOT exercising the option
payoffs = (payoffs[:-1] * self.qu +
payoffs[1:] * self.qd) * self.df
# Payoffs from exercising, for American options
if not self.is_european:
early_exer_payoff = \
(self.STs[i] - self.K) if self.is_call \
else (self.K - self.STs[i])
payoffs = np.maximum(payoffs, early_exer_payoff)
return payoffs[0]
""" Price an option by the binomial CRR model """
from BinomialAmericanOption1 import BinomialTreeOption
import math
class BinomialCRROption(BinomialTreeOption):
def _setup_parameters_(self):
self.u = math.exp(self.sigma * math.sqrt(self.dt))
self.d = 1./self.u
self.qu = (math.exp((self.r-self.div)*self.dt)-
self.d)/(self.u-self.d)
self.qd = 1-self.qu
#### Option price
from StockOption1 import StockOption
from BinomialAmericanOption1 import BinomialTreeOption
from BinomialCRROption1 import BinomialCRROption
crr_amoption= BinomialCRROption(50, 60, 0.05, 4, 4,{"sigma": 0.3,
"is_call": True,
"is_eu": False})
print(crr_amoption.payoff())
解决方案
推荐阅读
- python - 在中添加字符串
python3中的数组? - flutter - 当动画状态为转发时,如何重置特定偏移量的动画?
- python - 如何改进我对德语文本的多类文本分类?
- sql - 在 Postgresql 中使用冲突忽略特定行和合并操作
- laravel - 为什么 Laravel homestead 不从视图中显示欢迎页面并显示另一个?
- javascript - 映射函数React中的条件表单元格
- r - 如果命令具有像“cmd | head”这样的管道,我如何使用 system 或 system2
- reactjs - 如何从异步存储中获取项目,在键中设置值,然后使用该值向 api 发出 axios 请求以进行响应?
- sql - 按顺序组合记录
- c# - 使用类库静态方法的 Serilog 输出