非对称二叉树模型下未来股价的期望与方差计算及Python实现求助
非对称二叉树股价模型求解
解析解推导
设初始股价为S₀,单交易日上涨乘子为u=1.05,对应概率p=0.6;下跌乘子为d=1/1.05,对应概率q=0.4,第n个交易日的股价记为Sₙ。
期望计算
Sₙ可表示为Sₙ = S₀ * u^k * d^(n-k),其中k服从二项分布B(n,p),代表n天内上涨的天数。根据期望的乘积性质:
E[Sₙ] = S₀ * (pu + qd)^n
代入n=100,计算得单次交易的期望乘子为0.6*1.05 + 0.4/1.05 ≈ 1.01095,因此:
E[S₁₀₀] ≈ S₀ * 1.01095^100 ≈ 2.957S₀
方差计算
根据方差公式Var(Sₙ) = E[Sₙ²] - (E[Sₙ])²,先计算平方的期望:
E[Sₙ²] = S₀² * (pu² + qd²)^n
代入参数得单次平方期望乘子为0.6*1.05² + 0.4*(1/1.05)² ≈ 1.0243,因此:
E[S₁₀₀²] ≈ S₀² * 1.0243^100 ≈ 11.02*S₀²
最终方差为:
Var(S₁₀₀) ≈ 11.02S₀² - (2.957S₀)² ≈ 2.276*S₀²
如果取初始股价S₀=1,则第100天期望约为2.96,方差约为2.28。
Python实现
Python没有内置专门处理此类二叉树股价模型的标准模块,但实现逻辑非常简单,仅需numpy即可完成解析解计算、蒙特卡洛模拟验证以及二叉树遍历功能,代码如下:
import numpy as np # 模型基础参数 U = 1.05 D = 1 / U P_UP = 0.6 P_DOWN = 1 - P_UP TRADING_DAYS = 100 INITIAL_PRICE = 1 # 可根据实际需求修改初始股价 # 1. 解析解计算 single_expected = P_UP * U + P_DOWN * D expected_100d = INITIAL_PRICE * (single_expected) ** TRADING_DAYS single_sq_expected = P_UP * (U ** 2) + P_DOWN * (D ** 2) expected_sq_100d = (INITIAL_PRICE ** 2) * (single_sq_expected) ** TRADING_DAYS variance_100d = expected_sq_100d - expected_100d ** 2 print(f"第100天股价期望(解析解):{expected_100d:.4f}") print(f"第100天股价方差(解析解):{variance_100d:.4f}") # 2. 蒙特卡洛模拟验证(适合大数场景,精度随模拟次数提升) SIM_TIMES = 100000 daily_returns = np.random.choice([U, D], size=(SIM_TIMES, TRADING_DAYS), p=[P_UP, P_DOWN]) sim_prices = INITIAL_PRICE * np.prod(daily_returns, axis=1) print(f"第100天股价期望(模拟值):{sim_prices.mean():.4f}") print(f"第100天股价方差(模拟值):{sim_prices.var():.4f}") # 3. 二叉树遍历实现(适合短天数场景,100天也可运行但效率低于模拟法) def calc_binomial_tree(init_price, u, d, p_up, days): node_prob = {init_price: 1.0} for _ in range(days): new_node = {} for price, prob in node_prob.items(): up_price = price * u new_node[up_price] = new_node.get(up_price, 0) + prob * p_up down_price = price * d new_node[down_price] = new_node.get(down_price, 0) + prob * (1 - p_up) node_prob = new_node exp = sum(p * prob for p, prob in node_prob.items()) var = sum((p ** 2) * prob for p, prob in node_prob.items()) - exp ** 2 return exp, var # 测试10天的二叉树计算结果,和解析解对比 exp_10d, var_10d = calc_binomial_tree(INITIAL_PRICE, U, D, P_UP, 10) print(f"第10天股价期望(二叉树遍历):{exp_10d:.4f}") print(f"第10天股价方差(二叉树遍历):{var_10d:.4f}")
内容的提问来源于stack exchange,提问作者vivian
相关产品推荐
相关产品推荐

