python量化金融编程从入门到精通(Python量化金融statmodels库的Autoregressions线性模型)
因为要做个集成学习框架下的股指期货价格预测模型,其中涉及跟传统线性模型的横向比较,这个东西因为比较久远完全忘了,而且一直以来用Matlab做模型,这一帖权当学习statsmodels库和时序线性模型。
statmodels是用于统计和计量经济的Python库,涵盖的模型经济系金融系都要学习,一般用stata或Matlab做这些模型,其实不好用上面俩,当时一开始就上PY就好了。该库提供了用于估计许多不同统计模型的类和函数,以及用于执行统计测试和统计数据探索。每个估计器都提供广泛的结果统计信息列表。
stats最初是由Jonathan Taylor编写,一开始它是scipy的一部分,后统计模型被修正、测试、改进并作为一个新包发布。 根据维护团队的介绍,该库的大多数结果已经用至少一个其他统计包,比如R、Stata或SAS进行验证,也反映了团队的严谨和该库方法的稳健性。
我们的预测研究工作是打算用EEMD分解产生的特征、日内1分钟计算的每日自适应Hurst指数、各类技术指标、金融市场指标和宏观经济指标作为特征,塞进各种神经网络然后对沪深300、中证500股指期货的主力连续合约做滚动预测。我们用AR模型作为我们研究项目的横向对比模型,因为之前没在PY上搞过,所以现在学习一下在Python怎么做AR模型。
1 导入需要用到的库
statmodels提供的案例是做月度房价预测,我们改为对IC300连续价格指数的预测。
# -*- coding: utf-8 -*-
"""
Created on Fri Feb 4 00:21:00 2022
@author: kateg
"""
from JQdatasdk import *
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import pandas_datareader as pdr
import seaborn as sns
from statsmodels.tsa.api import acf, graphics, pacf
from statsmodels.tsa.ar_model import AutoReg, ar_select_order
'''
statsmodels的原版案例是月度房价
data = pdr.get_data_fred("HOUSTNSA", "1959-01-01", "2019-06-01")
housing = data.HOUSTNSA.pct_change().dropna()
# Scale by 100 to get percentages
housing = 100 * housing.asfreq("MS")
fig, ax = plt.subplots()
ax = housing.plot(ax=ax)
'''
2 图片格式设定
这里把图片格式统一设定一些,免得后面作图每个调整
#### 这个案例说明传统线性时序模型对股指期货价格预测
# In[1 图片格式设置]
sns.set_style("darkgrid")
pd.plotting.register_matplotlib_converters()
# 图片大小设置
sns.mpl.rc("figure", figsize=(16, 6))
sns.mpl.rc("font", size=14)
3 从JQ中提取数据
我们使用JQ的数据接口提取数据,事先需要先装好jqdatasdk,使用pip 工具在控制台或anaconda控制台安装即可。
# In[2 提取数据]
auth('****', '****')
start_date = '2019-1-4'
end_date = '2021-12-31'
data = get_price(['IF8888.CCFX'],start_date, end_date, frequency='60m', panel=False)
price = data['close']
price.index = data.time
fig, ax = plt.subplots()
ax = price.plot(ax=ax)
数据特征
4 建立模型
这里就是做AR模型,库给了个函数AutoReg()可以设定滞后期数。ARMA类模型的本质是撒一把滞后项和误差项,然后用加和的线性形式去模拟时序的历史过程,如果序列是非平稳,则加做差分,差分做到平稳为止。这类模型对数据设定了严格的假设,这样看这类模型对价格的预测肯定不靠谱,但似乎可以作为基准模型做横向比较用,还有均值预测等。如果新的预测模型连这类线性模型还不如,那么搞出来的就更没意思了。
# In[建立模型]
# 做AR模型
mod = AutoReg(price, 3, old_names=False)
res = mod.fit()
res.summary()
# covariance estimators as OLS
res = mod.fit(cov_type = 'HC0')
res.summary()
# 使用多滞后项
sel = ar_select_order(price, 10, old_names=False)
sel.ar_lags
res = sel.model.fit()
res.summary()
# 可视化外推预测
fig = res.plot_predict(start = , end = )
# 利用图像健侧数据特征
fig = plt.figure(figsize=(16, 9))
fig = res.plot_diagnostics(fig = fig, lags =30)
# 季节哑变量
#sel = ar_select_order(price, 10,seasonal=True, old_names=False)
#sel.ar_lags
#res = sel.model.fit()
#res.summary()
5 静态预测
# In[静态预测]
# 这里用bic判断滞后项的效果
sel = ar_select_order(price, 10, 'bic', old_names=False)
sel.ar_lags
res = sel.model.fit() # 最终只有滞后二阶有用
res.summary()
# 用plot_predict()做预测,可以给出预测值和置信区间
price.shape
fig = res.plot_predict(start = 2908, end = 2920)
# 用不同滞后项做预测,都放在一个图上
res_ar3 = AutoReg(price, 3, old_names=False).fit()
res_ar10 = AutoReg(price, 10, trend='c', old_names=False).fit()
predictions = pd.DataFrame({
"AR(3)":res_ar3.predict(start = 2908, end = 2920),
"AR(2)":res.predict(start = 2908, end = 2920),
"AR(10)": res_ar10.predict(start = 2908, end = 2920)})
_, ax = plt.subplots()
ax = predictions.plot(ax=ax)
,
免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com