蒙特卡洛价值预测

本文介绍了蒙特卡洛价值预测,一种基于策略从经验片段学习的算法,它利用平均累积奖励而非期望值来估计值函数。方法适用于马尔可夫决策过程中的可分片段,不依赖于模型,但对无限或长链情况需用其他方法如时序差分学习补充。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

蒙特卡洛价值预测

蒙特卡洛价值估计

目标:从策略 π\piπ 下的经验片段学习 VπV^{\pi}Vπ

s0(i)→R1(i)a0(i)s1(i)→R2(i)a1(i)s2(i)→R3(i)a2(i)s3(i)⋯sT(i)∼π{s^{(i)}_{0}}\xrightarrow[R^{(i)}_{1}]{a^{(i)}_{0}}{s^{(i)}_{1}}\xrightarrow[R^{(i)}_{2}]{a^{(i)}_{1}}{s^{(i)}_{2}}\xrightarrow[R^{(i)}_{3}]{a^{(i)}_{2}}{s^{(i)}_{3}}\cdots{s^{(i)}_{T}\sim\pi}s0(i)a0(i)R1(i)s1(i)a1(i)R2(i)s2(i)a2(i)R3(i)s3(i)sT(i)π

回顾:累积奖励(return)是总折扣奖励

Gt=Rt+1+γRt+2+⋯+γT−1RTG_{t}=R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^{T-1}R_{T}Gt=Rt+1+γRt+2++γT1RT

回顾:值函数(value function)是期望累积奖励

Vπ(s)=E[R(s0)+γR(s1)+γ2R(s2)+⋯∣s0=s,π]=E[Gt∣st=s,π]≃1N∑i=1NGt(i) \begin{aligned} V^{\pi}(s) &= \mathbb{E}[R(s_{0})+\gamma R(s_{1})+\gamma^{2}R(s_{2})+\cdots|s_{0}=s,\pi] \\ &= \mathbb{E}[G_{t}|s_{t}=s,\pi] \\ &\simeq \frac{1}{N}\sum^{N}_{i=1}G^{(i)}_{t} \end{aligned} Vπ(s)=E[R(s0)+γR(s1)+γ2R(s2)+s0=s,π]=E[Gtst=s,π]N1i=1NGt(i)

  • 使用策略 π\piπ 从状态 sss 采样N个片段
  • 计算平均累计奖励

经验均值累计奖励

蒙特卡洛策略评估使用经验均值累计奖励而不是期望累计奖励

实现过程:使用策略 π\piπ 采样片段

s0(i)→R1(i)a0(i)s1(i)→R2(i)a1(i)s2(i)→R3(i)a2(i)s3(i)⋯sT(i)∼π{s^{(i)}_{0}}\xrightarrow[R^{(i)}_{1}]{a^{(i)}_{0}}{s^{(i)}_{1}}\xrightarrow[R^{(i)}_{2}]{a^{(i)}_{1}}{s^{(i)}_{2}}\xrightarrow[R^{(i)}_{3}]{a^{(i)}_{2}}{s^{(i)}_{3}}\cdots{s^{(i)}_{T}\sim\pi}s0(i)a0(i)R1(i)s1(i)a1(i)R2(i)s2(i)a2(i)R3(i)s3(i)sT(i)π

在一个片段中的每个时间步长 ttt 的状态 sss 都被访问

  • 增量计数器 N(s)←N(s)+1N(s)\leftarrow N(s)+1N(s)N(s)+1
  • 增量总累计奖励 S(s)←S(s)+GtS(s) \leftarrow S(s)+G_{t}S(s)S(s)+Gt
  • 值被估计为累计奖励的均值 V(s)=S(s)/N(s)V(s)=S(s)/N(s)V(s)=S(s)/N(s)
  • 由大数定律有

V(s)→Vπ(s)asN(s)→∞V(s)\rightarrow V^{\pi}(s) \quad as \quad N(s) \rightarrow \inftyV(s)Vπ(s)asN(s)

增量蒙特卡洛更新

每个片段结束后逐步更新 V(s)V(s)V(s)
对于每个状态 StS_{t}St 和对应累计奖励 GtG_{t}Gt

N(St)←N(St)+1N(S_{t}) \leftarrow N(S_{t})+1N(St)N(St)+1

V(St)←V(St)+1N(St)(Gt−V(St))V(S_{t}) \leftarrow V(S_{t})+\frac{1}{N(S_{t})}(G_{t}-V(S_{t}))V(St)V(St)+N(St)1(GtV(St))

对于非稳定的问题(环境会随时间发生变化),我们可以跟踪一个现阶段的平均值(不考虑过久之前的片段)

V(St)←V(St)+α(Gt−V(St))V(S_{t}) \leftarrow V(S_{t})+\alpha(G_{t}-V(S_{t}))V(St)V(St)+α(GtV(St))

⇓\Downarrow

V(St)←(1−α)V(St)+αGtV(S_{t}) \leftarrow (1-\alpha)V(S_{t})+\alpha G_{t}V(St)(1α)V(St)+αGt

思路: V(St)≃1N∑i=1NGt(i)V(S_{t}) \simeq\frac{1}{N}\sum^{N}_{i=1}{G^{(i)}_{t}}V(St)N1i=1NGt(i)

实现: V(St)←V(St)+α(Gt−V(St))V(S_{t}) \leftarrow V(S_{t})+\alpha(G_{t}-V(S_{t}))V(St)V(St)+α(GtV(St))

总结

  • 蒙特卡洛方法:直接从经验片段进行学习
  • 蒙特卡洛是模型无关的:未知马尔可夫决策过程的状态转移/奖励
  • 蒙特卡洛从完整的片段中进行学习:没有使用bootstrapping的方法
  • 蒙特卡洛采用最简单的思想:值(value)= 平均累计奖励(mean return)

只能将蒙特卡洛方法应用于可分片段的马尔可夫决策过程中
即,所有的片段都有终止状态


为什么蒙特卡洛算法只能用于可分片段的马尔可夫决策过程?

可分片段的含义是该马尔可夫决策过程长度有限,这样才能计算总折扣奖励,在实际操作中,如果遇到非常长的马尔可夫链或者无限马尔可夫链,一般使用后面的课程会提到的时序差分学习

### 使用蒙特卡洛模拟预测股票价格 为了使用蒙特卡洛模拟预测股票价格,可以遵循一系列具体步骤。这些步骤不仅涉及创建多个可能的价格路径,还涉及到对结果的深入分析。 #### 创建模拟环境 首先,需要导入必要的库并准备初始参数设置。这包括获取历史股价数据、设定时间周期以及定义每次迭代中的步数等重要变量。 ```python import numpy as np import pandas_datareader.data as web from datetime import datetime import matplotlib.pyplot as plt # 获取某只股票的历史收盘价作为输入数据源 start_date = '2022-01-01' end_date = '2023-01-01' stock_symbol = 'AAPL' # 苹果公司为例 df = web.DataReader(stock_symbol, data_source='yahoo', start=start_date, end=end_date) last_price = df['Adj Close'][-1] time_horizon_days = 30 # 预测期设为一个月即30天 trading_days_per_year = 252 # 假定每年交易日数量 mu = df['Adj Close'].pct_change().mean() * trading_days_per_year # 年化收益率期望值 sigma = df['Adj Close'].pct_change().std() * np.sqrt(trading_days_per_year) # 年化标准差/波动率 simulations = 1000 # 模拟次数 ``` #### 构建随机过程模型 接着,根据几何布朗运动理论建立随机微分方程(SDE),该SDE用来描述资产价格随时间变化的过程。对于每一天的变化量Δt而言: \[ \Delta S_t = μS_t\Delta t + σS_tdW_t \] 其中\(dW_t\)表示Wiener增量,服从正态分布N(0,\(\sqrt{\Delta t}\));μ是预期回报率;σ则是年化的波动性系数[^1]。 #### 执行多次模拟运行 然后,在上述基础上执行大量的独立试验来获得足够多样的样本轨迹。每一次新的尝试都将重新生成一组不同的随机扰动项序列w[],从而得到一条独特的未来价值演变路线图。 ```python np.random.seed(42) # 设置随机种子以便重现结果 price_paths = [] for _ in range(simulations): daily_returns = mu / trading_days_per_year + sigma * np.random.normal(size=time_horizon_days) / np.sqrt(trading_days_per_year) price_path = last_price * (1 + daily_returns).cumprod() price_paths.append(price_path) price_paths = np.array(price_paths) ``` #### 结果可视化与统计评估 最后一步是对所有产生的路径做进一步处理,比如求取最终时刻各条曲线终点位置处数值集合的均值和置信区间边界点,并将其绘制成图表形式展示出来。 ```python plt.figure(figsize=(10,6)) plt.plot(range(time_horizon_days), price_paths.T, alpha=0.1, color='blue') plt.title(f'{stock_symbol} Stock Price Monte Carlo Simulation Over Next {time_horizon_days} Days ({simulations} Simulations)') plt.xlabel('Days into Future') plt.ylabel('Stock Price ($)') plt.axhline(y=last_price, linestyle="--", label="Current Last Known Price", c="red") plt.legend() final_prices = price_paths[:, -1] mean_final_price = final_prices.mean() percentiles = np.percentile(final_prices, q=[5, 25, 50, 75, 95]) print(f"\n{time_horizon_days} 天后的平均最终价格:${mean_final_price:.2f}") print(f"可能的价格范围(5%-95%):${percentiles[0]:.2f}-${percentiles[4]:.2f}") plt.show() ``` 通过这种方式,不仅可以直观地看到各种可能发生的情况及其对应的概率密度函数形状,而且能够从中提取有用的信息辅助做出更加合理的投资判断[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值