You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非对称二叉树模型下未来股价的期望与方差计算及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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 15:54:03