作者:老余捞鱼
原创不易,转载请标明出处及原作者。
写在前面的话:在股票投资的世界里,大家肯定都想知道股票未来价格会怎样变化。今天我就给大家分享两种超厉害的预测方法,分别是引导法(Bootstrapping)和历史模拟法,学会了你也能像投资高手一样分析股票走势!
一、引导法
引导法(Bootstrapping Simulation)其实就是一种统计技术。打个比方,你有一堆历史数据,就像有一盒彩色弹珠,
引导法就是每次从这盒弹珠里拿一颗,拿完再放回去,然后再拿,重复很多次,每次拿的过程就是一次 “重新采样”。这样反复操作,就能创造出好多模拟样本。
通过这些模拟样本,咱们就能估算出像股票平均收益率这类统计数据的分布情况。要是你想知道股票平均收益率在未来可能的变化范围,引导法就能派上用场啦!
引导法具体是怎么操作的呢?下图是工作流程:
- 原始样本:先确定原始数据集,这就好比是咱们的 “弹珠盒”,里面装着股票的历史数据。
- 重新采样:从原始数据里随机抽取数据,而且每次抽完都放回去,这样每个数据都有可能被多次抽到,也可能一次都抽不到。
- 统计计算:每次重新采样后,都要计算像平均值、中位数这些统计量。
- 重复操作:把重新采样和计算统计量的过程重复很多次,一般用字母 B 表示重复次数,重复完就能得到统计量的分布。
- 估算:根据这个分布,咱们就能估算出统计量的一些属性,比如平均值、标准误差和置信区间。
在预测股票价格时,引导法模拟的步骤是这样的:
- 计算每日收益:算出股票每天的收益,公式是(当天股价 - 前一天股价)÷ 前一天股价。
- 重新抽样回报:对每日收益进行随机抽样,抽样时每次抽完都放回去,这样能生成未来 n 天的模拟收益序列。
- 价格路径模拟:把抽样得到的收益率相乘,就能模拟出股票价格的走势。比如,今天收益率是 1.02,明天是 1.03,那两天后的模拟股价就是初始股价 ×1.02×1.03 。
- 多次模拟:把上面的过程重复 B 次,就能得到好多模拟的最终价格,这些价格的分布能让咱们了解股价可能的变化范围。
引导法在金融领域用处可大了!能帮我们估计未来股票价格的置信区间,评估投资的风险和回报,还能根据历史数据模拟各种未来情况,方便咱们进行情景分析,优化投资组合。
二、历史模拟法
历史模拟法(Historical Simulation)它和引导法有点不一样。引导法重新采样时是有放回的,而历史模拟法是没有放回的。就好像你洗牌一样,把实际的历史回报率打乱顺序,用这些打乱后的回报率来创造未来可能的价格走势。
历史模拟法基于一个假设,就是股票过去的价格走势能帮咱们预测未来的走势。因为它用的是实际的历史回报,所以能保留数据的自然特征和分布,对捕捉股票的历史模式和波动性很有帮助。
历史模拟法的操作步骤如下:
- 原始样本:从股票的历史回报数据开始。
- 洗牌:把历史回报数据随机打乱顺序,生成新的回报序列。
- 价格路径模拟:用打乱后的回报序列,通过累积乘积计算出未来一段时间内股票的价格走势。
- 重复:把洗牌和计算价格路径的过程重复多次,就能得到模拟最终价格的分布。
上图为历史模拟,每一帧都将原始历史回报与洗牌回报进行比较,然后显示由此产生的模拟价格路径。实际的回报率分布得以保留,但会产生潜在的未来情景。
三、代码实现
为了让大家更清楚怎么操作,下面讲讲用 Python 实现的过程。我们可以用 yfinance 库来获取股票价格数据,代码如下:
import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
def get_stock_data(ticker, start_date, end_date):
stock_data = yf.download(ticker, start=start_date, end=end_date)
return stock_data['Close']
这段代码的作用就是获取指定股票在特定日期范围内的收盘价。
接下来是引导模拟和历史模拟的实现代码:
def bootstrap_simulation(data, days, n_iterations=10000):
daily_returns = data.pct_change().dropna()
simulations = np.zeros((n_iterations, days))
for i in range(n_iterations):
sample = np.random.choice(daily_returns, size=days, replace=True)
simulations[i] = np.cumprod(1 + sample) * data.iloc[-1]
return simulations
def historical_simulation(data, days, n_iterations=10000):
daily_returns = data.pct_change().dropna()
simulations = np.zeros((n_iterations, days))
for i in range(n_iterations):
shuffled_returns = np.random.permutation(daily_returns)
sample = shuffled_returns[:days]
simulations[i] = np.cumprod(1 + sample) * data.iloc[-1]
return simulations
运行完模拟后就有了好多模拟的最终价格。这时候来计算股价低于、介于或高于特定阈值的概率。计算概率的代码如下:
def calculate_probabilities(simulations, thresholds):
final_prices = simulations[:, -1]
below = np.mean(final_prices < thresholds[0])
above = np.mean(final_prices > thresholds[1])
between = np.mean((final_prices >= thresholds[0]) & (final_prices <= thresholds[1]))
return {'below': below, 'between': between, 'above': above}
我们还能把模拟最终价格的分布画出来,这样更直观,代码如下:
def plot_distributions(bootstrap_simulations, historical_simulations, data, thresholds, bootstrap_probabilities, historical_probabilities):
final_bootstrap_prices = bootstrap_simulations[:, -1]
final_historical_prices = historical_simulations[:, -1]
mean_bootstrap_price = np.mean(final_bootstrap_prices)
median_bootstrap_price = np.median(final_bootstrap_prices)
ci_68_bootstrap = np.percentile(final_bootstrap_prices, [16, 84])
ci_95_bootstrap = np.percentile(final_bootstrap_prices, [2.5, 97.5])
#篇幅所限,非完整代码。。。
axs[1].text(0.02, 0.95, textstr, transform=axs[1].transAxes, fontsize=12,
verticalalignment='top', bbox=dict(facecolor='white', alpha=0.5))
plt.tight_layout()
plt.show()
上图为引导法和历史模拟法的分布比较: 左图显示的是使用自引导法模拟的最终价格分布,右图显示的是使用历史模拟法模拟的最终价格分布。
最后,还可以把历史股票价格和模拟价格锥一起画出来,代码如下:
def plot_price_with_cones(data, bootstrap_percentiles, historical_percentiles, days, thresholds, bootstrap_probabilities, historical_probabilities):
plt.figure(figsize=(12, 16))
plt.subplot(2, 1, 1)
plt.plot(data.index, data, label='Historical Prices')
last_date = data.index[-1]
#篇幅所限,非完整代码。。。
plt.title('Historical Simulation Cone')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend(loc='upper left')
plt.tight_layout()
plt.show()
下面这张图是股价预测的引导模拟锥形图与历史模拟锥形图的比较:
上面的一张图展示的是基于引导法的模拟预测范围图。下面的一张图展示的是基于历史数据的模拟预测范围图。两张图都重点标注了未来股价的预测区间,包括 68% 和 95% 的可信区间,同时还预测了到 2024 年中期股价的三种可能性:低于 850 美元、介于 850 美元到 1000 美元之间,以及高于 1000 美元的概率。
以上的源代码请在我的Google Colab中申请下载,内附中文构建说明。
如觉得对您有所帮助,请留言或者私信向我要完整源代码,同时请我喝杯咖啡就好。
四、观点总结
本文主要介绍了引导法(Bootstrapping)和历史模拟法在金融预测中预测股票价格走势的应用,通过这两种方法,投资者可以估算股价变化概率,为投资决策提供参考。
- 引导法:一种统计技术,从原始数据集中有放回地重新采样,生成模拟样本,进而估算统计量分布,可用于预测股价走势,在金融领域应用广泛,如估计股价置信区间、评估投资风险和回报等。
- 历史模拟法:与引导法不同,它对历史回报率无放回地洗牌,基于股票过去价格走势能预测未来走势的假设,保留数据特征,用于模拟未来价格走势。
- Python 实现:利用 yfinance 库获取股票数据,通过编写函数实现引导模拟和历史模拟,计算模拟最终价格的概率分布,并绘制相关图表进行分析。
感谢您阅读到最后,希望这篇文章为您带来了新的启发和实用的知识!如果觉得有帮助,请不吝点赞和分享,您的支持是我持续创作的动力。祝您投资顺利,收益长虹!如果对文中内容有任何疑问,欢迎留言,我会尽快回复!
本文内容仅限技术探讨和学习,不构成任何投资建议。