如何在金融网站运用算法交易AI?

rioalian 2019-03-17

如何在金融网站运用算法交易AI?

在这篇文章中,我们将重点关注bars:它们有什么问题?如何正确地处理以用于机器学习模型?在重新认识bars之后,你会发现几种从bars构建输入和输出的新方法。我们将会以统计和试验的方式来进行比较。

如何在金融网站运用算法交易AI?

K线图(蜡烛图)的问题是什么?

我们习惯用所谓的“蜡烛图”来表示特定时间段(几分钟到几天不等)的开盘价,最高价,最低价和收盘价。

蜡烛图的主要问题是:市场并不遵循这一时间规则,人们不会在特定的时间或每隔N分钟/小时之后进行交易。此外,现代市场是由算法驱动的,人们必定是在需要的时候下注,而不是在特定的N秒后。若是根据固定的时间间隔对历史数据进行采样——当交易非常活跃时,我们会取样过少,交易低迷时则取样过多。

最后,根据上面提到的,可以得出下列结论(实证结论):根据时间采样的bars具有“糟糕”的统计特性,即较低的序列相关性,存在异常值,常态分布测试不成功。

解决办法是根据其他规则对bars取样:

· Tick:当出现N个Tick时,对OHLC(开高低收价) bar采样

· 成交量:当某项资产成交量达X股时,对OHLC bar采样

· 成交额:当某项资产成交额达Y美元(或其他货币)时,对OHLC bar采样

· 不平衡:当价格的涨跌率或买卖比率与期望值有偏差时,对OHLC bar采样

在下面的时间序列例图中,可以直观地看到如何获取这些bars:

如何在金融网站运用算法交易AI?

用以上提到的方法对香港专业教育学院(IVE)的bars采样的比较图

上面提到的所有方法都是为了创建包含相同数量信息的bars:每个tick bars的交易数量相同,但是成交量却大有不同,因此采样成交量bars会更好,这样每笔交易的成交股数就相同了。成交额bars则更进一步,每一个bar的交易的市场价值相等。不平衡bars可用于tick,成交量和成交额bars。对于不平衡的tick bars,我的解释是,它是从N个ticks采集的样本,且遵循类似的价格趋势。

正如你所看到的,所有的方法都非常依赖市场的微观结构来重建时间序列。让我们检查一下这些bars是否名副其实。这里的时间bar为十分钟,每100个bars采样一个tick bar,每达到10000股交易采样一次成交量bar,成交额每达到1000000美元采样一次成交额bar(从数个月的数据中采集样本)。

如何在金融网站运用算法交易AI?

如何在金融网站运用算法交易AI?

如何在金融网站运用算法交易AI?

如何在金融网站运用算法交易AI?

根据不同的bars采样规则得到的收益分布比较图

它们的统计特性如何呢?根据其序列相关性,标准偏差和正态性检验等不同参数得到的bars的比较图如下。

如何在金融网站运用算法交易AI?

可以看到,对于每一个参数,用其他规则采样bars比根据时间采样bars效果要好(方差除外,所有的方差都很低)。

如何在金融网站运用算法交易AI?

如何正确标记数据集?

有人曾经预测过N个bars之后的价格变化,例如,预测下一个30分钟后的价格变化,然后根据预测来买进或卖空,但从业者和交易员真的会像预测的那样做吗? 他们会在收到一些信号后开仓,牢记自己的获利和止损目标。这表示我们要更关注在这30分钟里发生的事,而不是30分钟后。其次,获利和止损目标可能会随时间变化,因为市场是会波动的。另外,因为我们是根据市场价格动向下注,我们要知道应该投多少钱。最后,我们更关注预测的可信度,让我们可以根据模型的建议,不需要在随机的信号上浪费时间。

因此,我们选用全新的标记方法:

· 考虑收益的波动性

· 考虑获利和利润

· 不仅要知道下哪支注,还要知道下注的大小

动态阈值

我们先从收益的波动性开始讨论。考虑一个简单的框架,框架中仍有固定的预测值,然后标记三个级别:现时价和远期价的收益(r)超过某个阈值T(比如r=0.2, T=0.1),小于-T(比如r=-0.12, T=0.1),或者差别不大(有迹象显示r小于T,比如 r=0.05, T=0.1)。我们可以将整个数据集的T值固定,也可以根据收益的标准差来计算T。让我们试验一下,选定60个tick bars的收益的阈值T=0.025,然后将其与T比较,这将与上100个收益的绝对值的标准差相等。

如何在金融网站运用算法交易AI?

固定阈值的标记直方图

如何在金融网站运用算法交易AI?

固定预测值根据市场波动标记的直方图

可以看到,根据波动来标记的结果分布仍相差较大,但根据固定阈值标记时,基本上大部分的结果都分布在标签0(-1表示下降, 1 表示上升,0表示差别不大)。要强调的是,这些标签是在用滑动窗口循环遍历bars的时候创建的,这并不是对数据点进行采样的最佳方法,我们后面再讨论这个问题。

三大壁垒标记法

现在研究另一种标记数据集的方法,在书中这一方法被称为“三大壁垒标记法(triple barrier method)”。我们想知道在下一个N个bars期间会发生什么——会遇到止损的情况吗?或许我们可以获利?或许价格将只是稍稍变化,最好不要下注?也许会遇到以上所用的情况?可以将这三种情况称为“三大壁垒(three barriers)”:两个横向壁垒(分别代表止损和获利),一个垂直壁垒,表示最终的横向结果(前面例子中的固定预测值)。当然,横向壁垒不是对称的(例如,你是个有野心的投资者,相对于利润目标,你的止损目标较低)。

如何在金融网站运用算法交易AI?

下注大小和元标记

好了,考虑到市场的波动以及止损和获利目标,我们已经有了实用的方法来标记价格的涨跌,但是还是不知道到底应该投多少钱(以及该不该投钱)。 Lopez de Prado提出了两步标记法( two-step labeling),一个标记是针对价格涨跌动向,另一个则是关于是否要下注(当然,还有下注的大小)。

· 将每一个样本标记为1,将动态阈值设置为初始的止损或获利壁垒(基本上,我们得知道价格是涨还是跌),标记首先会上涨或下跌。

· 知道价格涨跌之后,是否要下注就取决于预先确定的止损和获利目标,因此,如果第一个标记显示“涨”,我们要确认是否能达到获利目标,确认后,将第二个标记设为1。如果第一个标记显示“跌”,而且有可能要止损, 仍然将第二个标记记为1。 只有当第一个标记的涨跌方向和止损或获利之间没有相关性时,才将其标记为0。

接下来是最酷的部分。在准备数据集的时候,训练一组特性,建一个可预测一边的模型(标记1),再训练第二个模型,在模型中也输入所有之前的特征,并将其标记为1。在第一个模型预测了方向之后,用第二个模型确认,根据第二个模型输出的0到1之间的数值,可以得出合适的下注数额。例如,如果第一个模型显示“涨”,但是第二个模型显示的数字是0.05,这代表虽然价格会上涨,但我们很可能达不到预期的获利目标。

如何在金融网站运用算法交易AI?

记忆和平稳性又如何呢?

我们知道,在将数据传输到机器学习模型之前,需要以其他方式将其规范化或标准化或让其保持平稳。对于金融时间序列,在大多数情况下,我们使用延迟微分(通常延迟1秒,称为收益)。这确实让时间序列稳定,但如果时间序列内的信息有记忆的时候会怎么样呢?这些信息被删掉了,为什么?因为1秒的延迟微分看起来只是延迟了1个bar, 而且不知道之前发生的事。

在历史时间窗口中,为了数据的稳定,我们对所有的bars都这样做。但我们仍然想得到一个稳定的,没有删除全部有用信息的时间序列,要怎么做?要是只能用小于1的微分处理会怎样?这就是所谓的分数微分(fractional differentiation)。更多的细节可以在相关的书或其他资源找到。现在假设可以用0.1,0.3,或0.75的延迟微分处理时间序列,这能给我们更多的记忆。

如何在金融网站运用算法交易AI?

任意阶的滞后算子(来自维基百科)

对数价格和不同的微分以及稳定性之间的相关性的信息有多少保存下来了呢?用ADF检验得到的结果如下:

如何在金融网站运用算法交易AI?

Tick bars的相关性和ADF检验结果

如何在金融网站运用算法交易AI?

时间bars的相关性和ADF检验结果

可以看到,在tick bars时间序列中,分数微分不能带来更好的平稳性,但确实有更多的相关性的记忆。在时间bars序列中,用0.5-0.75阶的微分可以稍微改善数据。

如何在金融网站运用算法交易AI?

将其全部输入神经网络

好了,是时候看看用新的目标来为新bars建模会怎么样了。我们将使用非常简单的softma回归函数作为分类算法(用dropout函数实现正规化),并通过历史窗口将收盘价、成交量和收益标准化来作为特征。用Keras建的模型如下:

main_input = Input(shape=shape, name='main_input')x = Flatten()(main_input)x = Dropout(0.25)(x)output = Dense(3, activation = "softmax")(x)

长窗长度为100,短窗长度为50,预期值为25个bars。阈值T=0.01,数据集由tick bars组成:

如何在金融网站运用算法交易AI?

用于训练的tick bars(蓝色),验证(黄色)测试集(绿色)

可以看到,在数据集之间有空白区,这被称为“禁止区(embargo)”,可以帮助确认模型在未来仍能工作。之后会详细介绍它。现在先将其视为一个更真实的分裂场景。为了处理级别的不平衡的问题,根据训练和测试数据集将各个级别的比重计算出来。

固定阈值VS波动阈值VS三大壁垒

我们的基线仅是预测价格涨跌或预测其不超过阈值T。级别分类说明如下:(0代表下降,1表示差别不大,2表示上升)

如何在金融网站运用算法交易AI?

差别没有很大对吧?精确度/记忆以及数据集标记都没有很不平衡。波动阈值如何呢?

如何在金融网站运用算法交易AI?

得到的数字更好了。在精确性/记忆没有不平衡(这说明分类算法是公平的,随着算法和特征的改进,可以确实提高准确性),现在数据集的不平衡没有那么重要了。好了,现在让我们用三大壁垒对基于波动的滚动阈值T,并且有对称的获利和止损目标的例子进行试验。

如何在金融网站运用算法交易AI?

平均结果差不多一样,因为在这里,第二类别代表的垂直壁垒是非常少的,如果忽视它们,那么基于止损和获利的涨跌动向的准确率会比之前的例子的要高,但精确性/记忆会稍有不平衡。这些预测可作为二进制预测模型的元标记,有了它们就可以预测标记的一边,它们具有下列的准确性:

如何在金融网站运用算法交易AI?

分数微分VS整数微分

现在用已分数微分的对数价格代替特征集中的收益,设d=0.5, 然后看同样的试验下其结果如何。基线(仍然差别不大)

如何在金融网站运用算法交易AI?

横向的波动已比用“平常”的微分得到结果要好了:

如何在金融网站运用算法交易AI?

最后是三大壁垒以及元标记法:

现在我们可以确定,分数微分是非常有用的转换工具,可以从原始时间序列中保存更多的信息。

如何在金融网站运用算法交易AI?

结语

在这篇文章中,我们回顾金融网站上的bars的创建方法,并提出新的创建方式。我们讨论了它们的统计特性,并得出结论,成交量bars和成交额bars比标准的基于时间的bars要更加实用。根据不断波动的市场以及预先确定的获利和止损目标,发现标记输出的更实用的方式。最后,我们回顾了可使金融时间序列稳定而又不失去全部记忆的方法。我们还评估了所有的数据和标记试验,从中可以看到,所有的具有意义的提高都可以让预测结果更稳定,更准确。

完整代码:

https://github.com/Rachnog/Advanced-Deep-Trading/tree/master/bars-labels-diff

相关推荐