多因子混频数据抽样预测 MIDAS(Muti-Factor Mixed Data Sampling)

多元MIDAS(Muti-Factor Mixed Data Sampling)模型

模型介绍

多元MIDAS(Mixed Data Sampling)模型是一种经济计量学模型,用于处理不同频率的数据。MIDAS模型的主要特点是能够结合高频率和低频率的数据,以预测低频率的经济变量。
但开源的代码都是用的单一高频去预测低频数据,于是我做了一个多元的版本,且可以比较方便的适用于券商常用的wind、ifind等数据库直接导出来的表格。

以下是多元MIDAS模型的一些关键特点和应用:

  1. 不同频率的数据结合:MIDAS模型的主要优势是能够结合不同频率的数据,例如,可以使用日数据来预测月数据或使用月数据来预测季度数据。
  2. 灵活的参数化:MIDAS模型使用了一种特殊的权重函数,允许数据在不同的时间点有不同的影响。这种权重函数可以是线性的、指数的或其他形式的,取决于模型的具体应用。
  3. 预测能力:多元MIDAS模型在预测经济时间序列方面表现出色,特别是当高频率数据包含有关低频率变量未来走势的有用信息时。
  4. 简化的估计过程:尽管MIDAS模型结合了不同频率的数据,但其估计过程相对简单。这是因为模型将高频率数据的影响聚合到低频率的观测中,从而避免了处理大量高频率数据的复杂性。
  5. 应用广泛:MIDAS模型在宏观经济学、金融和其他领域都有应用。例如,它可以用于预测GDP、通货膨胀率、股票回报率等。
  6. 模型扩展:除了基本的MIDAS模型外,还有许多扩展版本,如非线性MIDAS、因子MIDAS等,这些模型为处理更复杂的数据结构和关系提供了更多的灵活性。

总的来说,多元MIDAS模型提供了一种有效的方法,将不同频率的数据结合起来,以预测低频率的经济变量。这种方法在处理实际经济和金融数据时特别有用,因为这些数据通常以不同的频率出现。

个人理解
MIDAS模型就是分为降频降维两个部分

  1. 降频:利用了滞后因子多项式,例如almon多项式、beta多项式、指数almon多项式等方法
  2. 降维:利用了PCA\动态因子\VAR等方法

然后多因子模型的建立就是将降频和降维的结果进行组合并使用多元线性模型进行参数估计

其中关键的点就是同时进行降维、降频、多元线性模型中的参数估计

具体的内容可以看国泰君安的《金融工程专题_MIDAS:混频数据预测通用框架

实现效果

import datetime
import numpy as np
import pandas as pd
from tqdm import tqdm

#引入写的包
from midas.mix import mix_freq3
from midas.adl import estimate3, forcast3,analyse3
from midas.weights import polynomial_weights

然后数据来源于ifind,从指标库里直接导出来,把后面那个”来源:同花顺“删了,改成csv格式就行了

#读取数据
df = pd.read_csv('../data/CPI当月同比等_20230723_220851.csv', index_col=0, parse_dates=True,encoding='gbk')
#对df进行标准化处理,注意有的地方为nan,方便后续做归因分析。
df = df.apply(lambda x: (x - np.mean(x)) / (np.max(x) - np.min(x)))#若需要得到准确的预测值,这一步需要去掉

#检查数据
df.tail(30)

在这里插入图片描述

#划分训练集与测试集

"""
df: 输入的 DataFrame 数据。第一列是低频数据、其他是高频数据。直接从ifind里面读取数据,然后把末尾的来源去掉。
xlag_list: 一个列表,表示用于预测的不同滞后。第一列一定是1,然后后面的列可以自己定义,比如第一个列为月,第二个列为日,第三个列为周,那么就是[1,21,4]
ylag: 低频数据的滞后期数。用于存在自回归现象,但是不建议开启。
test_start_position_rate: 测试数据开始的位置。如果是小数,比如0.8,那么就是从前面开始的80%作为训练集,后面的20%进行预测。如果是整数,那就是指定预测多少期低频数据。
"""
lf_data_train,lf_data_lag_train,x_train,lf_data_test,lf_data_lag_test,x_test = mix_freq3(df, xlag_list = [1,21,21,4,21],ylag = 0, test_start_position_rate = 0.8)



#参数估计
"""
lf_data: 低频数据。
x_train: 高频数据的训练集。
lf_data_lag: 低频数据的滞后值。
"""
opt_res = estimate3(lf_data_train,x_train,lf_data_lag_train)
#预测
"""
x_test: 高频数据的测试集。
lf_data_lag: 低频数据的滞后值。
opt_res: 优化结果。
"""
pre_yl = forcast3(x_test,lf_data_lag_test,opt_res,lf_data_test)
analyse3(pre_yl,lf_data_test)

在这里插入图片描述
根据趋势线,我们选择相信cpi将会在6月有一个下降的趋势

接下来我们生成滚动预测的趋势预测图

predict_res = pd.Series([])
for i in tqdm(range(1,80)):#建议设置滚动时,数量设置为为数据比较完整部分(本例为80),因为可能有的高频数据不完整,会没有预测结果
    lf_data_train,lf_data_lag_train,x_train,lf_data_test,lf_data_lag_test,x_test = mix_freq3(df, xlag_list = [1,21,21,4,21],ylag = 0, test_start_position_rate = i)
    opt_res = estimate3(lf_data_train,x_train,lf_data_lag_train)
    predict_tmp = forcast3(x_test,lf_data_lag_test,opt_res,lf_data_test)
    predict_res = predict_res.combine_first(predict_tmp)

#画出predict_res与real_res的对比图
analyse3(predict_res,df.iloc[:,0].dropna())

在这里插入图片描述
发现在21年年初,预测与现实的趋势出现了较大的背离,在知道cpi与猪肉相关性很大的情况下,我们选择画出cpi和猪肉的折线图进一步探究

df[['CPI','猪肉']].plot(figsize=(15,4), style=['o','--'])

在这里插入图片描述
可以看出确实是在21年猪肉价格和cpi的趋势出现了较大背离,
而且这种背离在历史上也是比较少见的,
所以可以认为这次猪肉价格的上涨是由于猪肉供应量的减少,
而不是由于通货膨胀导致的。

具体实现的midas包没放出来,因为是一个包,不方便上传。
要是想一起讨论具体细节和其他量化模型的朋友可以联系我v151、1750、5552

  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值