时间序列是按照时间排序的一组随机变量,时间序列数据本质上反映的是随机比变量随时间不断变化的趋势。
时间序列预测就是想根据已有的历史数据,挖掘出这样的规律,如t1,t2,t3,...,tn{t_1,t_2,t_3,...,t_n}t1​,t2​,t3​,...,tn​按照时间次序排列,然后尝试预测其tn+1t_{n+1}tn+1​时刻的状态。

时间预测数据的特点:

  • 由从前的时刻点,当下时刻点与未来时刻点之间的相互联系关系,数据的变化规律往往存在,趋势性(在某区间内的发展方向)、周期性(周期性波动,长期有效性)、不规则性(突发状况和偶然,短期波动不稳定)。
  • 平稳性与非平稳性。平稳性表明时间序列的均值和方差不会随着时间推移会发生变化。所以如果序列满足平稳性,也就保证了当前特征不但仅仅存在与现在,还会延伸到未来。
  • 时间延续的规模太长。随着存储技术的提升,可获得的时间序列数据长度也越长,那么如何处理“大数据”?

传统处理方法
经典时间序列模型也就是ARMA(auto regressive moving average model,自回归滑动平均模型)了,它是最常用的拟合平稳序列的模型,它又可细分为 AR模型(auto regression model)、MA模型(moving average model)和ARMA模型(auto regression moving average model) 三大类。

  • AR是线性预测,该模型认为通过时间序列过去时点的线性组合加上偏置项(如公式中的γ\gammaγ)即可预测当前时点,它是随机游走的一个简单扩展。即已知N个数据,可由模型推出第N点前面或后面的数据,其本质类似于插值。α\alphaα为权重,p是时间窗大小。
    Xt=∑i=1pαiXt−i+γiX_t=\sum_{i=1}^{p}\alpha_iX_{t-i}+\gamma_iXt​=i=1∑p​αi​Xt−i​+γi​
    AR模型对偏自相关函数(PACF)截尾,对自相关函数(ACF)拖尾。所谓截尾指的是从某阶开始均为(接近)0的性质,拖尾指的是并不存在某一阶突然跳变到0而是逐渐衰减为0。

  • MA模型和AR大同小异,使用趋势移动平均法建立直线趋势的预测模型。但它不是过去点的线性组合而是过去偏置项的线性组合,故与AR最大的不同之处是,AR模型中偏置项的影响是间接影响当前预测值的。β\betaβ是权重,q是时间窗大小。
    Xt=∑i=1qβiγt−i+γiX_t=\sum_{i=1}^{q}\beta_i\gamma_{t-i}+\gamma_iXt​=i=1∑q​βi​γt−i​+γi​

  • 至于ARMA,在国际上被誉为时间序列预测方法中较为复杂且最高级的模型,先看其公式:
    Xt=∑i=1pαiXt−i+∑i=1qβiγt−i+γiX_t=\sum_{i=1}^{p}\alpha_iX_{t-i}+\sum_{i=1}^{q}\beta_i\gamma_{t-i}+\gamma_iXt​=i=1∑p​αi​Xt−i​+i=1∑q​βi​γt−i​+γi​
    如果权重系数β\betaβ全为0,则退化为AR模型,同理也可以退化为MA模型。所以MA和AR都是ARMA的一个特例,通过p和q进行调整。但以上这几种模型都是仅适合于描述平稳过程,而实际应用中所遇到的时间序列往往是非平稳的,往往还需要进行多次差分使其变得平稳,即差分次数d值的大小。不过有时遇到的时间序列呈现出一种特殊的非平稳性,即齐次非平稳性,对于这样的时间序列只要进行一次或两次差分就可以转化为平稳序列。

针对于具体模型的求解,按照Box-Jenkins的方法,

  • 1.对于给定的时间序列,先确定适合的p,d,q (d值通过检验差分后序列是否平稳;p通过偏自相关PACF;q通过自相关函数来确定)
  • 2.计算具体参数。根据观察到的值,使用最大似然法求解。若最大似然难以求解,考虑使用EM算法 。
  • 3.检验其适合性。如均方误差等。
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
import pandas as pd
sns.set()data = pd.read_csv('data.csv')
print(data.head())signal = np.copy(data.Close.values)
#MA
def moving_average(signal, period):buffer = []for i in range(period, len(signal)):buffer.append(signal[i - period : i].mean())return buffer#AR
def auto_regressive(signal, p, d, q, future_count = 10):buffer = np.copy(signal).tolist()for i in range(future_count):ma = moving_average(np.array(buffer[-p:]), q)forecast = buffer[-1]for n in range(0, len(ma), d):forecast -= buffer[-1 - n] - ma[n]buffer.append(forecast)return bufferfuture_count = 15
predicted_15 = auto_regressive(signal,15,1,2,future_count)
predicted_30 = auto_regressive(signal,30,1,2,future_count)
plt.figure(figsize=(15, 7))
plt.plot(signal, label = 'data')
plt.plot(predicted_15, label = 'ARIMA 15 MA')
plt.plot(predicted_30, label = 'ARIMA 30 MA')
plt.legend()
plt.show()

如果使用现成工具包:

#AR
from statsmodels.tsa.ar_model import AR
from random import random
model = AR(data)
model_fit = model.fit()#plot
plt.plot(data)
plt.plot(model_fit.fittedvalues, color='red')
plt.title('RSS: %.4f'% np.nansum((model_fit.fittedvalues-data)**2))
plt.show()#MA
from statsmodels.tsa.arima_model import ARMA
from random import random
model = ARMA(ts_log_diff, order=(0, 1))
model_fit = model.fit(disp=False)# ARMA
from statsmodels.tsa.arima_model import ARMA
from random import random
model = ARMA(data, order=(2, 1))
model_fit = model.fit(disp=False)


但传统的时间序列方法在很大程度上由参数模型的选择。

机器学习方法
线性回归、SVM或贝叶斯 ,XGBoost等(博主博客已整理,不再赘述),转化为回归问题。如用SVM方法直接对数据做回归预测等。

#LR方法
import numpy as np
from sklearn.linear_model import LinearRegression
def get_preds_lin_reg(df, target_col, N, pred_min, offset):regr = LinearRegression(fit_intercept=True)pred_list = []for i in range(offset, len(df['adj_close'])):X_train = np.array(range(len(df['adj_close'][i-N:i]))) y_train = np.array(df['adj_close'][i-N:i]) X_train = X_train.reshape(-1, 1)     y_train = y_train.reshape(-1, 1)regr.fit(X_train, y_train)            # Train the modelpred = regr.predict(N)pred_list.append(pred[0][0])  #限制pre_minpred_list = np.array(pred_list)pred_list[pred_list < pred_min] = pred_minreturn pred_list#同样可以使用其他ML算法,如SVM
from sklearn.svm import SVR
vr_rbf = SVR(kernel='rbf',C=1e3,gamma=250)
y_rbf = svr_rbf.fit(X,y).predict(X)
predicted_vol_rbf = np.exp(y_rbf)svr_linear = SVR(kernel='linear',C=1e3,gamma=250)
y_linear = svr_linear.fit(X,y).predict(X)
predicted_vol_linear = np.exp(y_linear)svr_poly = SVR(kernel = 'poly',C=1e3,gamma=250)
y_poly = svr_poly.fit(X,y).predict(X)
predicted_vol_poly = np.exp(y_poly)#XGBoost
from xgboost import XGBRegressor
model = XGBRegressor(seed=model_seed,n_estimators=n_estimators,max_depth=max_depth,learning_rate=learning_rate,min_child_weight=min_child_weight,subsample=subsample,colsample_bytree=colsample_bytree,colsample_bylevel=colsample_bylevel,gamma=gamma)model.fit(X_train_scaled, y_train_scaled)est_scaled = model.predict(X_test_scaled)

深度学习技术
主流多使用LSTM 代码如下,算法思想博主博客中已有,同样不做赘述。除了RNN系列外,同样可以用keras搭建一个CNN用于预测,比如将图片的R、B、G三维分别换成开盘、最高、最低、收盘和成交量这类似的5维通道,然后在一定的时间窗口内进行卷积。

只是机器学习相关算法运用在时间序列问题上往往是处理为预测问题。包括用其他的网络,如玻尔兹曼机RBM,CNN,GAN等,都是简单的直接应用,所以也存在一些DeepLearning+传统处理方法,不但能理解数据的统计构成,还能利用其深度学习的抽象能力,如SOCNN,LSTNet等等。

A-stock price fluctuation forecast model based on LSTM
来自SKG的论文,讨论LSTM的使用效果。

from keras.layers.core import Dense, Activation, Dropout
from keras.layers.recurrent import LSTM
from keras.models import Sequential#载入自己数据,并进行基本的数据切分和归一化预处理
X_train, y_train, X_test, y_test = load_data('text.csv')model = Sequential()
model.add(LSTM(input_shape=(None, 1), return_sequences=True, units=50))
model.add(Dropout(0.2))
model.add(LSTM(100,return_sequences=False))
model.add(Dropout(0.2))
model.add(Dense(units=1))
model.add(Activation("linear"))reduce_lr=ReduceLROnPlateau(monitor='val_acc',factor=0.9,patience=30,min_lr=0.00001,verbose=1) #在训练中降低学习率
checkpointer=ModelCheckpoint(filenpath="model.hdf5",verbose=1,save_best_only=True)
model.compile(loss="mse", optimizer="rmsprop")
print ("Compilation Time : ", time.time() - start)model.fit(X_train,y_train,batch_size=50,epochs=20,verbose=1,validation_split=0.05,callbacks=[reduce_lr,checkpointer],shuffle=Ture)#重载数据用以画图
f=open('text.csv')
df=pd.read_csv(f)
data=np.array(df[kdata])
data=data[::-1]#预测数据并画图
predicted = model.predict(X_test)
print(predicted)
predicted = np.reshape(predicted, (predicted.size,))
plt.plot(data,'y')
plt.plot(list(range(len(data),len(data)+len(X_test))),predicted,'b')
plt.show()#重载模型,检查其过拟合,绘制混淆矩阵
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
model.load_weights("model.hdf5")
pred=model.predict(np.array(X_test))
C=confusion_matrix([np.argmax(y) for y in Y_test],[np.argmax(y) for y in pred])
print(C/C.astype(np.float).sum(axis=1))

以以上代码为基础,可以利用LSTM做向后连续多天预测和趋势判断的探究,如下图是博主自己训练的模型在A股市场上做测试的简单结果。黄线为原数据线,绿线为LSTM的预测线,黑线为向后多天的训练结果,红点与蓝点为上涨或下降的趋势判断。(果然还是应该举起多因子分析大旗…)

为什么ML算法在金融数据“预测”会效果不佳?
金融时间序列本身存在:

  • 多重共线性,模型难以设计;
  • 信噪比低,极度嘈杂;
  • ML方法需要序列平稳的条件,而不平稳是常态;
  • 二级市场,想要获利的所有参与者都会根据结果再做变动;
  • 测不准法则。一边实验,一边改变环境变量,想要找到确定的影响机制成为不可能;

故单纯的使用ML,而不重视经济学理论,ML原理的本质范式就会不存在,挖掘挖掘的能力也只会变成一种虚假的模拟,如上图用LSTM的测试结果,在很大程度上产生了“过拟合”,即只是过去时间态势的回放。

未来?
经济理论为纲,使用ML去发掘变量之间的复杂相互作用。
经济理论为纲,结合其他信息如新闻,心理分析。

传统量化金融时序模型(ARMA,ml-XGBoost,dl-LSTM)相关推荐

  1. ML、DL、CNN学习记录5

    文章目录 ML.DL.CNN学习记录4 RNN RNN类别 Word 表示 编码 10000dim - 100dim RNN基本运算 imdb 文本生成模型 模型示例 ML.DL.CNN学习记录4 T ...

  2. QuantitativeFinance:量化金融之金融时间序列分析之ES/ETS/GARCH模型的简介、Box-Jenkins方法-AR/MA/ARMA/ARIMA模型的简介及其建模四大步骤之详细攻略

    QuantitativeFinance:量化金融之金融时间序列分析之ES/ETS/GARCH模型的简介.Box-Jenkins方法-AR/MA/ARMA/ARIMA模型的简介及其建模四大步骤之详细攻略 ...

  3. ML:机器学习算法中—因子模型(多变量)、时序模型/时间序列模型(主要以单变量)算法对比的简介、带有时序性的因子模型概述、案例应用之详细攻略

    ML:机器学习算法中-因子模型(多变量).时序模型/时间序列模型(主要以单变量)算法对比的简介.带有时序性的因子模型概述.案例应用之详细攻略 目录 因子模型和时序模型/时间序列模型算法的简介 1.因子 ...

  4. ML之LightGBM:基于titanic数据集利用LightGBM和shap算法实现数据特征的可解释性(量化特征对模型贡献度得分)

    ML之LightGBM:基于titanic数据集利用LightGBM和shap算法实现数据特征的可解释性(量化特征对模型贡献度得分) 目录 基于titanic数据集利用LightGBM和shap算法实 ...

  5. 《量化金融R语言初级教程》一2.1 均方差模型

    本节书摘来异步社区<量化金融R语言初级教程>一书中的第2章,第2.1节,作者: [匈牙利]Gergely Daróczi(盖尔盖伊) , 等 译者: 高蓉 , 李茂 责编: 胡俊英,更多章 ...

  6. python常用的量化金融库

    下面是常用的量化金融常用的库,以及与量化金融有关的支持库,有些需要科学上网才能打开. 文章目录 python基本的数值库和数据结构 金融工具和定价 指标 交易和回溯测试 风险分析 因素分析 时间序列( ...

  7. 智能运维之时间序列预测中的经典时序模型

    # 技术黑板报 # 第七期 推荐阅读时长:12min 智能运维领域时间序列预测都有哪些典型应用场景?典型的算法有哪些?这些算法在实际落地应用中有哪些优缺点?让我们一起来看看云智慧对此是怎样理解的. 章 ...

  8. 顶尖量化交易公司 CEO 如何缔造量化金融王国?

    " 投资交易的未来是什么 ?" " 是量化交易 !" 这是华尔街资深交易员.量化交易公司 WorldQuant 的创始人伊戈尔·图利钦斯基(Igor·Tulch ...

  9. Python 量化金融库最全汇总!

    大家好,我‍是阳哥. 本文汇总了定量金融的大量三方库,按功能进行分类,覆盖数值运算,衍生品定价,回溯检验,风险管理,数据爬取,可视化等多个子领域,供每个Python程序员参考. 不要重复造轮子,明确要 ...

最新文章

  1. 字节流与字符流基本操作
  2. 互联网公司面试必问的mysql题目(下)
  3. categories php,manage-categories.php
  4. 外存中的对换区和文件区
  5. 【kafka】kafka 中 消息 record 格式
  6. 80行代码使用Python+tkinter实现一个计算器
  7. echarts实用小技巧,控制字符串长度,限定整数等
  8. Python txt转换为excel
  9. 软件实施工程师到底是干什么的?全方位介绍实施工程师的职责要求和发展前景
  10. win10系统电脑分辨率异常解决办法
  11. 2013年12月安徽省广播电台网络影响力排名
  12. 0CTF piapiapia
  13. 红包大战不再是两马战,内容平台为何成为新生力量?
  14. 黑马前端案例——模拟京东显示密码
  15. MySQL关于分库分表及其平滑扩容方案
  16. win10 + neo4j + jdk 完美安装教程 欲哭无泪贴!!教你彻底卸载老的jdk!
  17. 筛选后的过滤内容复制到另外一个表格
  18. 计算机运算器实验原理,运算器实验原理.ppt
  19. java的actionlistener_Java swing: 实现ActionListener监听器的三种途径
  20. 免费的XShell替代品FinalShell介绍

热门文章

  1. php pdo的用法,php pdo函数库用法详解
  2. linux驱动编写之十六(块驱动设备初识)
  3. Day6-2021.1.14 计算机网络面经从基础到总结+力扣 链表 题目的整理。
  4. python画图解决Times New Roman自带粗体问题
  5. 最简单的幻灯片制作,分分钟完成高逼格成片
  6. 致创业者的一封信[经典励志]
  7. JavaWeb(9) I18N国际化
  8. 基于CTP的国内期货程序化交易之行情获取讲解
  9. aircrack-ng 介绍、功能测试及部分源码分析
  10. R语言3.6版本安装ggplot2报错解决方法