作者:老余捞鱼
原创不易,转载请标明出处及原作者。
写在前面的话:本文主要探讨如何利用高斯隐马尔可夫模型(HMM)预测股票价格,我们将分步进行说明:包括数据准备、特征选择、训练 HMM 模型、最后通过实际案例展示如何使用Python中的hmmlearn
库来构建和训练一个高斯HMM,并用该模型对2024年特斯拉股票的价格走势进行了解析。
一、什么是隐马尔可夫模型?
隐马尔可夫模型(Hidden Markov Model)是一种统计模型,用于描述一个由马尔可夫过程支配的系统,该过程具有隐藏(未观察到的)状态。其核心思想是通过观测到的一系列数据(观测序列),来推断出背后的状态序列。目前,隐马尔可夫模型在自然语言处理、语音识别、生物信息学等领域有着广泛的应用。
而在股价预测方面,隐马尔可夫模型允许我们对影响可观测股价走势的潜在市场条件进行建模。每个隐藏状态代表一种市场机制(如牛市、熊市或中性),而可观测变量则来自具体股票的股价走势。
该模型在股价预测领域由三个主要部分组成:
- 隐藏状态:这代表了无法观察到的市场状态(如看涨、看跌)。
- 过渡概率:市场制度之间的转换概率。
- 排放概率:在特定市场制度下观察特定股票价格变动的概率。
特斯拉股票是市场上备受欢迎且波动较大的股票之一,因此成为预测模型的一个有趣选择。投资者常常寻求预测股价走势的方法,以便做出明智的决策,尤其是对于像特斯拉这样高动态的股票。隐马尔可夫模型(HMM)提供了一种概率方法,可以对具有隐藏状态的时间序列数据进行建模,通过识别潜在的市场机制或趋势,使其成为预测股价趋势的合适工具。
二、 HMM 模型在特斯拉股票中的应用
在本次研究中,我们运用高斯隐马尔可夫模型,对2024年1月至11月8日特斯拉股价的波动模式进行了深入挖掘,从而发现隐藏的波动状态。特别是在埃隆·马斯克在激烈的美国大选政治角逐中明确立场,这无疑可能使得特斯拉股票成为市场情绪波动的受益者,这种在年初几乎不可预测的变量,会让我们的尝试变得非常有意思。
为了精确捕捉股价的波动性,我们计算每日价格变化以捕捉波动,而不受绝对价格水平的影响,这样的数据处理为HMM模型提供了绝佳的输入数据。基于假设特斯拉股价走势能够自然地被划分为几种不同的波动机制,我们将模型设定为拥有三个隐藏状态,以描绘这些潜在的波动模式。代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.dates as mdates
from hmmlearn import hmm
import yfinance as yf# Load historical Tesla data
df = yf.download('TSLA', start="2024-01-01", end="2024-11-08")
# Calculate daily price changes
df['price_change'] = df['Close'].diff().fillna(0)# Prepare the data for the HMM
X = df[['price_change']].values# Build a Gaussian HMM
model = hmm.GaussianHMM(n_components=10, covariance_type="diag", n_iter=1000)
model.fit(X)# Predict the hidden states (volatility regimes)
hidden_states = model.predict(X)# Plot the results
plt.figure(figsize=(15, 6))
plt.plot(df.index, df['Close'], label='Tesla Close Price')
for i in range(3):mask = (hidden_states == i)plt.scatter(df.index[mask], df['Close'][mask], label=f'State {i}', s=10)# Set the x-axis to display months
plt.gca().xaxis.set_major_locator(mdates.MonthLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))
plt.xticks(rotation=45)plt.legend()
plt.title('Tesla Close Price vs HMM States')
plt.grid(True)
plt.tight_layout()
plt.show()
输出结果如下图:
在根据不同的隐藏状态对股价进行细分后,我们尝试使用各种状态来预测股价,以确定哪种状态能紧跟实际趋势。进行代码输出:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from hmmlearn import hmm
import yfinance as yf
from sklearn.preprocessing import StandardScaler
import matplotlib.dates as mdates# Step 1: Fetch Reliance stock data from yfinance
symbol = "TSLA"
data = yf.download(symbol, start="2024-01-01", end="2024-11-08")
data['price_change'] = data['Close'].diff().fillna(0)# Step 2: Standardize the price change data to avoid large values
scaler = StandardScaler()
X_scaled = scaler.fit_transform(data[['price_change']])# Step 3: Helper function to train GHMM and predict
def run_ghmm(X, n_hidden_states):model = hmm.GaussianHMM(n_components=n_hidden_states, covariance_type="diag", n_iter=100)model.fit(X)# Predict the hidden stateshidden_states = model.predict(X)# Generate predicted changes based on the hidden statespredicted_changes = model.sample(len(X))[0]# Rescale the predicted changes back to the original scalepredicted_changes_rescaled = scaler.inverse_transform(predicted_changes)# Calculate the predicted prices by applying the predicted changes to the initial pricepredicted_prices = [data['Close'].iloc[0]] # Start with the first actual pricefor change in predicted_changes_rescaled:predicted_prices.append(predicted_prices[-1] + change[0])return hidden_states, predicted_prices[:-1], model# Step 4: Plotting function to visualize actual vs predicted pricesdef plot_predictions(n_hidden_states, predicted_prices):plt.figure(figsize=(12, 6))plt.plot(data.index, data['Close'], label='Actual Prices', color='blue')plt.plot(data.index, predicted_prices, label=f'Predicted Prices (Hidden States={n_hidden_states})', color='red')plt.title(f'Tesla Stock Prediction with {n_hidden_states} Hidden States')plt.xlabel('Date')plt.ylabel('Price (USD)')# Set the x-axis to display monthsplt.gca().xaxis.set_major_locator(mdates.MonthLocator())plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m'))plt.xticks(rotation=45) # Rotate for readabilityplt.legend()plt.grid(True)plt.tight_layout() plt.show()# Step 5: Run the GHMM with different numbers of hidden states (3, 4, 5, 6)
for n_states in [3, 4, 5, 6]:hidden_states, predicted_prices, model = run_ghmm(X_scaled, n_states)plot_predictions(n_states, predicted_prices)
隐藏状态 3 的结果:
隐藏状态 4 的结果:
隐藏状态 5 的结果:
隐藏状态 6 的结果:
根据结果并结合特斯拉股票的实际走势分析,隐藏状态 6 似乎模拟出了从 1 月到 7 月中旬的趋势。另一方面,状态 4 模拟出了从 7 月中旬到 8 月中旬左右的趋势。因此,根据测试的状态,状态 4 和状态 6 的表现还不错,但都需要进行进一步的微调。
三、观点总结
总而言之,尽管我们在本文中对高斯隐马尔可夫模型的应用为洞察特斯拉股价的波动提供了一种有力的工具。但必须承认,面对特斯拉这样波动性极强的股票,任何模型都可能难以完全捕捉其复杂多变的市场趋势。模型的局限性提醒我们,在解读和利用这些分析结果时,应保持谨慎,并结合其他市场信息和专业判断。
我在前面也写过一篇结合运用两个指标(CPR+SMA 和 STD 过滤)的特斯拉交易策略,有兴趣的朋友可以读一读:《独家!特斯拉股票的专属交易策略》
- 隐马尔可夫模型是一种适合预测特斯拉股票价格趋势的统计模型,它通过模拟市场的隐藏状态和相应的过渡概率来捕捉股价变动的内在规律。
- 特斯拉股票的高波动性使其成为研究和预测的有趣案例,尤其是在政治事件如美国大选等可能影响市场情绪的背景下。
- 通过Python编程和
hmmlearn
库的实际应用,本文展示了如何实现HMM模型的数据准备、特征选择、模型训练和预测股票走势。 - 模型的预测结果表明,虽然在某些时间段内模型能够较好地预测股价走势,但整体上仍有改进的空间,特别是在调整隐藏状态数量和微调模型参数方面。
感谢您阅读到最后,希望本文能给您带来新的收获。祝您投资顺利!如果对文中的内容有任何疑问,请给我留言,必复。
本文内容仅仅是技术探讨和学习,并不构成任何投资建议。