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)

python量化金融编程从入门到精通(Python量化金融statmodels库的Autoregressions线性模型)(1)

python量化金融编程从入门到精通(Python量化金融statmodels库的Autoregressions线性模型)(2)

数据特征

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)

python量化金融编程从入门到精通(Python量化金融statmodels库的Autoregressions线性模型)(3)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页