创新AI算法交易:重新定义Bar、标签和平稳性(附代码)

2019-02-26 16:35:33 浏览数 (2)

本周作者:Alexandr Honchar

本期编译:1 1=6

正文

我们经常采用非常简单的方法来预测金融时间序列:利用整个数据集,使用移动窗口生成X和Y,把它分为历史和样本外数据,训练一些机器学习模型映射X到Y并用多空策略进行回测。但我们开始意识到,对于“正常的”静态数据(如图像、文本、音频、表格数据等)不能用于金融时间序列分析。

问题不仅在于数据是随机的而且难以预测。这完全是对其内在本质的误解,它会影响数据集的准备、交叉验证、特征选择和回测。在本文中,我们将集中讨论众所周知的“bars”,如何在机器学习模型中正确地使用它们。在重新bars之后,我们将发现几种新的方法来构建输入和输出。当然,我们将比较统计和经验的方法。

K线发生了什么?

我们习惯于使用所谓的Candles数据,这些数据表示在特定时间段(从几分钟到几天)内的开盘价、最高价、最低价和收盘价。这种方法存在一个主要问题:市场不遵循这个时间规则。人们不会在某个时间或每N分钟/小时进行一次交易。此外,由于现在的市场是由算法驱动的,他们肯定会在需要的时候下注,而不是在N秒过后。如果我们基于恒定的时间间隔对历史数据进行抽样——当交易非常活跃时,我们会少抽样;反之。从上面提到的所有内容,由时间采样的bars遵循“糟糕的”统计特性:它们具有较低的序列相关性,具有异常值和正态分布测试失效。

解决方案是根据另一种规则对这些进行采样:

  • Tick bars:当出现N个ticks时,对 OHLC bar 进行取样;
  • 成交量bars:当某一资产X股被交易时,对OHLC bar 进行取样;
  • 成交额bars:当资产在Y元上交易时,对OHLC bar 进行取样;
  • 偏离bars:当价格的上升/下降或买入/卖出的比率偏离我们的预期时,对OHLC bar 进行取样。

你可以直观地看到这些bars是如何产生的,如下图所示:

获取全部代码,见文末

上面提到的所有方法都是为了创建包含相同数量信息的bars:Tick bars具有相同数量的交易,但是成交量可能非常不同,因此我们会更好地选择样本成交 bars,每个bars都有相同数量的股票交易。成交额bars延续这个思路,使每个bars有相同的市场价值。偏离bars可以应用于tick、成交量或成交额。让我解释一下 tick 偏离bars背后的想法。偏离bars是来自N个ticks的样本,它们遵循类似的价格趋势。

正如你所看到的,所有这些想法都严重依赖于市场微观结构来重建我们很熟悉时间序列。我们来看看这些bars是否真的如此如我们所说。本文,time bars sampled every 10 minutes, tick bars sampled every 100 bars, volume — every 10000 trades and dollar — each $1000000 traded (all over several months):

下面你可以找到具有不同参数的不同bars的比较,以及它们的序列相关性、标准差和正态性测试等:

正如我们所看到的,对于每个参数,可选的bars都比时间bar表现得好(除了方差之外)。

如何正确标注数据集?

在之前,我们预测过价格经过N个bar后会如何变化。例如,想预测下一个30分钟后的价格会如何变化,然后根据预测来做多或做空。但这真的是从业者和交易员的行为方式吗?当他们在一些信号发出后打开头寸,他们会记住自己的获利目标和止损目标是什么。这意味着,我们更关心的是这30分钟内发生了什么,而不是他们过去后会发生什么。此外,由于市场的波动,我们的盈亏目标可能会随着时间的推移而改变。另外,由于我们打算在市场价格会发生变化的某个方向下注,我们需要知道应该下注多少。说一句不是很重要的:

I am interested in the confidence of my prediction not to waste time on random signals from the point of view of my model.

因此,我们对一种新的标记方法很感兴趣,包括:

  • 考虑收益率的滚动波动率
  • 考虑止损和获利
  • 告诉我不仅仅是赌注,而是赌注的大小

动态阈值

让我们先从收益率的波动性开始。让我们考虑一个简单的框架,我们仍然有一个固定的预测范,我们想要标记三个类:如果当前价格和未来的收益超过某个阈值T(r = 0.2,T = 0.1),小于-T(比如r = -0.12,T = 0.1),或者并不显着(例如返回的符号小于T,如r = 0.05,T = 0.1)。我们可以对整个数据集固定这个T或者我们可以自适应地使用返回的标准变化量来计算它。让我们验证一下这个想法,选择固定的T = 0.025阈值作为60个tick bar的收益界限,并将其与T进行比较,它等于最近100个收益的绝对值的标准差:

获取全部代码,见文末

正如我们所看到的,基于波动率的标签仍然不是很平衡,但是固定阈值标签基本上使大多数标签为0(其中-1下降,1上升,0 -不显著移动)。我们只是想要注意,这些标签是在使用移动窗口对循环bar进行创建的,这不是采样数据点的最佳方式,我们稍后将讨论这个问题。

Triple barrier 标签(三重界线法,一种利用时间和价格的过滤器)

现在让我们研究另一种标记数据集方法,出自《triple barrier method》一书。我们想知道接下来的N个bars会发生什么。我们会遇到止损情况吗?或者我们应该获利?或者价格会有一点波动所以我们最好不要下注?或者甚至是这些事件的组合?我们可以用三个barrier来描述这三种情况:

Two horizontal (that represent stop loss and take profit) and one vertical which will mean the final horizon (fixed horizon in our previous example). Of course, these horizontal barriers shouldn’t be symmetric (for example you’re an aggressive player and your stop loss is pretty low comparing to the take profit goal).

下面解读来自babyquant:

方法的思路来源:构建一个在大多数基金、交易所(通过margin call,追加保证金通知)、投资者止损离场的位置建仓的头寸几乎是不可能的。 旁注:这种说法也许不适用于在市场低估、投资人恐惧到高点处加仓的价值投资者,擅长反向思维的作空者。在市场上盈利,要在大多数时间顺着羊群的方向顺势而为,在拐点处止损,但如果一个交易策略追求相对多的交易机会且希望大多数时间持有仓位,那么上述说法我们也同意。 简单的说,该方法就是说固定一个窗口,例如窗口大小为N,在这段价格区间中,价格先达到上沿就标记1,先达到下沿就标记-1,到窗口结束都被碰到就标记0,也即三分类,其中,上下沿分别代表止盈、止损价,具体价位由动态预期波动率定义。 旁注:作者未给出预期波动率的具体算法,用波动率过滤市场噪音是非常常用的方法,也是很多交易策略成败的核心问题,此处大有可研究之处,标准差、ATR、Implied volatility等都可以试试;细思作者这个思路,由于大部分机构和专业投资者对止盈损的定义中,通过开仓价或某一重要技术位置如前低、前高、20日均线加上N倍波动率是一个经典设置,作者大有通过这个来反推市场上大部分参与者的止盈止损位的意思,这一方法是否适有于散户为核心的国内市场也需要注意,因大部分散户很少思考止盈、止损的问题,即使考虑止盈损也很少综合考虑市场波动率。

下注的大小和元标记(Meta-labeling)

考虑到波动性以及我们的止损和获利目标,我们有一些聪明的方法来标记价格是涨还是跌。但是我们仍然不知道我们应该下注多少(如果我们应该下注的话)Lopez de Prado提供了两步标记,其中一个标记负责方向,第二个标记负责这个赌注的确定性(赌注的大小):

  • 标记每个样本,使用动态阈值作为初始止损点并设置获利屏障(基本上我们想知道价格是先上升还是先下降)
  • 知道这一点后,我们想要根据我们预先设定的止损和获利目标来下注或不下注。因此,如果第一个标签上为“up”,检查我们是否也会达到获利目标,如果确认,我们将第二个标签设为1。如果我们有第一个标签为" down "并且我们将达到止损,我们仍然把它标记为1。只有当第一个标签的方向和止损或获利没有对应关系时,我们才会把它标为0。

The coolest part:

While preparing a dataset, we train on our set of features a model the predicts a side (label one). And we also train a second model, that has as input all previous features and label one as well. So after having the prediction of a direction from a first model, we want to know the level of a certainty with the second model — and based on its output that is from 0 to 1 — we make an appropriate bet. For example, if the first model says “up”, but second says something like 0.05, it means that even the price will go up, most probably we won’t hit the take profit goal.

记忆性和平稳性

As we know, before passing data into any machine learning model we need to normalize or standardize or make it stationary in some other way. When we talking about financial time series we mostly perform differentiation with some lag (usually lag 1 and we call it returns). It indeed makes time series stationary, but what happens with the information inside this time series that supposed to have some memory? It’s just wiped out! Why? Because of this differentiation of lag 1 looks just one bar behind and doesn’t know anything about what happened before and we do it consequently for all bars in our historical time window for the sake of stationarity. We still want to have a stationary time series, but without deleting all the useful memory in it… what if we only could differentiate it with an order less than 1…? And indeed we can and this is called fractional differentiation. I will leave more details to the main book or to other resources, let’s just believe for now that we can differentiate time series with lag 0.1, 0.3, or 0.75, which supposedly will give us a bit more memory.

让我们通过ADF检验来衡量对数price与不同种类的差异和平稳性之间的相关性:

输入神经网络

现在是时候看看当我们尝试用新的思路来为新的bars建模时会发生什么。使用非常简单的softmax回归作为分类算法,对收盘价、成交量和收益率进行标准化作为输入特征。Keras中的模型如下:

代码语言:javascript复制
main_input = Input(shape=shape, name='main_input')
x = Flatten()(main_input)
x = Dropout(0.25)(x)
output = Dense(3, activation = "softmax")(x)

Long window length is 100, short — 50, forecasting horizon — 25 bars accordingly. Threshold T = 0.01。

正如你所看到的,在集合之间有一些间隙,这被称为“embargo”,并有助于确保我们的模型在未来更加有效。稍后我们将详细研究它,现在让我们将其视为更现实的分割方案。为了解决类不平衡的问题,每个类的权重是基于训练和验证集计算的。

固定阈值vs波动阈值vs三重界线

我们的基线将只是预测价格的上升或下降或不超过阈值T。分类报告如下(0代表下降趋势,1代表不显著趋势,2代表上升趋势):

波动阈值:

结果越来越好。在精度/召回率上没有失调(这意味着分类器是公平的,随着算法本身和特征的改进,我们将在准确性上有值得信赖的提高),数据集不平衡现在不是那么关键。让我们现在来试试三重界线,在滚动T值下对应的获利和止损基于波动率,就像之前一样:

分数微分vs整数微分

replace returns in the set of features with fractionally differentiated log prices with d = 0.5 。

波动范围已经比“正常”微分好一点了:

最后,三重界线及元标签

我想我们确实可以证实,分数微分是一个非常有用的变换,它允许从原始时间序列中保存更多的信息!

结论

在这篇文章中,我们回顾并重新定义了过去在金融网站上看到的经典tick bars是如何创建的。我们发现了它们的统计特性,并且我们完全同意,成交量和成交额bars比基于时间bars更有吸引力。我们还构建了一些更现实的方法来根据不断变化的波动性对输出进行标记,并预定义了获利和止损目标。最后,我们回顾了一种方法,使金融时间序列平稳,而不失去所有的记忆。我们还用数据和标签对这些实验进行了评估,我们可以看到,这些有意义的改进确实使结果更加稳定。希望能给你一起启迪。

原文:

https://towardsdatascience.com/ai-for-algorithmic-trading-rethinking-bars-labeling-and-stationarity-90a7b626f3e1

0 人点赞