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

作者: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 的分布是不可预测的,分布在几天内可能就会发生显著变化。

### 构建LSTM模型进行股价波动性预测 为了利用LSTM模型进行股价波动性预测,可以采用以下方法: #### 数据预处理 在构建LSTM模型之前,需要对原始数据进行预处理。这通常涉及标准化输入特征以及创建适合时间序列分析的数据结构。 对于股价波动率的计算,常用的方法是从每收盘价中提取收益率并进一步转换成波动率指标。例如,可以通过下面的方式获取收益率和滚动标准差作为波动性的代理[^1]: ```python import pandas as pd import numpy as np def calculate_volatility(prices, window=20): returns = prices.pct_change().dropna() volatility = returns.rolling(window).std() * np.sqrt(252) # 年化波动率 return volatility ``` #### LSTM模型设计 接下来定义一个简单的LSTM网络架构用于捕捉时间序列中的模式。考虑到波动性是一个相对复杂的金融概念,可能还需要加入其他宏观经济因素或其他技术指标作为额外输入特性: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, LSTM, Dropout model = Sequential([ LSTM(units=50, return_sequences=True, input_shape=(X_train.shape[1], X_train.shape[2])), Dropout(0.2), LSTM(units=50, return_sequences=False), Dropout(0.2), Dense(units=1) ]) ``` #### 训练过程 完成上述准备工作之后就可以开始训练这个神经网络了。这里需要注意的是,在实际应用过程中应当仔细选择合适的超参数组合,并且要确保有足够的样本量来进行有效的泛化: ```python model.compile(optimizer='adam', loss='mean_squared_error') history = model.fit(X_train, y_train, epochs=epochs, batch_size=batch_size, validation_split=validation_split) ``` #### 预测阶段 一旦完成了模型训练,则可以直接调用`predict()`函数对未来时间段内的波动情况进行估计[^2]: ```python predicted_volatilities = model.predict(X_test) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值