好用的股票预测八大算法的Python实现

股票预测算法通常涉及时间序列分析、统计学、机器学习和深度学习等多种方法。以下是经典的、常见的十大股票预测算法及其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!")

关注我,不迷路,共学习,同进步

关注我,不迷路,共学习,同进步

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百锦再@新空间代码工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值