机器学习用于日内股票预测

作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai

对于股票价格的预测对于大多数交易员来说都是非常重要的。人们多年来一直在使用各种预测技术。我们将探索这些技术以及最近流行的算法,比如神经网络。在这篇文章中,我们将专注于对源自市场数据的特征应用到线性模型。

问题定义

首先我们来定义一下我们的问题,我们想要解决的问题是去预测证券的价格变化(或者回报)。

在这里插入图片描述

在上图中的每个点,我们想要在 1 分钟后预测其价格。让我们看看上图中的各个点 —— 这里有超过 200000 个数据点,但我们只能看到一部分内容。

Timestamp (EST)Current PricePrice after 1 minPrice Difference
09:30:01.500000153.905154.030.125
09:30:01.525000153.905154.030.125
09:30:01.550000153.905154.030.125
09:30:01.575000153.905154.030.125
09:30:01.600000153.9154.030.13
09:30:01.625000153.9154.030.13
09:30:01.650000153.905154.0350.13
09:30:01.675000153.905154.0350.13
09:30:01.700000153.905154.0350.13
09:30:01.725000153.905154.0350.13

我们可以看到 AAPL 价格再接下来的 1 分钟里应该上涨了 0.13 美元。我们想建立一个回归算法来预测这个价格差异。当然,不言而喻,这是一个难以置信的难题。即使是轻微的成功也可以获得巨大的利润。

请注意,预测回报率通常会比预测价格变动会更有效。比如,对于一只 100 元的股票,0.5 的价格变动对他本身来说不是很大。但是如果是一只 10 元的股票,0.5 的价格变动对他本身来说是很大的。

数据预处理

股票价格会受到众多因素的影响。以下是其中一些因素:

  • 市场流动性。供需是影响大多数股票日常价格变动的最关键因素。如果你决定花巨款去投资一家公司,那么它们的股票流动性肯定受到影响,这时候不可避免的就会提高股价。
  • 舆情系统。有名的特朗普的推特治国。他说的很多东西都会影响到股价的波动。有很多的学术研究就来做新闻/博客/推文对股票价格的影响。
  • 全球事件对股票价格的影响。比如最近的 G20 峰会,英国退欧等等。

上述因素的影响跨越不同的时间范围。例如,特定股票的新闻通常会影响未来 1-3 天的价格。全球事件的影响可能会有数周。在这篇文章中,我们只会使用从市场数据中得出的特征来预测下一个 1 分钟的价格变化。

特征

特征集可大致分为两类:描述当前市场波动的特征和描述历史市场波动的特征。

  • 买价,卖价
  • 中间价(买入价和卖出价的平均值)
  • 买卖价差
  • 移动平均价格
  • 1分钟,5分钟等等的买价和卖价

我们暂时会跳过这些功能的数学细节。但请注意,这些功能试图捕捉当前的市场状况以及最近的过去。

规范化

上述特征的原始值具有非常不同的尺度。虽然 AAPL 的价格一天可以在 153 到 155 之间,但是过去 5 分钟的数量可以在 100 到 1000000 之间。由于大多数学习算法在输入特征的比率相似事效果最好。这就是规范化步骤至关重要的原因。我尝试了一些自定义缩放技术,但发现 scikit-learn 的 RobustScaler 工作非常好。

线性模型

让我们首先来尝试一下在这个数据集上的简单线性模型。

普通最小二乘回归

在这里插入图片描述

设 x 是实值特征向量,y 是我们想要预测的实数值。 θ \theta θ 是我们想要学习的模型参数。

h ( x ) = ∑ i = 0 n θ i x i = θ T x h(x) = \sum^{n}_{i=0} \theta_{i}x_{i} = \theta^{T}x h(x)=i=0nθixi=θTx

普通最小二乘回归试图最小化以下损失函数:

J ( θ ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 J(\theta) = \frac{1}{2m}\sum^{m}_{i=1}(h(x^{i}) - y^{i})^{2} J(θ)=2m1i=1m(h(xi)yi)2

线性模型我们采用 scikit-learn 中的模型,但是根据下面的实验结果,这个模型已经过拟合!

InSampleOutSample
MSE0.00024243997.8
MAE0.01184151.201
Original Stdev0.01590.0202
Predicted Stdev0.0108179.11

在上表中,MSE 指的是均方误差,MAE 指的是平均绝对误差。Insample 是指训练数据,Outsample 是指测试数据。即 Outsample 上的 MAE 表示测试数据集上的平均绝对误差。

预测值的标准偏差具有有用的信息。盘中价格变化的平均值通常接近于 0 。这个数据集有很多噪音而且信号不多。这两者的组合使得对于任何 x 的预测都会接近于 0 。但是,输出 0 的模型绝对没有价值。我们需要可用于交易或者执行的固定模型。因此,需要将预测值 h(x) 的标准偏差与 y 的标准偏差进行比较。

L2 正则化

对误差项添加权重惩罚是正则化的一种简单方法。这有助于稳定训练,模型通常更易于推广。我做的下一个实验是岭回归模型(L2 正则化),并且检查一下性能。

J ( θ ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 + α ∣ ∣ θ ∣ ∣ 2 2 J(\theta) = \frac{1}{2m}\sum^{m}_{i=1}(h(x^{i}) - y^{i})^{2} +\alpha ||\theta||^{2}_{2} J(θ)=2m1i=1m(h(xi)yi)2+αθ22

我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 0, alphas=[1e-3,1e-4,1e-5], fit_intercept=False

InSampleOutSample
MSE0.0002190.000557
MAE0.011010.01722
Original Stdev0.01590.0202
Predicted Stdev0.00500.0121

我们可以看到 Outsample 的结果比线性回归模型要好很多。Outsample 的 0.01722 的平均绝对误差在我看来非常好。虽然预测值的标准偏差略小,但它仍然与 y 的标准偏差相同。

L1 正则化

另一种选择是在损失函数中添加 L1 正则化。这也叫做 Lasso。

J ( θ ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 + β ∣ ∣ θ ∣ ∣ J(\theta) = \frac{1}{2m}\sum^{m}_{i=1}(h(x^{i}) - y^{i})^{2} +\beta ||\theta|| J(θ)=2m1i=1m(h(xi)yi)2+βθ

我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 1, alphas=[1e-3,1e-4,1e-5], fit_intercept=False

InSampleOutSample
MSE0.0002440.000412
MAE0.011130.01313
Original Stdev0.01590.0202
Predicted Stdev0.00200.0018

Outsample 的 MAE 比 L2正则化好很多。但是,标准偏差非常低。

L1 + L2 正则化

我们还可以在损失函数中同时添加 L1 和 L2 正则化。

J ( θ ) = 1 2 m ∑ i = 1 m ( h ( x i ) − y i ) 2 + α ∣ ∣ θ ∣ ∣ 2 2 + β ∣ ∣ θ ∣ ∣ J(\theta) = \frac{1}{2m}\sum^{m}_{i=1}(h(x^{i}) - y^{i})^{2} +\alpha ||\theta||^{2}_{2} + \beta||\theta|| J(θ)=2m1i=1m(h(xi)yi)2+αθ22+βθ

我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 0.1, alphas=[1e-3,1e-4,1e-5], fit_intercept=False

InSampleOutSample
MSE0.0002440.000412
MAE0.011140.01311
Original Stdev0.01590.0202
Predicted Stdev0.00200.0017

这个结果跟 Lasso 差不多。

线性模型的其它实验
  • 我使用了可用于上述结果的所有数据,本来希望从更多的数据中找到某种规律。但是结果却是啥都没找到,有些结果还不如上面的结果。
  • 特征选择策略并没有真正增加任何价值,有时候,还会使得结果倒退。因为,你根本不知道啥特征是真正有用的。
  • 使用 PCA 降维并没有带来显著效果。
  • 合理的对数据进行采样操作时非常有效果的,例如,选择一些特殊行情,一些平缓行情等等。

集成方法

AlgorithmOutSample StdevInSample StdevOutSample MAE
Gradient Boosting0.00750.00380.01583
AdaBoost0.00370.00580.01345
Random Forest0.02360.01490.02638

神经网络

使用具有 hidden_size1 = 100 和 hidden_size2 = 50 的2层前馈神经网络获得以下结果。对网络进行了批量归一化和 dropout ,以减少过度拟合并且改善泛化。

InSampleOutSample
MSE0.0002540.000601
MAE0.011430.01754
Original Stdev0.01590.0202
Predicted Stdev0.00880.0083

建议

由于数据中的噪声非常高,因此通常很难知道模型是否正在执行任何正确操作,使用标准参数集合的模型通常不会起作用。

  • 纯市场数据具有非常有限的预测能力。因此,将线性模型中的所有系数视为 0 并且具有非零截距是非常常见的。总是建议在线性模型中将截距设置为 0。

  • 可以通过添加一些约束条件来泛化模型。

  • Outsample 的分布是不可预测的,分布在几天内可能就会发生显著变化。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值