本人笨笨,几百年没写blog了实在是学了忘忘了学,知识点又杂,大概零零碎碎写一点点,没有售后(。),反正比一上来就默认你啥都知道好(一点点而已)(大佬请跳过,看这个纯属浪费您时间,本人废话很多。千万不要抄!我真的很菜就是记录一下自己的思路而已!!欢迎大家提出BUG!!土下座!!!
当然得借鉴别人论文,我又没学过金融知识,所以整理了26个影响因子。(想起来再补上表
进行了如下处理:
只有汇率是每天都有的好吗?其他的一个月一次的就直接用上一个非空数据。每一季度的直接取平均值或者扔了吧,本来就只能预测几天而已。
Dataframe=Dataframe.fillna(value=None, method='ffill')
#检查一下是否都是非空了
Dataframe.info()
检查两个变量之间变化趋势的方向以及程度,值范围-1到+1,0表示两个变量不相关,正值表示正相关,负值表示负相关,值越大相关性越强。常规操作,本来只是按照流程走,却发现后面问题好大。
Dataframe.corr()
读了n篇论文都是用VAR,那咱也来。
首先要知道VAR针对的是什么样的数据,https://zhuanlan.zhihu.com/p/87116384如此写到:
“向量自回归模型是针对多元时间序列数据,向量自回归模型采用了一种更为灵活的时序建模策略:给定多元时间序列数据为 ,则对于任意第 t 个时间间隔,存在如下的线性表达式
其中,表示向量自回归模型的系数矩阵; ϵt 可视为高斯噪声……”
(好了,已经看不懂了,但是问题应该不大,due赶不完了)
https://juejin.cn/post/6844903687567966216#heading-1说得简洁明了,就是一元的只有时间一个影响因素影响目标变量,但是多元有很多个因素,这些因素既会被时间影响,也会影响目标变量。所以,理论上,VAR确实很合适的样子。
该检验用来检查序列是否为随机序列,如果是随机序列,那它们的值之间没有任何关系。使用LB检验来检验序列是否为白噪声,原假设为在延迟期数内序列之间相互独立。这也是一个常规套路操作的样子。直接上代码吧:
from statsmodels.tsa.stattools import adfuller
import statsmodels.api as sm
white_noise=[]
##
for name in data_drop_Date:
df=data_drop_Date[name]
## 白噪声检验Ljung-Box检验
## 该检验用来检查序列是否为随机序列,如果是随机序列,那它们的值之间没有任何关系
## 使用LB检验来检验序列是否为白噪声,原假设为在延迟期数内序列之间相互独立。
lags = [4,8,16,32]
LB = sm.stats.diagnostic.acorr_ljungbox(df,lags = lags,return_df = True)
print(name+"的检验结果:\n",LB)
if(LB['lb_pvalue'].all()<0.05):
print(name+' is not white noise')
else:
white_noise.append(name)
## 如果P值小于0.05,说明序列之间不独立,不是白噪声
print(white_noise)
我这里结果还好,没有白噪声。
常规操作.
not_stable_list_orgin=[]
not_stable_list_after=[]
stable_df=pd.DataFrame()
## 序列的单位根检验,即检验序列的平稳性
for name in data_drop_Date:
df=data_drop_Date[name]
dftest = adfuller(df,autolag='BIC')
dfoutput = pd.Series(dftest[0:4], index=['adf','p-value','usedlag','Number of Observations Used'])
print(name+"单位根检验结果:\n",dfoutput)
if(dfoutput['p-value']>=0.05):
not_stable_list_orgin.append(name)
else:
stable_df[name]=df
for name in not_stable_list_orgin:
## 对X1进行一阶差分后的序列进行检验
df=data_drop_Date[name]
X1diff = df.diff().dropna()
dftest = adfuller(X1diff,autolag='BIC')
dfoutput = pd.Series(dftest[0:4], index=['adf','p-value','usedlag','Number of Observations Used'])
print(name+"一阶差分单位根检验结果:\n",dfoutput)
if(dfoutput['p-value']>0.05 ):
not_stable_list_after.append(name)
else:
print(name)
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(111)
df.plot(ax=ax1)
X1diff.plot(ax=ax1)
plt.show()
stable_df[name]=X1diff
print(not_stable_list_orgin)
print(not_stable_list_after)
print(stable_df)
就是先做单位根检验,不平稳的数据一阶差分,然后 混~合~在~一~起~。但是做了一阶差分肯定要少一个数据,干脆去掉第一行。
首先照抄了该链接的思路https://www.frisk.today/post/267267077.html#VAR-%E6%A8%A1%E5%9E%8B%E7%9A%84%E6%9E%84%E5%BB%BA
from statsmodels.tsa.vector_ar.var_model import VAR
mod = VAR(endog=stable_df,dates=pd.date_range('2021/9/2','2022/9/24',freq='D'))
# 估计最优滞后项系数
lag_order = mod.select_order()
# 输出结果
print(lag_order.summary())
然后呢:.select_order() 处 leading minor of the array is not positive definite
去搜索没什么结果只有乱葬岗(。)
I found an explanation: "Fitting high dimensional VARs is not a goal of statsmodels at the present. Some other approach such as a ridge penalty might help you. I don't think there is anything that we can do here."
就是影响因子太多了,不适合。
呵。
呵呵。
1.2的Pearson系数还是不得不用的,我只选取的abs()>0.5的数据保留。
结果是出来了,但是……
大佬说得好啊:“0阶就退化模型呗。建立个普通的回归模型”
我好像看到有说ridge penalty
行吧。
高深的不好用那就把所有的基础线性回归用一个遍。sklearn库是真的非常好用啊!12个模型来一遍。
BUT!!模型不能不调参(人不能,但至少不应该
使用GridSearchCV搜索,先用官网的SVM案例测试了一下,可行。但是自己写就频频报错。问题有
1.不适合调参的,如linear regression。我们可以通过这个函数看一下,官网全是英文懒得看……
print(clf.get_params())
2.遍历时报错 local variable 'GridSearchCV' referenced before assignment
大佬有云https://blog.csdn.net/sinat_40304087/article/details/115701595
大意时说我重复调用,但诡异的是,重复的是 ‘GridSearchCV' (那不然呢那不然呢)
然后就发现了,因为我用if代替match(3.6还没有QAQ),我在上一个elif后面的搜索方法中又一次写了这个:
from sklearn.model_selection import GridSearchCV
也就是本来是global,一下子变成private了
(未完不知道有没有待续)