股票量化交易软件:将概率论应用于缺口交易

本文延续作者之前文章中开始的话题:在交易中应用概率论和数理统计。 赫兹股票量化将研究运用相应的方法来创建并测试交易策略。

首先,赫兹股票量化将探索这种交易的可能性,即检测来自随机漫游假想的偏差。 事实证明,如果价格表现为零漂移随机漫游(没有方向趋势),那么盈利交易是不可能的。 这为寻找反制这一假想的方法提供了基础。 如果找到一种反制该假想的方法,我们也许会尝试运用它来制定交易策略。
赫兹股票量化还将继续研究我们在之前发表的文章中开始的风险主题。 进而,我们将它们作为 第一 和 第二 参考文章。
由于赫兹股票量化的方法基于概率论,因此建议理解其基础,但这并非强制性的。 重要的是理解概率方法的本质 − 越是系统和经常性地使用它们,得到的结果越可观和明显(由于大数定律)。 当然,它们的应用要充分论证。
有关智能交易系统的一般性注意事项
开发 EA 大致可分为三个阶段:
产生思路。
运用各种简化验证思路。
令思路适配市场现实。
本文将主要探讨第二阶段,令赫兹股票量化能够更加彻底地契合所述主题。 此外,在论坛上针对这个阶段的讨论比其它阶段更频繁。
我们来描述已实现的简化。 我们将 EA 限定在仅交易单一资产。 赫兹股票量化假设资产价格以账户货币表示。 我们将排除非交易操作(如账户中的利息和资金存取),并且不会考虑不同类型的订单(仅按市价进行买卖)。 我们将在执行订单时忽略滑点,且将点差(s)视为固定数值。 我们还假设由 EA 管控我们账户上的所有资金,并且没有其它 EA 参与干扰。
通过所有这些简化,EA 操作结果确定无疑地定义为 v(t) 函数 − 取决于时间的持仓量。 正数值 v(t) 对应买入,而负数值对应卖出。 此外,p(t) (资产价格) 函数和 c0 (初始资金)。 下图展示了可能的 v=v(t) 持仓图表。

编辑
买入价格和卖出价格之间的算术平均值。
v(t) 和 p(t) 是分段常数(步进)函数,因为它们的值是一些最小增量步长的倍数。 如果需要更严格的数学定义,则可以认为它们自右侧是连续的,并且在左侧的缺口处有限制。 赫兹股票量化假定 v(t) 缺口点数永远不会匹配 p(t)。 换言之,任意时刻至多改变两者当中其一的数值 − 价格或持仓量,或两者都保持不变。 值得注意的是,价格或交易量可能发生变化的时间点,也是某个最小步长的倍数。
根据这些数据,赫兹股票量化可以找到 c(t) 函数 − 取决于时间的资金数值。 它被定义为我们在 t 时刻平仓情况下由 EA 管控的账户部分的余额值。 由于我们在账户上只有一个 EA,因此该数值与 赫兹股票量化中定义的账户净值一致。
定义 c(t) 在 t 时刻的变化。 如果此时的交易量和价格没有变化,那么它自然为零。 如果价格变化,资金的增长等于交易量乘以价格增量的乘积。 如果交易量发生变化,则可能有两种选项 − 当绝对持仓量减少时,资金保持不变,当它增长时,资金降低的额度等于点差与交易量变化绝对值的乘积。 换言之,如果一笔持仓部分平仓,净值不会变化,而加仓则会导致净值略有下降。 所以,c(t) 在 t 时刻的资金数值等于 c0=c(0) 之总合,且其所有变化都是从零时刻直至 t。
在开发我们的风险理论时(在之前的两篇文章中),赫兹股票量化使用了“交易(deal)”的概念。 这个概念与 赫兹股票量化中所谓的“成交(deal)”并不完全吻合,更多的对应于那里所谓的“交易(trade)”。 确切地说,它对应于我们所说的简单仓位。 根据我们的定义,一笔简单仓位是由开仓和平仓的时刻决定的。 它的交易量和方向在那些时刻之间保持不变。 下面是一笔简单仓位的样本 v=v(t) 图表。

编辑
任何仓位(因为它总是分段常数)可以想象为简单仓位的总和。 这种表示可以由无数种方式完成。 下图展示了由两种不同方式表示的单笔仓位,即简单仓位的总和。 初始仓位以蓝色显示,而所有交易以绿色和红色分开显示。 当采用 赫兹股票量化 中的成交概念时,赫兹股票量化还有另一种选择。 这些方法中的每一种都非常合理。

编辑切换为居中
有些 EA,采用这样表示没有多大意义。 例如,可能有些 EA,其仓位递增,之后再递减。 与此同时,还有些 EA,采用这样表示则非常自然。 例如,一笔持仓可以由一系列在时间上不相交的简单仓位组成。 下图包含此类持仓的示例。

编辑切换为居中
每笔交易(简单仓位)后的资金相对变化 c1/c0 表示为两个数值 − 盈利能力 a 和风险 r: c1/c0=1+ra。 盈利能力等于交易期间的价格上涨与入场价格和止损之间差值的比率,而风险与交易量成比例,且意味着在止损确切激活的情况下将亏损的资金份额。
所以,替代研究 v(t), p(t) 和 c(t) 时间函数,赫兹股票量化转向分析表征交易顺序的数字序列。 这极大地简化了进阶研究。 特别是,当处理不确定性的概率模型时,我们能避免在有限随机变量集合上应用自我限定随机过程理论。
针对资产价格行为与交易结果,概率论是一种普遍接受的不确定性数学建模方法。 根据这种方法,我们应考虑将 v(t), p(t) 和 c(t) 函数作为一些随机过程的具体实现(轨迹)。 一般而言,这项任务实际上是无法解决的。 主要原因是缺乏准确描述价格行为的契合概率模型。 因此,考虑可能的解决方案的特殊情况是有意义的。 如上所述,在本文中,赫兹股票量化将考虑由 EA 形成的仓位可以恰如其分地表示为一系列简单仓位(交易)。
值得一提的是与 EA 相关的另一个问题 – 参数。 详研究虑它们对于在 EA 开发过程实现一些形式化(标准化)将会很有用。 我们将参数分为三种类型:
历史参数。 EA 操作期间,可能会在一笔交易至另一笔交易时变化的参数。 这些是指标值,日间时刻,新闻数据,月相等。 一般来说,它们是时间函数,就像价格或持仓量一样。 在应用简化的情况下,我们可将它们视为已知的达成交易时刻的数字序列。 每个特定交易的参数(方向,交易量,止损和止盈)基于历史参数的数值来定义。
实际参数。 赫兹股票量化简单地称它们为短暂参数。 它们在 EA 开始交易时设置,并且只能在测试和优化 EA 时应用。
元参数设置 EA 优化算法,例如,自定义优化条件参数。 假设我们想要通过两个条件来优化 EA,尽管仅能逐一来完成。 我们将两个原始条件形成一个新条件,并取它们的一些权重总和。 这些权重作为元参数。
例如,在下面描述的基于缺口的 EA 中,最小缺口是 EA 参数,而每个特定缺口的大小是历史参数。 在这种情况下,元参数可以包括优化条件编号(我们假设条件以某种顺序编号,例如,按照利润优化是#1,而按照回撤优化是#2,等等)。
在本文中,我们将使用与历史参数相关的一个重要简化。 当我们谈论交易的回报分布时,通常可能取决于这些参数。 我们假设这种依赖性是微不足道的。 主要原因是考虑到这种依赖性通常令模型过度复杂化,最终可能导致过度拟合。
交易策略是反制随机漫游假想的一种尝试
我们已经提到缺乏描述价格行为的准确模型。 然而,近似的模型也可能有用。 例如,存在一种众所周知的价格行为模型,视其价格作为零漂移的随机漫游(没有定向趋势)。 该模型称为 随机漫游假想。 根据这一假想,如果我们考虑到点差,任何 EA 的平均利润均为零或小有亏损。
证明不可能在随机漫游中赚钱是相当困难的,因为它需要涉及随机过程理论的复杂数学装置(伊藤演算,停止时间, 等等)。 一般来说,它归结为这样的陈述,即在没有趋势的随机漫游交易时,资本是 鞅(martingale)(概率论,不要与赌博系统的 马丁格尔(martingale) 混淆)。 鞅是一个随机过程,其平均值(数学期望)不随时间变化。 在我们的例子中,这意味着任何时候资本数值的数学期望等于其初始值。
因此,我们开始研究交易思路时,应搜索随机漫游的统计数据中的明显价格偏差。 为此,我们将使用概率论和数理统计中的思路,但首先,我们做一些观察:
任何这种解决方案本质上都是概率性的 − 我们的结论总是会有一些非零概率是错误的。
如果我们的方法没有检测到偏差,这并不意味着它们完全没有。 也许,其它一些方法会检测到它们。
统计上明显的偏差并不能保证获得统计上显著的正盈利 − 偏差的存在是必要的,但不是充分条件。
我们来构建一个搜索随机漫游偏差的方法。 为此,我们考虑一些随机变量,我们将依据采用实际价格形成的样本建立经验概率分布。 此外,假设价格行为是随机漫游,我们将构建相同数值的理论概率分布。 比较这些分布,我们将决定反制(或不可能反制)随机漫游假想。
我们lai1构建一个合适数值的示例。 假设在 t0 初始时刻,价格等于 p0。 我们取其它 p1 价格值不等于 p0。一直等到价格抵达数值 p(t1)=p1 的 t1 时刻。 我们在 t0 and t1 时间段中搜寻价格 p2,其距价格 p1 最远。 我们引入数值 K=(p2-p0)/(p0-p1)。 p1<p0≤p2 或 p2≤p0<p1 条件永远有效,因此在任意时间 K≥0。 下面提供了解释这一思路的图表。 蓝线代表 p0 价位,而它与价格图表的交叉时刻是 t0。 红线代表 p1 价位,它在 t0 之后触及图表的时刻为 t1。 绿线代表 p2 价位,位于距 p1 尽可能远的地方。

编辑
数值背后的思路很简单。 假设我们在 t0 入场交易。 在价位 p0 卖出,而 p1, p1>p0 − 止损。 p2 是止盈的最低可实现价格,而 K 是交易中可实现的最高利润。 实际上,我们在执行交易时并不知道确切的 K 值。 在这种不确定性的概率模型框架内,我们只能谈论知晓的概率分布形态。 假设我们知晓 Fk(x) 概率分布函数,其定义为 K<x 的概率。 假设我们使用某个 pk 价位作为止盈: pk-p0=k(p0-p1)。 在此情况下,Fk(k) 等于触及止损先于止盈的概率。 相应地,1-Fk(k) 等于先激活止盈的概率。 现在让点差等于零。 那么,在止损激活的情况下,盈利能力等于 -1,而在止盈激活的情况下,它等于 k。 这种交易中的数学期望:M=(-1)*Fk(k)+k*(1-Fk(k))=k-(k+1)*Fk(k),如果 Fk(k)=k/(k+1) 其等于零。
如果我们知道方程式 Fk(x),我们甚至可以执行 EA 的初步优化。 例如,我们可以寻找最优的止盈/止损比率,令交易盈利能力的数学期望最大化。 然后我们可以在交易中找到最优风险值。 因此,EA 甚至可以在就绪之前进行优化。 这样可以节省时间,并可令您在早期阶段舍弃明显不合适的思路。
如果我们假设价格表现得像没有趋势的随机漫游,那么 K 数值的分布则由 Fk(x)=Fk0(x) 分布函数设置,其中 Fk0(x)=0 如果 x≤0 以及 Fk0(x)=x/(x+1) 如果 x>0。 为了更加确定,我们可以假设这里使用的随机漫游是一个零漂移的维纳(Wiener)过程(无趋势)。 正如我们所看到的,如果满足随机漫游假想并且点差等于零,则在任何止盈/止损比率下,盈利能力的数学期望等于零。 在非零点差的情况下,它是负数。
替代 K,我们可以考虑数值 Q=K/(K+1)=(p2-p0)/(p2-p1),K=Q/(1-Q)。 这一数值可表示为止盈与(止损 + 止盈)的比率。 它更方便,因为它取自 [0;1) 间隔内的数值,并且在随机漫游的情况下它具有比 K 更简单的分布(在此间隔内均匀)。
接下来,我们将主要讨论 Q 值。 我们来考察如何构造和应用其经验分布函数 Fq(x)。 假设我们有一个交易思路,我们检查价格历史。 我们有 n 个入场点的集合。 入场价格 p0,i 和止损 p1,i,其中 i=1,...,n,为它们当中的每一个定义。 现在我们应定义这个思路是否具有一定的盈利潜力。 对于每笔交易,我们应搜索尽可能远离止损的价格 p2,i,直到激活时刻。 基于此价格,我们得到了 n 个样本 Qi=(p2,i-p0,i)/(p2,i-p1,i), i=1,...,n。 由该样本构建的经验分布函数由 Fq(x)=m(x)/n 方程定义,其中 m(x) 等于 Qi 样本元素小于 x 的数量。 如果价格行为表现得像没有趋势的随机漫游(零漂移维纳(Wiener) 过程),Q 数值的 Fq0(x) 分布函数看起来很简单: Fq0(x)=0 如果 x≤0,Fq0(x)=x 如果 0<x≤1,以及 Fq0(x)=1 如果 x>1。
如果 Fq(x) 与随机漫游的理论分布函数 Fq0(x) 有显著差异,我们需要在盈利能力方面检查这种差异的重要性。 如果即使考虑到点差,盈利能力也足够正面,那么是时候选择适当的止盈/止损比率了。 这可以通过最大化盈利预期来实现。 之后,我们可以为每笔交易的风险值选择一个最优值,然后初步测试这一思路。 如果结果很正面,那么继续创建实际的交易 EA 就有意义了。 接下来,我们将尝试在实际操作中展示此算法。
问题升级了 – 如何运用随机漫游进行类似的比较,以便获得更复杂的离场算法。 通常答案与上面研究的状况相同。 主要障碍是随机漫游的利润分布只可在极少数情况下以分析形式获得。 但总是可以使用蒙特卡罗模拟方法得到其经验近似。