前几天在社区看到了这篇基本面量化研究:【量化课堂】基本面量化研究--钢铁行业景气度预测,在仔细研读完代码之后觉得有些地方还可以进行优化,所以就自作主张写了这篇文章,希望可以帮助到大家。感谢聚宽~
最终的复现结果分析大致与研报相同,但是对于某些指标的分析结论稍有不同,详见代码说明。
本文基于【量化课堂】基本面量化研究--钢铁行业景气度预测进行修改,详细的说明位于代码注释中,可以直接clone到自己的研究中直接运行。如果有不合理的地方还请大家多多包涵,欢迎讨论!
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import datetime
import statsmodels.api as sm
import warnings
warnings.filterwarnings("ignore")
steel_fd_data = pd.read_excel('钢铁基本面数据.xls',index_col=0)
steel_fd_data.columns.tolist()
['表观消费量:钢材:当月值', 'M2:同比', '房屋新开工面积:累计值', '房屋新开工面积:累计同比', '房屋竣工面积:累计值', '房屋竣工面积:累计同比', '固定资产投资完成额:累计值', '固定资产投资完成额:累计同比', '商品房销售面积:累计值', '商品房销售面积:累计同比', '固定资产投资完成额:基础设施建设投资:累计值', '固定资产投资完成额:基础设施建设投资:累计同比', '房地产开发投资完成额:累计值', '房地产开发投资完成额:累计同比', '产量:汽车:当月值', '产量:汽车:当月同比', '钢材价格综合指数', '钢铁行业:大中型企业:销售收入:累计值', '钢铁行业:大中型企业:利润总额:累计值']
###由于数据是wind直接下来的,所以不太干净,先预处理一下、去掉一些注释行
steel_fd_data = steel_fd_data[1:-2]
##数据钢材表观消费量为主,截断此数据开始之前的日期,此数据从2004年1月开始
steel_fd_data = steel_fd_data[steel_fd_data.index>=datetime.datetime(2004,1,1)]
# 例如这个房屋新开工面积就是一个当年累计值
steel_fd_data['房屋新开工面积:累计值'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f69922b93c8>
# 这些字段的数据需要调整为当月值
need_adjust_columns = ['房屋新开工面积:累计值','房屋竣工面积:累计值','商品房销售面积:累计值','固定资产投资完成额:累计值',
'固定资产投资完成额:基础设施建设投资:累计值','房地产开发投资完成额:累计值']
steel_fd_data['month'] = steel_fd_data.index.map(lambda x:x.month)
# 这些列都是一月份缺失数据的
# 填充规则,将二月份的数据平分给一月份
for column in need_adjust_columns:
if column != '固定资产投资完成额:基础设施建设投资:累计值':
steel_fd_data[column.split(':')[0]] = steel_fd_data[column] - steel_fd_data[column].shift(1)
steel_fd_data.ix[steel_fd_data['month']<=2,column.split(':')[0]] = steel_fd_data[steel_fd_data['month']<=2][column].fillna(method='backfill')/2
else:# 这个名称分为了三段
steel_fd_data[column.split(':')[1]] = steel_fd_data[column] - steel_fd_data[column].shift(1)
steel_fd_data.ix[steel_fd_data['month']<=2,column.split(':')[1]] = steel_fd_data[steel_fd_data['month']<=2][column].fillna(method='backfill')/2
# 将累计值转化为当月值结果对比
steel_fd_data[['房屋新开工面积:累计值','房屋新开工面积']].head(20)
房屋新开工面积:累计值 | 房屋新开工面积 | |
---|---|---|
指标名称 | ||
2004-01-31 00:00:00 | NaN | 3713.72 |
2004-02-29 00:00:00 | 7427.45 | 3713.72 |
2004-03-31 00:00:00 | 12899.5 | 5472.09 |
2004-04-30 00:00:00 | 17412.1 | 4512.52 |
2004-05-31 00:00:00 | 22495.8 | 5083.75 |
2004-06-30 00:00:00 | 28036.7 | 5540.93 |
2004-07-31 00:00:00 | 32763 | 4726.26 |
2004-08-31 00:00:00 | 36900.2 | 4137.19 |
2004-09-30 00:00:00 | 41070.3 | 4170.1 |
2004-10-31 00:00:00 | 44987.7 | 3917.37 |
2004-11-30 00:00:00 | 49015.6 | 4027.97 |
2004-12-31 00:00:00 | 60413.9 | 11398.2 |
2005-01-31 00:00:00 | NaN | 3749.05 |
2005-02-28 00:00:00 | 7498.1 | 3749.05 |
2005-03-31 00:00:00 | 14096.6 | 6598.5 |
2005-04-30 00:00:00 | 19570.9 | 5474.33 |
2005-05-31 00:00:00 | 25066 | 5495.12 |
2005-06-30 00:00:00 | 31175.2 | 6109.2 |
2005-07-31 00:00:00 | 37128.2 | 5952.96 |
2005-08-31 00:00:00 | 41714.9 | 4586.69 |
# 发现每年的年末都有有一波高峰,周期性很明显
steel_fd_data['房屋新开工面积'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f69922493c8>
steel_fd_data.columns.tolist()
['表观消费量:钢材:当月值', 'M2:同比', '房屋新开工面积:累计值', '房屋新开工面积:累计同比', '房屋竣工面积:累计值', '房屋竣工面积:累计同比', '固定资产投资完成额:累计值', '固定资产投资完成额:累计同比', '商品房销售面积:累计值', '商品房销售面积:累计同比', '固定资产投资完成额:基础设施建设投资:累计值', '固定资产投资完成额:基础设施建设投资:累计同比', '房地产开发投资完成额:累计值', '房地产开发投资完成额:累计同比', '产量:汽车:当月值', '产量:汽车:当月同比', '钢材价格综合指数', '钢铁行业:大中型企业:销售收入:累计值', '钢铁行业:大中型企业:利润总额:累计值', 'month', '房屋新开工面积', '房屋竣工面积', '商品房销售面积', '固定资产投资完成额', '基础设施建设投资', '房地产开发投资完成额']
#取出接下来需要用的主要数据
data_columns_list = steel_fd_data.columns.tolist()
clean_data = steel_fd_data[data_columns_list[:2]+data_columns_list[-6:]+['产量:汽车:当月值']]
#去除第一行
clean_data = clean_data[1:]
# 查看有无缺失值
np.sum(clean_data.isnull())
表观消费量:钢材:当月值 4 M2:同比 0 房屋新开工面积 0 房屋竣工面积 0 商品房销售面积 0 固定资产投资完成额 0 基础设施建设投资 0 房地产开发投资完成额 0 产量:汽车:当月值 8 dtype: int64
# 对于缺失数据,使用线性插值法进行填充
# 因为插值需要保证数据是数值类型的,所以第一步是检查数据格式
clean_data.dtypes
表观消费量:钢材:当月值 object M2:同比 object 房屋新开工面积 object 房屋竣工面积 object 商品房销售面积 object 固定资产投资完成额 object 基础设施建设投资 object 房地产开发投资完成额 object 产量:汽车:当月值 object dtype: object
# 转换成数值类型,然后进行线性插值
clean_data = clean_data.apply(pd.to_numeric, errors='ignore').interpolate()
# 再次检查是否填充完毕
np.sum(clean_data.isnull())
表观消费量:钢材:当月值 0 M2:同比 0 房屋新开工面积 0 房屋竣工面积 0 商品房销售面积 0 固定资产投资完成额 0 基础设施建设投资 0 房地产开发投资完成额 0 产量:汽车:当月值 0 dtype: int64
clean_data.columns.tolist()
['表观消费量:钢材:当月值', 'M2:同比', '房屋新开工面积', '房屋竣工面积', '商品房销售面积', '固定资产投资完成额', '基础设施建设投资', '房地产开发投资完成额', '产量:汽车:当月值']
# 将其中几个字段名称进行修改
clean_data.rename(columns={'表观消费量:钢材:当月值':'钢铁消费量', '产量:汽车:当月值':'汽车产量'}, inplace=True)
# 计算TTM环比
TTM_columns = ['钢铁消费量','房屋新开工面积','房屋竣工面积','商品房销售面积','固定资产投资完成额',
'基础设施建设投资','房地产开发投资完成额','汽车产量']
for column in TTM_columns:
clean_data[column+'TTM'] = pd.rolling_sum(clean_data[column],12)
clean_data[column+'TTM_环比'] = clean_data[column+'TTM']/clean_data[column+'TTM'].shift(1)-1
clean_data['钢铁消费量TTM_环比'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f69809a4f98>
clean_data.dropna(inplace=True)
clean_data['钢铁消费量TTM_环比'].plot()
<matplotlib.axes._subplots.AxesSubplot at 0x7f698097a5c0>
use_columns = [i+'TTM_环比' for i in TTM_columns]+['M2:同比']
use_data = clean_data[use_columns]
use_data.rename(columns={'M2:同比':'M2'}, inplace=True)
use_data.head()
钢铁消费量TTM_环比 | 房屋新开工面积TTM_环比 | 房屋竣工面积TTM_环比 | 商品房销售面积TTM_环比 | 固定资产投资完成额TTM_环比 | 基础设施建设投资TTM_环比 | 房地产开发投资完成额TTM_环比 | 汽车产量TTM_环比 | M2 | |
---|---|---|---|---|---|---|---|---|---|
指标名称 | |||||||||
2005-02-28 | -0.000472 | 0.000584 | 0.004978 | 0.004880 | 0.007856 | 0.009637 | 0.009591 | -0.014028 | 13.90 |
2005-03-31 | 0.013396 | 0.018623 | 0.001301 | 0.013639 | 0.017402 | 0.015259 | 0.018514 | 0.002215 | 14.00 |
2005-04-30 | 0.014007 | 0.015611 | 0.004857 | 0.002352 | 0.016376 | 0.015913 | 0.015805 | 0.011738 | 14.10 |
2005-05-31 | 0.022261 | 0.006574 | 0.007454 | 0.004619 | 0.021045 | 0.017042 | 0.015986 | 0.008005 | 14.60 |
2005-06-30 | 0.017512 | 0.009022 | 0.012890 | 0.008926 | 0.029078 | 0.023981 | 0.023294 | 0.018741 | 15.67 |
def plot_line_chart(x_axis,y1_axis,y2_axis,label1,label2):
Fig = plt.figure(figsize=(10,8))
Ax = Fig.add_subplot(111)
lines = Ax.plot(x_axis,y1_axis,'r-',x_axis,y2_axis,'b-')
lines[0].set_label(label1)
lines[1].set_label(label2)
Ax.legend(loc = 0)
def plot_line_chart_double_yaxis(x_axis,y1_axis,y2_axis,label1,label2):
Fig = plt.figure(figsize=(10,8))
Ax = Fig.add_subplot(111)
Ax.plot(x_axis,y1_axis,'r-')
Ax.set_ylabel(label1)
Ax_ = Ax.twinx()
Ax_.plot(x_axis,y2_axis,'b-')
Ax_.set_ylabel(label2)
def calculate_lag(data,column1,column2):
regre_results=[]
for i in range(-5,6):
reg_data = pd.concat([data[column1],data[column2].shift(i)],axis =1)
reg_data.dropna(inplace=True)
x=reg_data[column1]
y=reg_data[column2]
x=sm.add_constant(x)
est=sm.OLS(y,x)
results=est.fit()
r2 = results.rsquared
coef = results.params[1]
p = results.pvalues[1]
corr = reg_data[column1].corr(reg_data[column2])
regre_results.append([i,corr,coef,p,r2])
regre_df = pd.DataFrame(regre_results,columns=['领先期','相关系数','回归系数','P值','R方'])
return regre_df
use_data.columns.tolist()
['钢铁消费量TTM_环比', '房屋新开工面积TTM_环比', '房屋竣工面积TTM_环比', '商品房销售面积TTM_环比', '固定资产投资完成额TTM_环比', '基础设施建设投资TTM_环比', '房地产开发投资完成额TTM_环比', '汽车产量TTM_环比', 'M2']
表格结果分析:
房屋新开工面积TTM_环比 是 滞后指标,滞后期为1-4个月
plot_line_chart(use_data.index,use_data['房屋新开工面积TTM_环比'],use_data['钢铁消费量TTM_环比'],'房屋新开工面积TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'房屋新开工面积TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.126047 | 0.055103 | 1.268809e-01 | 0.015888 |
1 | -4 | 0.141348 | 0.062033 | 8.552678e-02 | 0.019979 |
2 | -3 | 0.173413 | 0.076744 | 3.382052e-02 | 0.030072 |
3 | -2 | 0.332663 | 0.147447 | 3.001462e-05 | 0.110665 |
4 | -1 | 0.390191 | 0.173109 | 6.719274e-07 | 0.152249 |
5 | 0 | 0.485121 | 0.215750 | 2.083811e-10 | 0.235342 |
6 | 1 | 0.503813 | 0.222825 | 3.679643e-11 | 0.253828 |
7 | 2 | 0.523003 | 0.230715 | 5.615558e-12 | 0.273532 |
8 | 3 | 0.501635 | 0.220896 | 6.190644e-11 | 0.251638 |
9 | 4 | 0.513514 | 0.225888 | 2.127479e-11 | 0.263697 |
10 | 5 | 0.495942 | 0.217580 | 1.461706e-10 | 0.245959 |
表格分析结果:
房屋竣工面积TTM_环比 与 钢铁消费量TTM_环比 相关性不大
plot_line_chart_double_yaxis(use_data.index,use_data['房屋竣工面积TTM_环比'],use_data['钢铁消费量TTM_环比'],'房屋竣工面积TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'房屋竣工面积TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.203270 | 0.102262 | 0.013218 | 0.041319 |
1 | -4 | 0.230686 | 0.116520 | 0.004648 | 0.053216 |
2 | -3 | 0.176435 | 0.089753 | 0.030790 | 0.031129 |
3 | -2 | 0.145939 | 0.074360 | 0.073773 | 0.021298 |
4 | -1 | 0.122498 | 0.062285 | 0.132720 | 0.015006 |
5 | 0 | 0.173254 | 0.088336 | 0.032219 | 0.030017 |
6 | 1 | 0.082710 | 0.041921 | 0.311042 | 0.006841 |
7 | 2 | 0.082575 | 0.041706 | 0.313460 | 0.006819 |
8 | 3 | 0.090130 | 0.045411 | 0.272701 | 0.008123 |
9 | 4 | 0.094849 | 0.047739 | 0.249887 | 0.008996 |
10 | 5 | 0.115257 | 0.057887 | 0.163039 | 0.013284 |
表格结果分析:
商品房销售面积TTM_环比 是 同步指标,无明显超前滞后期
plot_line_chart_double_yaxis(use_data.index,use_data['商品房销售面积TTM_环比'],use_data['钢铁消费量TTM_环比'],'商品房销售面积TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'商品房销售面积TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.246995 | 0.063440 | 2.475042e-03 | 0.061006 |
1 | -4 | 0.274957 | 0.070905 | 6.896373e-04 | 0.075601 |
2 | -3 | 0.321229 | 0.083616 | 6.121392e-05 | 0.103188 |
3 | -2 | 0.356137 | 0.092837 | 7.190734e-06 | 0.126834 |
4 | -1 | 0.372290 | 0.097128 | 2.324996e-06 | 0.138600 |
5 | 0 | 0.405141 | 0.105988 | 2.050294e-07 | 0.164139 |
6 | 1 | 0.327268 | 0.085116 | 3.864367e-05 | 0.107105 |
7 | 2 | 0.232753 | 0.060307 | 4.028086e-03 | 0.054174 |
8 | 3 | 0.212670 | 0.054979 | 8.979286e-03 | 0.045229 |
9 | 4 | 0.090489 | 0.023371 | 2.724178e-01 | 0.008188 |
10 | 5 | 0.045774 | 0.011790 | 5.806520e-01 | 0.002095 |
表格分析结果:
固定资产投资完成额TTM_环比 是 同步指标,无明显超前滞后期
plot_line_chart_double_yaxis(use_data.index,use_data['固定资产投资完成额TTM_环比'],use_data['钢铁消费量TTM_环比'],'固定资产投资完成额TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'固定资产投资完成额TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.386332 | 0.415637 | 1.236304e-06 | 0.149253 |
1 | -4 | 0.384985 | 0.415229 | 1.247428e-06 | 0.148213 |
2 | -3 | 0.396616 | 0.429392 | 5.046680e-07 | 0.157304 |
3 | -2 | 0.426959 | 0.459096 | 4.577798e-08 | 0.182294 |
4 | -1 | 0.442755 | 0.474280 | 1.119161e-08 | 0.196032 |
5 | 0 | 0.465429 | 0.496001 | 1.345593e-09 | 0.216624 |
6 | 1 | 0.432713 | 0.459870 | 2.585176e-08 | 0.187241 |
7 | 2 | 0.402603 | 0.426317 | 2.979895e-07 | 0.162089 |
8 | 3 | 0.359957 | 0.380237 | 6.060424e-06 | 0.129569 |
9 | 4 | 0.301622 | 0.318786 | 1.853434e-04 | 0.090976 |
10 | 5 | 0.280497 | 0.298619 | 5.542898e-04 | 0.078679 |
表格分析结果:
基础设施建设投资TTM_环比 是 超前指标,超前期为4-5个月
plot_line_chart_double_yaxis(use_data.index,use_data['基础设施建设投资TTM_环比'],use_data['钢铁消费量TTM_环比'],'基础设施建设投资TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'基础设施建设投资TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.402876 | 0.360659 | 3.845358e-07 | 0.162309 |
1 | -4 | 0.374372 | 0.336316 | 2.557383e-06 | 0.140154 |
2 | -3 | 0.358128 | 0.324786 | 6.807534e-06 | 0.128255 |
3 | -2 | 0.349846 | 0.317461 | 1.066601e-05 | 0.122392 |
4 | -1 | 0.337364 | 0.306527 | 2.135338e-05 | 0.113814 |
5 | 0 | 0.297842 | 0.271317 | 1.846651e-04 | 0.088710 |
6 | 1 | 0.242294 | 0.219652 | 2.634230e-03 | 0.058706 |
7 | 2 | 0.183528 | 0.165746 | 2.409053e-02 | 0.033682 |
8 | 3 | 0.128403 | 0.115681 | 1.173620e-01 | 0.016487 |
9 | 4 | 0.082257 | 0.074041 | 3.186160e-01 | 0.006766 |
10 | 5 | 0.009047 | 0.008148 | 9.130961e-01 | 0.000082 |
表格结果分析:
房地产开发投资完成额TTM_环比 是 滞后指标,滞后期为0-3个月
plot_line_chart_double_yaxis(use_data.index,use_data['房地产开发投资完成额TTM_环比'],use_data['钢铁消费量TTM_环比'],'房地产开发投资完成额TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'房地产开发投资完成额TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.124772 | 0.115537 | 1.307995e-01 | 0.015568 |
1 | -4 | 0.163873 | 0.152242 | 4.582558e-02 | 0.026854 |
2 | -3 | 0.218811 | 0.204373 | 7.142375e-03 | 0.047878 |
3 | -2 | 0.331466 | 0.309397 | 3.218582e-05 | 0.109870 |
4 | -1 | 0.383876 | 0.358370 | 1.049948e-06 | 0.147361 |
5 | 0 | 0.470661 | 0.439436 | 8.292250e-10 | 0.221522 |
6 | 1 | 0.478121 | 0.444093 | 4.682444e-10 | 0.228599 |
7 | 2 | 0.483024 | 0.447330 | 3.355396e-10 | 0.233312 |
8 | 3 | 0.482676 | 0.445978 | 3.973843e-10 | 0.232976 |
9 | 4 | 0.462805 | 0.427243 | 2.805053e-09 | 0.214188 |
10 | 5 | 0.488993 | 0.451863 | 2.865088e-10 | 0.239115 |
表格结果分析:
汽车产量TTM_环比 是 同步指标,略微有些落后,并且相关性很高
plot_line_chart_double_yaxis(use_data.index,use_data['汽车产量TTM_环比'],use_data['钢铁消费量TTM_环比'],'汽车产量TTM_环比','钢铁消费量TTM_环比')
calculate_lag(use_data,'汽车产量TTM_环比','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.282429 | 0.164877 | 5.054564e-04 | 0.079766 |
1 | -4 | 0.407012 | 0.238445 | 2.588688e-07 | 0.165659 |
2 | -3 | 0.478268 | 0.282551 | 6.025241e-10 | 0.228740 |
3 | -2 | 0.594436 | 0.351324 | 8.512394e-16 | 0.353354 |
4 | -1 | 0.642506 | 0.380220 | 4.565764e-19 | 0.412814 |
5 | 0 | 0.741318 | 0.440027 | 6.160130e-28 | 0.549552 |
6 | 1 | 0.708591 | 0.422751 | 1.760315e-24 | 0.502101 |
7 | 2 | 0.713119 | 0.424498 | 9.434435e-25 | 0.508538 |
8 | 3 | 0.642257 | 0.381379 | 8.151257e-19 | 0.412494 |
9 | 4 | 0.549699 | 0.326155 | 3.860028e-13 | 0.302169 |
10 | 5 | 0.471175 | 0.279036 | 1.504345e-09 | 0.222006 |
表格结果分析:
M2同比 是 超前指标,超前期为0-2个月
plot_line_chart_double_yaxis(use_data.index,use_data['M2'],use_data['钢铁消费量TTM_环比'],'M2','钢铁消费量TTM_环比')
calculate_lag(use_data,'M2','钢铁消费量TTM_环比')
领先期 | 相关系数 | 回归系数 | P值 | R方 | |
---|---|---|---|---|---|
0 | -5 | 0.608843 | 0.001176 | 2.222386e-16 | 0.370689 |
1 | -4 | 0.660688 | 0.001271 | 4.831039e-20 | 0.436509 |
2 | -3 | 0.686992 | 0.001323 | 2.840658e-22 | 0.471958 |
3 | -2 | 0.712457 | 0.001363 | 1.089249e-24 | 0.507595 |
4 | -1 | 0.720944 | 0.001370 | 1.153564e-25 | 0.519760 |
5 | 0 | 0.721544 | 0.001364 | 6.947252e-26 | 0.520626 |
6 | 1 | 0.700000 | 0.001316 | 1.078811e-23 | 0.489999 |
7 | 2 | 0.654241 | 0.001226 | 8.305599e-20 | 0.428031 |
8 | 3 | 0.593654 | 0.001111 | 1.182569e-15 | 0.352425 |
9 | 4 | 0.523507 | 0.000979 | 7.369345e-12 | 0.274060 |
10 | 5 | 0.435921 | 0.000813 | 3.063614e-08 | 0.190027 |
经过前面的一番检验:
0.房屋竣工面积TTM_环比 相关性不高
1.房屋新开工面积TTM_环比、房地产开发投资完成额TTM_环比都是钢材表观消费量的滞后指标
2.商品房销售面积TTM_环比、固定资产投资完成额TTM_环比、汽车产量TTM_环比与钢材表观消费量基本同步
3.基础设施建设投资TTM_环比、M2为领先指标,领先期分别为4-5个月,0-2个月
因此,对于钢铁表观消费量的预测,可以使用基础设施建设投资TTM_环比、M2指标
use_data.columns.tolist()
['钢铁消费量TTM_环比', '房屋新开工面积TTM_环比', '房屋竣工面积TTM_环比', '商品房销售面积TTM_环比', '固定资产投资完成额TTM_环比', '基础设施建设投资TTM_环比', '房地产开发投资完成额TTM_环比', '汽车产量TTM_环比', 'M2']
###以前一年数据作为样本进行滚动回归,得到回归系数,以此系数预测下一个月钢材表观消费量TTM环比增速
###基础设施建设投资、M2的领先期分别选为4个月、1个月
testdata = use_data[['钢铁消费量TTM_环比','基础设施建设投资TTM_环比','M2']]
def predict_TTM_growth(testdata,y_var,x_var,x_lag,regre_period = 12):
x_var_lag = []
for x,lag in zip(x_var,x_lag):
testdata[x+'_lag'+str(lag)] = testdata[x].shift(lag)
x_var_lag.append(x+'_lag'+str(lag))
use_testdata = testdata[[y_var] + x_var_lag]
use_testdata.dropna(inplace=True)
use_testdata[y_var+'_预测'] = np.NaN
corr_chart = use_testdata[x_var_lag].corr()
print (corr_chart)
for i in range(regre_period,len(use_testdata)):
train_data = use_testdata[i-regre_period:i]
y = train_data[y_var]
x = train_data[x_var_lag]
x = sm.add_constant(x)
est = sm.OLS(y,x)
results = est.fit()
predict_data = use_testdata[i:i+1]
predict_x = predict_data[x_var_lag]
predict_x = sm.add_constant(predict_x, has_constant='add')
use_testdata.iloc[i, -1] = results.predict(predict_x).values[0]
return use_testdata
predict_data = predict_TTM_growth(testdata,'钢铁消费量TTM_环比',['基础设施建设投资TTM_环比','M2'],[4,1])
基础设施建设投资TTM_环比_lag4 M2_lag1 基础设施建设投资TTM_环比_lag4 1.000000 0.525639 M2_lag1 0.525639 1.000000
predict_data.head()
钢铁消费量TTM_环比 | 基础设施建设投资TTM_环比_lag4 | M2_lag1 | 钢铁消费量TTM_环比_预测 | |
---|---|---|---|---|
指标名称 | ||||
2005-06-30 | 0.017512 | 0.009637 | 14.60 | NaN |
2005-07-31 | 0.020197 | 0.015259 | 15.67 | NaN |
2005-08-31 | 0.022381 | 0.015913 | 16.30 | NaN |
2005-09-30 | 0.018619 | 0.017042 | 17.34 | NaN |
2005-10-31 | 0.019170 | 0.023981 | 17.92 | NaN |
predict_data.tail()
钢铁消费量TTM_环比 | 基础设施建设投资TTM_环比_lag4 | M2_lag1 | 钢铁消费量TTM_环比_预测 | |
---|---|---|---|---|
指标名称 | ||||
2017-06-30 | 0.000906 | 0.005905 | 9.6 | 0.000080 |
2017-07-31 | 0.003643 | 0.012569 | 9.4 | 0.002650 |
2017-08-31 | 0.001135 | 0.012859 | 9.2 | 0.003357 |
2017-09-30 | -0.000705 | 0.011618 | 8.9 | 0.001858 |
2017-10-31 | -0.003060 | 0.019808 | 9.2 | 0.002830 |
predict_data.dropna(inplace=True)
plot_line_chart(predict_data.index,predict_data['钢铁消费量TTM_环比'],predict_data['钢铁消费量TTM_环比_预测'],'钢材消费量TTM环比','钢材消费量TTM环比预测')
本社区仅针对特定人员开放
查看需注册登录并通过风险意识测评
5秒后跳转登录页面...
移动端课程