概述创建可以获利的自动化交易系统绝非易事。即使一个人碰巧开发出了一个可以获利的 EA 交易,也存在着是否值得风险的问题。我们可能会对我们的策略不会耗尽分配给它的所有资本感到满意,但这不是立即启用实盘交易的理由。最终,利润是动机,如果我们后来发现我们的策略确实能够获利,但利润不足以证明风险的合理性,或者相对于其他投资机会产生的回报很低,我们无疑会感到非常遗憾。因此,在本文中,我们将探索从统计学领域借来的技术,这些技术可以帮助我们使用从样本外测试中收集的数据来估计自动化交易系统的未来效能。它足够好吗当我们测试一个候选交易系统时,我们自然会得到各种效能指标的集合。这些数据会直观地告诉我们系统的利润潜力,但这种直觉可能还不够。一种在测试中产生大量利润的策略,在现场交易时获得的回报可能不太高。有没有办法更好地了解测试期间观察到的效能是否会继续保持在同一水平?如果没有,效能会有多差这就是标准统计方法可以提供帮助的地方。需要注意的是,我们将要讨论的技术并不意味着它们的估计是准确的,它们永远不会是准确的。它们所做的是提供方法来识别产生很高或可接受利润的高概率策略我见过许多人使用粗略的夏普比率数据来对未来性能进行基于概率的假设。记住,这是危险的,过去的业绩并不能预示未来的利润。金融市场不容轻视。价格图表以这样或那样的方式翻转,通常是出于未知的原因。我们想要做的是计算适当的基于概率的效能预测,我们可以将其应用于决策过程中。( h% P Q& u" {, s7 Y; }! j: X
自举置信区间将演示自举置信区间的三种方法。即枢轴法、百分位法和最后的偏差修正加速法(bca)2 T! L0 \0 R$ g9 X* {( W
枢轴法(pivot method)涉及生成大量的自举,这些自举将用于计算测试统计数据。测试统计指的是我们试图估计的数据集的任何特征,这可能是其平均值或中位数。然后,通过相对于将引导样本的期望值增加到原始数据集所需的值来调整原始数据集的测试统计值,来找到估计的边界
9 z' ~( Q6 k+ i) u" K百分位数方法(percentile method)考虑引导样本的计算测试统计数据的分布。这种分布被认为与未知数据的分布相似。界限变为从引导样本获得的计算测试统计数据的分布的百分位数之间的间隔。6 l+ D* n B: m; X, a; k2 G
偏差修正加速法(bias corrected and accelerated method,bca)稍微复杂一些。在生成我们的自举并计算每个自举的测试统计数据之后。我们计算偏差校正因子,即自举估计的比例小于原始数据集的比例。然后,通过使用一种称为 jackknife 的方法来计算加速度系数。这是另一种重采样方法,用于估计变换后的测试统计量的方差取决于其值的程度。
, h2 z; p7 j4 V- V; w [: _然后使用百分位法计算下限和上限,根据偏差校正和加速度因子对下限和上限进行修改。最后的置信区间是从排序后的修改值中获得的。让我们看看如何在代码中实现这些技术。CBoostrap 类CBoostrap是一个类,它封装了使用刚才描述的三种引导方法计算置信区间。有了它,用户将能够计算多个可配置概率的置信区间,还能够指定要生成的自举次数。+ f! S1 J8 I" S' y# y
#include<Math\Alglib\specialfunctions.mqh>#include<Math\Stat\Math.mqh>#include<UniformRandom.mqh>' V1 T2 r" l) ?) R$ w. W; u
类的定义从包含标准库中的一些基本数学工具开始。6 L) h3 _1 |1 N4 T
//+------------------------------------------------------------------+//|Function pointer |//+------------------------------------------------------------------+typedef double(*BootStrapFunction)(double &in[],int stop=-1);
2 C6 {( M9 T3 |" I3 }- i B. {BootStrapFunction 函数指针定义了用于计算测试统计或总体参数的函数签名。+ x' ]$ _5 [# o% E
//+------------------------------------------------------------------+//|Boot strap types |//+------------------------------------------------------------------+enum ENUM_BOOSTRAP_TYPE { ENUM_BOOTSTRAP_PIVOT=0, ENUM_BOOTSTRAP_PERCENTILE, ENUM_BOOTSTRAP_BCA };' w f" @* A( X# z' y
ENUM_BOOSTRAP_TYPE 枚举便于选择特定的自举计算方法:即Pivot、Percentile或BCA。$ T/ z( s3 w0 E9 Z. p
//+------------------------------------------------------------------+//|Constructor |//+------------------------------------------------------------------+CBootstrap::CBootstrap(const ENUM_BOOSTRAP_TYPE boot_type,const uint nboot,const BootStrapFunction function,double &in_samples[]) {//--- set the function pointer m_function=function;//--- optimistic initilization of flag m_initialized=true;//--- set method of boostrap to be applied m_boot_type=boot_type;//--- set number of boostrap iterations m_replications=nboot;//---make sure there are at least 5 boostraps if(m_replications<5) m_initialized=false;//--- initilize random number generator m_unifrand=new CUniFrand(); if(m_unifrand!=NULL) m_unifrand.SetSeed(MathRand()); else m_initialized=false;//--- copy samples to internal buffer |