基于ARIMA模型的股价预测方法实践

ARIMA模型全称自回归移动平均模型,是一种经典的时间序列预测模型。该模型是由自回归、差分和移动平均三部分组成。建立ARIMA模型需要对时间序列进行平稳性检验,对于非平稳时间序列可以进行差分处理。

对于ARIMA模型关注的是order参数,以下通过两种方式获取order最优参数,一种是通过pmdarima自动获取最优order参数,另一种是通过网格搜索最优order参数。

1、使用pmdarima模型获取ARIMA模型的最优参数方法如下:

import pmdarima as pm
auto_model = pm.auto_arima(train_data, seasonal=False)
print(auto_model.order) 

2、使用网格搜索最优order参数

from sklearn.model_selection import GridSearchCV
p_values = range(0, 5)
q_values = range(0, 5)
d_values = range(0, 3)

#计算AIC最小值
param_grid = dict(order=[(p, d, q) for p in p_values for d in d_values for q in q_values])
results = []
for order in param_grid['order']:
    try:
        model = ARIMA(train_data['Close'], order=order)
        aic = model.fit().aic
        results.append({'order': order, 'aic': aic})
    except:
        continue

# 打印结果
print(results)

# 获取最优模型参数,并使用其预测测试数据
best_order = sorted(results, key=lambda x: x['aic'])[0]['order']

print('Best ARIMA parameter:', best_order)

完整代码如下:

import numpy as np
import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

# 15分钟K线数据读取
df = pd.read_csv('./stock_k_data/sh600004.csv')

# 数据预处理
df.interpolate(method='linear', inplace=True)
df.columns = ['Time', 'Open', 'High', 'Low', 'Close', 'Volumn']

# 取收盘价格为测试数据
data = df['Close']

##基于log数据
data = np.log(df['Close']).diff().dropna()

# 切割数据为训练和测试集
test_len = 30
train_data = data[-5*test_len:-test_len]
test_data = data[-test_len:]

#最优p, d, q参数获取
#方法一、使用pmdarima模型自动获取
import pmdarima as pm
auto_model = pm.auto_arima(train_data, seasonal=False)
print(auto_model.order) 

##方法二、采用最优网格搜索
from sklearn.model_selection import GridSearchCV
p_values = range(0, 5)
q_values = range(0, 5)
d_values = range(0, 3)

#计算AIC最小值
param_grid = dict(order=[(p, d, q) for p in p_values for d in d_values for q in q_values])
results = []
for order in param_grid['order']:
    try:
        model = ARIMA(train_data['Close'], order=order)
        aic = model.fit().aic
        results.append({'order': order, 'aic': aic})
    except:
        continue

# 打印结果
print(results)

# 获取最优模型参数,并使用其预测测试数据
best_order = sorted(results, key=lambda x: x['aic'])[0]['order']

print('Best ARIMA parameter:', best_order)

# 使用训练好的模型进行预测
model = ARIMA(train_data, order=auto_model.order)
results_ARIMA = model.fit()
print('aic:{:.2f}'.format(results_ARIMA.aic))
forecast = results_ARIMA.forecast(steps=test_len)

# 绘制预测结果
plt.plot(train_data.values)
plt.plot(np.arange(len(train_data), len(train_data) + 30), forecast, 'r')
plt.plot(np.arange(len(train_data), len(train_data)+30), test_data, 'b')
plt.show()

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值