首页 > 解决方案 > 在 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())

标签: pythonpandasnumpy

解决方案


推荐阅读