前言
投资市场中的订单薄(Order book),是指针对某个股票/商品/货币在公开市场上的一系列报价数据,这些数据是有所有的申买价和对应的数量,以及申卖价和对应的数量。通常有很多个价格档位,这些价格是匿名的。通过订单薄可以放映出市场中买卖双方的力量。通常来讲,订单薄是针对同一个交易所的统一标的(股票、商品、货币等等)而言。
订单薄列出了在每个价格点或市场深度被投标或报价的股票数量。市场深度数据有助于交易员确定某一特定证券的价格走势。例如,交易员可以使用市场深度数据来理解证券的买卖价差,以及上述两种数据之上的成交量。具有强大市场深度的证券通常具有强大的交易量和相当的流动性,允许交易员在不显著影响市场价格的情况下下大额订单。
公众号独家解读:
什么是市场深度(Market Depth)?
市场深度是指市场能够在不影响证券价格的情况下维持相对较大的市场订单。市场深度考虑的是未平仓订单的整体水平和广度,通常指单个证券内的交易。
市场深度与证券的流动性和成交量密切相关,但并不意味着每只交易量大的股票都具有良好的市场深度。在任何一天,订单的不平衡都可能大到足以造成高波动性,即使是对日交易量最高的股票也是如此。
市场深度是限时订单中所包含的订单的属性。是将交易数量的限价订单与给定价格(如果它不是限制大小),或将获得最优的价格,市场秩序与给定大小(或限价订单按大小是有限的,而不是价格)。虽然价格的变化可能会反过来吸引后续订单,但这并不包括在市场深度中,因为它并不为人所知。
例如,如果某只股票的市场处于“深度”,那么买卖双方都将有足够数量的待完成订单,从而防止大额订单对价格产生重大影响。
市场深度也指在不引起股价上涨的情况下,某一特定公司可以购买的股票数量。如果股票流动性非常好,并且有大量的买家和卖家,购买大量股票通常不会导致明显的股价波动。
市场深度通常以电子买卖单的形式存在;这些是按照价格水平组织的,并实时更新以反映当前的活动。虽然有时这些数据是收费的,但大多数交易平台现在都提供某种形式的市场深度显示。这使得证券交易的各方都能看到一份完整的待执行买卖订单列表,以及它们的大小——而不是简单地看最好的那些。
市场深度看起来是这样的,它取决于软件的展示:
BTC市场深度
另一种可视化的方法是带有bids and offers的列表
中间价可以简单地定义为当前报价和要价的平均值。
我们的目标是建立一个预测中间价格的模型。
数据获取
以Google、Apple、Amazon、Intel、Microsoft assets为例,提供3个级别作为市场深度(1、5、10个级别)。
首先,我们建议可视化所有标的的中间价格和ask-bid 成交量的差异。导入必要的库!
加载数据:
可视化每种标的:
特征工程
这部分非常重要,因为模型的质量直接取决于它。我们应该在这些新特征中反映bids、asks和成交量之间的关系,以及不同深度的数据之间的关系。
特征
这些特征是特征工程的第一部分。第二部分是添加 lag components。这意味着我们将给定的特征转移到时间上的滞后并添加为列。这个例子展示了它是如何在原始数据集(而不是新特性)上工作的。
Lag components
下面这段代码提供特性工程的这两部分,并添加目标列log_return_mid_price。
通过梯度提升和微调(Fine-Tuning)建模
我们的目标是证明训练一个GBM是对真实目标y和近似值之间的某个损失函数进行梯度下降最小化:
这意味着添加弱模型:
对于我们的GBM加性模型:
在某种程度上是梯度下降。让近似值越来越接近真实y是有意义的,这就是梯度下降。例如,每一步的残差都变小。我们必须最小化与真实目标和近似距离相关的函数。让我们重温高尔夫球手的类比,并将近似和真实值之间的平方误差可视化:
https://explained.ai/gradient-boosting/descent.html
我们将使用Yandex的梯度增强,称为CatBoost。在大多数情况下,这个库的速度和质量都比其他库好!
https://catboost.ai/
这个算法有几个参数对质量有很大的影响:
n_estimators:在解决机器学习问题时可以构建树的最大数量。
depth:树的最大深度。
learning_rate:用于减少梯度步骤。它影响整个训练的时间——值越小,训练需要的迭代次数越多。
l2_leaf_reg:成本函数L2正则化项的系数。 允许任何正值。
此外,我们还有以下特征参数:
level:市场深度
number of time-steps:构建滞后时间
理论上,我们的每个资产都可以有唯一的一组参数。对于本篇推文,我们应该定义评估模型质量的目标函数。
定义最优参数的最佳方法之一是贝叶斯优化。详情见:
量化交易中的贝叶斯优化问题(论文 代码)
损失函数RMSE:
训练集由50%的数据组成。验证数据用于模型的微调。测试集占25%。
在微调步骤之后,我们在这两个部分(训练和验证集)上训练最终模型,并使用最后一部分测试模型。代码如下:
do_experiment函数是本篇推文的主要内容之一。该函数还构建了最佳模型的特征重要性,并估计了模型的质量。
一般来说,重要性提供了一个评分,它表明每个特征在增强决策树模型构建中有多么有用。使用决策树做出关键决策的属性越多,其相对重要性就越高。
这个重要性是为数据集中的每个属性显式计算的,允许属性之间进行排序和比较。
对于单个决策树,重要性是通过每个属性分割点改进性能度量的数量来计算的,权重是通过节点负责观察的数量来计算的。性能度量可以是用于选择分裂点的纯度(基尼指数)或另一个更具体的误差函数。
然后,对模型中所有决策树的特征重要性进行平均。
结果分析
成功的基本标准是使误差小于基线。这意味着最终的模型质量很好。
第一个问题是如何衡量质量。可以是平方误差。然后,利用自举法对区间进行估计。上面的bs_interval函数实现了bootstrap采样、计算统计和区间估计。
Bootstrapping
第二个问题是应该使用哪些值作为基线预测。许多研究声称市场是不可预测的。通常,预测的下一个价格和上一个价格是一样的,加上一些噪音,看起来是这样的:
详情见:
教你如何鉴别那些用深度学习预测股价的花哨模型?
这意味着,如果我们想预测收益率,它将在0 噪音附近。
我们的基线是相似的。该方法在do_experiment函数中实现。让我们运行这个do_experiment(asset_name),其中asset_name来自列表(AAPL、AMZN、GOOG、INTC、MSFT)。
将重要参数和度量收集到此表中:
最终结果表
AMZN和GOOG具有相同的优化参数。通常,水平和深度具有最大值或接近最大值。
在最初的探索阶段,前三种资产(AAPL、AMZN、GOOG)的的ask-bid和成交量具有良好的分布。最后两个资产(INTC、MSFT)的分布很奇怪。
该表显示我们在AAPL,AMZN,GOOG的误差存在统计学上的显著差异,并且基线已被打败(绿色)。建模间隔的上限低于基线的下限。。
对于INTC,没有一个显著的结果,区间是相交的(灰色)。在MSFT情况下,给定的结果比基线差(红色)。也许,这种现象的原因是在分布中发现的(也许是做市商的某些活动或其他因素)。
让我们来看看模型中最重要的特征:
正如我们所看到的,对于成功的模型,最重要的特征与最近的log_return_ask、log_return_bid、log_ask_div_bid等值相关。
改善
- 在优化中更改max_evals的数量。
- 在拟合中更改max_depth、n_estimators。
- 添加比当前特征更好的新特征,或给定特征的组合。
- 利用更多的数据进行实验,得到更好的模型。
- 在订单薄中查找具有更多级别的历史记录。
- 使用专门为时间序列开发的模型(例如LSTM、GRU等)。