作者:chen_h
微信号 & QQ:862251340
微信公众号:coderpai
对于股票价格的预测对于大多数交易员来说都是非常重要的。人们多年来一直在使用各种预测技术。我们将探索这些技术以及最近流行的算法,比如神经网络。在这篇文章中,我们将专注于对源自市场数据的特征应用到线性模型。
问题定义
首先我们来定义一下我们的问题,我们想要解决的问题是去预测证券的价格变化(或者回报)。
在上图中的每个点,我们想要在 1 分钟后预测其价格。让我们看看上图中的各个点 —— 这里有超过 200000 个数据点,但我们只能看到一部分内容。
Timestamp (EST) | Current Price | Price after 1 min | Price Difference |
---|---|---|---|
09:30:01.500000 | 153.905 | 154.03 | 0.125 |
09:30:01.525000 | 153.905 | 154.03 | 0.125 |
09:30:01.550000 | 153.905 | 154.03 | 0.125 |
09:30:01.575000 | 153.905 | 154.03 | 0.125 |
09:30:01.600000 | 153.9 | 154.03 | 0.13 |
09:30:01.625000 | 153.9 | 154.03 | 0.13 |
09:30:01.650000 | 153.905 | 154.035 | 0.13 |
09:30:01.675000 | 153.905 | 154.035 | 0.13 |
09:30:01.700000 | 153.905 | 154.035 | 0.13 |
09:30:01.725000 | 153.905 | 154.035 | 0.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(θ)=2m1∑i=1m(h(xi)−yi)2
线性模型我们采用 scikit-learn 中的模型,但是根据下面的实验结果,这个模型已经过拟合!
InSample | OutSample | |
---|---|---|
MSE | 0.000242 | 43997.8 |
MAE | 0.01184 | 151.201 |
Original Stdev | 0.0159 | 0.0202 |
Predicted Stdev | 0.0108 | 179.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(θ)=2m1∑i=1m(h(xi)−yi)2+α∣∣θ∣∣22
我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 0, alphas=[1e-3,1e-4,1e-5], fit_intercept=False
。
InSample | OutSample | |
---|---|---|
MSE | 0.000219 | 0.000557 |
MAE | 0.01101 | 0.01722 |
Original Stdev | 0.0159 | 0.0202 |
Predicted Stdev | 0.0050 | 0.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(θ)=2m1∑i=1m(h(xi)−yi)2+β∣∣θ∣∣
我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 1, alphas=[1e-3,1e-4,1e-5], fit_intercept=False
。
InSample | OutSample | |
---|---|---|
MSE | 0.000244 | 0.000412 |
MAE | 0.01113 | 0.01313 |
Original Stdev | 0.0159 | 0.0202 |
Predicted Stdev | 0.0020 | 0.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(θ)=2m1∑i=1m(h(xi)−yi)2+α∣∣θ∣∣22+β∣∣θ∣∣
我们采用 ElasticNet 模型来进行训练,具体参数为 l1_ratio = 0.1, alphas=[1e-3,1e-4,1e-5], fit_intercept=False
。
InSample | OutSample | |
---|---|---|
MSE | 0.000244 | 0.000412 |
MAE | 0.01114 | 0.01311 |
Original Stdev | 0.0159 | 0.0202 |
Predicted Stdev | 0.0020 | 0.0017 |
这个结果跟 Lasso 差不多。
线性模型的其它实验
- 我使用了可用于上述结果的所有数据,本来希望从更多的数据中找到某种规律。但是结果却是啥都没找到,有些结果还不如上面的结果。
- 特征选择策略并没有真正增加任何价值,有时候,还会使得结果倒退。因为,你根本不知道啥特征是真正有用的。
- 使用 PCA 降维并没有带来显著效果。
- 合理的对数据进行采样操作时非常有效果的,例如,选择一些特殊行情,一些平缓行情等等。
集成方法
Algorithm | OutSample Stdev | InSample Stdev | OutSample MAE |
---|---|---|---|
Gradient Boosting | 0.0075 | 0.0038 | 0.01583 |
AdaBoost | 0.0037 | 0.0058 | 0.01345 |
Random Forest | 0.0236 | 0.0149 | 0.02638 |
神经网络
使用具有 hidden_size1 = 100 和 hidden_size2 = 50 的2层前馈神经网络获得以下结果。对网络进行了批量归一化和 dropout ,以减少过度拟合并且改善泛化。
InSample | OutSample | |
---|---|---|
MSE | 0.000254 | 0.000601 |
MAE | 0.01143 | 0.01754 |
Original Stdev | 0.0159 | 0.0202 |
Predicted Stdev | 0.0088 | 0.0083 |
建议
由于数据中的噪声非常高,因此通常很难知道模型是否正在执行任何正确操作,使用标准参数集合的模型通常不会起作用。
-
纯市场数据具有非常有限的预测能力。因此,将线性模型中的所有系数视为 0 并且具有非零截距是非常常见的。总是建议在线性模型中将截距设置为 0。
-
可以通过添加一些约束条件来泛化模型。
-
Outsample 的分布是不可预测的,分布在几天内可能就会发生显著变化。