股票预测算法通常涉及时间序列分析、统计学、机器学习和深度学习等多种方法。以下是经典的、常见的十大股票预测算法及其Python实现。这些算法各有优势,可以用于不同的市场预测场景。以下代码实现中,我们将使用yfinance
下载数据,并展示各算法的基本使用方法。
1. 移动平均线(Moving Average, MA)
移动平均线是一种常见的时间序列分析方法,它能够平滑数据波动,反映趋势。
import pandas as pd
import matplotlib.pyplot as plt
import yfinance as yf
# 下载数据
data = yf.download("AAPL", start="2023-01-01", end="2023-10-01")
data['MA_20'] = data['Close'].rolling(window=20).mean()
data['MA_50'] = data['Close'].rolling(window=50).mean()
# 绘图
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['MA_20'], label='20-Day MA', color='orange')
plt.plot(data['MA_50'], label='50-Day MA', color='green')
plt.title('Moving Average (MA) - Apple Stock')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
2. 指数平滑移动平均(Exponential Moving Average, EMA)
指数平滑移动平均(EMA)比普通移动平均线更加灵敏,可以更好地跟随趋势。
data['EMA_20'] = data['Close'].ewm(span=20, adjust=False).mean()
# 绘图
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['EMA_20'], label='20-Day EMA', color='purple')
plt.title('Exponential Moving Average (EMA) - Apple Stock')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
3. 相对强弱指数(Relative Strength Index, RSI)
相对强弱指数(RSI)是一种衡量股票内部相对强弱的指标,用于判断超买和超卖情况。
import talib
data['RSI_14'] = talib.RSI(data['Close'], timeperiod=14)
# 绘图
plt.figure(figsize=(14, 5))
plt.plot(data['RSI_14'], label='14-Day RSI', color='red')
plt.axhline(70, linestyle='--', color='gray')
plt.axhline(30, linestyle='--', color='gray')
plt.title('Relative Strength Index (RSI) - Apple Stock')
plt.xlabel('Date')
plt.ylabel('RSI Value')
plt.legend()
plt.show()
4. 支持向量机(Support Vector Machine, SVM)
SVM 是一种常见的机器学习分类算法,可以用来预测股票的涨跌。
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 创建特征数据
data['Return'] = data['Close'].pct_change()
data['Direction'] = np.where(data['Return'] > 0, 1, 0)
data.dropna(inplace=True)
# 定义特征和标签
X = data[['Close', 'Volume']]
y = data['Direction']
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练 SVM 模型
svm_model = SVC(kernel='linear')
svm_model.fit(X_train, y_train)
# 预测结果
predictions = svm_model.predict(X_test)
print(f'SVM 准确率: {svm_model.score(X_test, y_test) * 100:.2f}%')
5. 随机森林(Random Forest)
随机森林是一种集成学习算法,适用于非线性数据建模。它可以有效地处理分类和回归问题。
from sklearn.ensemble import RandomForestClassifier
# 定义特征和标签
X = data[['Close', 'Volume']]
y = data['Direction']
# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 训练随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
rf_model.fit(X_train, y_train)
# 预测结果
predictions = rf_model.predict(X_test)
print(f'随机森林准确率: {rf_model.score(X_test, y_test) * 100:.2f}%')
6. 长短期记忆网络(Long Short-Term Memory, LSTM)
LSTM 是一种用于时间序列数据的深度学习模型,可以有效捕捉数据中的长期依赖性。
import tensorflow as tf
from sklearn.preprocessing import MinMaxScaler
# 数据归一化
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data['Close'].values.reshape(-1, 1))
# 创建训练和测试数据集
train_data = scaled_data[:int(len(scaled_data) * 0.8)]
test_data = scaled_data[int(len(scaled_data) * 0.8):]
# 创建数据集函数
def create_dataset(data, time_step=1):
X, y = [], []
for i in range(len(data) - time_step - 1):
X.append(data[i:(i + time_step), 0])
y.append(data[i + time_step, 0])
return np.array(X), np.array(y)
time_step = 60
X_train, y_train = create_dataset(train_data, time_step)
X_test, y_test = create_dataset(test_data, time_step)
# 调整输入数据维度为 LSTM 输入
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)
# 创建 LSTM 模型
model = tf.keras.Sequential([
tf.keras.layers.LSTM(50, return_sequences=True, input_shape=(time_step, 1)),
tf.keras.layers.LSTM(50, return_sequences=False),
tf.keras.layers.Dense(25),
tf.keras.layers.Dense(1)
])
# 编译和训练模型
model.compile(optimizer='adam', loss='mean_squared_error')
model.fit(X_train, y_train, batch_size=1, epochs=1)
# 预测
predictions = model.predict(X_test)
predictions = scaler.inverse_transform(predictions)
# 绘图
plt.figure(figsize=(14, 7))
plt.plot(scaler.inverse_transform(scaled_data), label='True Price')
plt.plot(range(len(train_data) + time_step + 1, len(scaled_data) - 1), predictions, label='LSTM Predictions', color='orange')
plt.title('LSTM Stock Price Prediction')
plt.xlabel('Time')
plt.ylabel('Price')
plt.legend()
plt.show()
7. ARIMA(自回归积分滑动平均模型)
ARIMA 模型是一种时间序列预测方法,常用于预测股价的未来趋势。
from statsmodels.tsa.arima.model import ARIMA
# 训练 ARIMA 模型
arima_model = ARIMA(data['Close'], order=(5, 1, 0))
arima_result = arima_model.fit()
# 预测未来趋势
forecast = arima_result.forecast(steps=30)
# 绘图
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='Close Price')
plt.plot(forecast, label='ARIMA Forecast', color='orange')
plt.title('ARIMA Stock Price Forecast')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
8. Prophetic Time Series Forecasting
Prophet 是由 Facebook 开发的时间序列预测工具,可以轻松处理趋势、季节性和节假日效应。
from fbprophet import Prophet
# 准备数据
prophet_data = data.reset_index()[['Date', 'Close']]
prophet_data.columns = ['ds', 'y']
# 创建模型并训练
prophet_model = Prophet()
prophet_model.fit(prophet_data)
# 预测未来趋势
future = prophet_model.make_future_dataframe(periods=30)
forecast = prophet_model.predict(future)
# 绘图
prophet_model.plot(forecast)
plt.title('Prophet Stock Price Forecast')
plt.xlabel('Date')
plt.ylabel('Price')
plt.show()
//python 因为爱,所以学
print("Hello, Python!")
关注我,不迷路,共学习,同进步
关注我,不迷路,共学习,同进步