ppp12345 发表于 2024-3-23 07:57:05

期货量化交易软件:用置信区间估计未来效能

概述创建可以获利的自动化交易系统绝非易事。即使一个人碰巧开发出了一个可以获利的 EA 交易,也存在着是否值得风险的问题。我们可能会对我们的策略不会耗尽分配给它的所有资本感到满意,但这不是立即启用实盘交易的理由。最终,利润是动机,如果我们后来发现我们的策略确实能够获利,但利润不足以证明风险的合理性,或者相对于其他投资机会产生的回报很低,我们无疑会感到非常遗憾。因此,在本文中,赫兹量化将探索从统计学领域借来的技术,这些技术可以帮助我们使用从样本外测试中收集的数据来估计自动化交易系统的未来效能。
添加图片注释,不超过 140 字(可选)它足够好吗
当我们测试一个候选交易系统时,我们自然会得到各种效能指标的集合。这些数据会直观地告诉我们系统的利润潜力,但这种直觉可能还不够。一种在测试中产生大量利润的策略,在现场交易时获得的回报可能不太高。有没有办法更好地了解测试期间观察到的效能是否会继续保持在同一水平?如果没有,效能会有多差这就是标准统计方法可以提供帮助的地方。需要注意的是,赫兹量化将要讨论的技术并不意味着它们的估计是准确的,它们永远不会是准确的。它们所做的是提供方法来识别产生很高或可接受利润的高概率策略我见过许多人使用粗略的夏普比率数据来对未来性能进行基于概率的假设。记住,这是危险的,过去的业绩并不能预示未来的利润。金融市场不容轻视。价格图表以这样或那样的方式翻转,通常是出于未知的原因。我们想要做的是计算适当的基于概率的效能预测,我们可以将其应用于决策过程中。
置信区间

添加图片注释,不超过 140 字(可选)
置信区间是指数据集或总体的某个统计数据在一定时间内位于某个范围内的概率。他们通过计算所计算的水平包含所估计的真实统计数据的概率来衡量确定程度。统计学家通常使用90%的置信水平,最高可达99%。可以使用各种方法来计算这些间隔。在这篇文章中,赫兹量化将集中讨论一些常见的自举法(bootstrap)技术。
自举法
统计中的自举是一种过程,通过从原始数据中随机挑选数据,使用数据集来创建许多其他新数据集。新数据集将具有与原始数据集相同的成员,但新数据集中的某些成员将是重复的。
原始 自举1 自举2 自举3 自举4
A A A A B
B A B B B
C B B B C
D C D C D
E D E C E
上表更好地说明了这一点。原始列具有原始数据集,其他列表示由原始数据集构建的数据集。可以看出,自举的列有一个或多个重复项。通过多次这样做,赫兹量化能够生成大量数据,这些数据可以代表我们目前无法观察到或未知的样本。我们已经在“应用蒙特卡罗方法优化交易策略”一文中看到了应用于交易的自举程序示例。自举理论的核心是,原始数据集应该代表更大的数据集合,即无法观察并试图建模的群体。因此,当赫兹量化创建这些自举时,它们会成为不可观测集合的代理。这些自举和原始样本的统计特性可用于得出未知和/或不可观测群体的结论。
自举置信区间将演示自举置信区间的三种方法。即枢轴法、百分位法和最后的偏差修正加速法(bca)枢轴法(pivot method)涉及生成大量的自举,这些自举将用于计算测试统计数据。测试统计指的是我们试图估计的数据集的任何特征,这可能是其平均值或中位数。然后,通过相对于将引导样本的期望值增加到原始数据集所需的值来调整原始数据集的测试统计值,来找到估计的边界百分位数方法(percentile method)考虑引导样本的计算测试统计数据的分布。这种分布被认为与未知数据的分布相似。界限变为从引导样本获得的计算测试统计数据的分布的百分位数之间的间隔。 偏差修正加速法(bias corrected and accelerated method,bca)稍微复杂一些。在生成我们的自举并计算每个自举的测试统计数据之后。赫兹量化计算偏差校正因子,即自举估计的比例小于原始数据集的比例。然后,通过使用一种称为 jackknife 的方法来计算加速度系数。这是另一种重采样方法,用于估计变换后的测试统计量的方差取决于其值的程度。然后使用百分位法计算下限和上限,根据偏差校正和加速度因子对下限和上限进行修改。最后的置信区间是从排序后的修改值中获得的。让我们看看如何在代码中实现这些技术。
CBoostrap 类CBoostrap是一个类,它封装了使用刚才描述的三种引导方法计算置信区间。有了它,用户将能够计算多个可配置概率的置信区间,还能够指定要生成的自举次数。#include<Math\Alglib\specialfunctions.mqh>#include<Math\Stat\Math.mqh>#include<UniformRandom.mqh>类的定义从包含标准库中的一些基本数学工具开始。//+------------------------------------------------------------------+//|Function pointer                                                |//+------------------------------------------------------------------+typedef double(*BootStrapFunction)(double &in[],int stop=-1);BootStrapFunction 函数指针定义了用于计算测试统计或总体参数的函数签名。//+------------------------------------------------------------------+//|Boot strap types                                                |//+------------------------------------------------------------------+enum ENUM_BOOSTRAP_TYPE{   ENUM_BOOTSTRAP_PIVOT=0,   ENUM_BOOTSTRAP_PERCENTILE,   ENUM_BOOTSTRAP_BCA};ENUM_BOOSTRAP_TYPE 枚举便于选择特定的自举计算方法:即Pivot、Percentile或BCA。//+------------------------------------------------------------------+//|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   if(ArrayCopy(m_data,in_samples)!=ArraySize(in_samples))   {      Print("Data Copy error ", GetLastError());      m_initialized=false;   }//--- initialize shuffled buffer   if(ArrayCopy(m_shuffled,in_samples)!=ArraySize(in_samples))   {      Print("Data Copy error ", GetLastError());      m_initialized=false;   }//--- set memory for bootstrap calculations container   if(ArrayResize(m_rep_cal,(int)m_replications)!=(int)m_replications)   {      Print("Memory allocation error ", GetLastError());      m_initialized=false;   }//--- check function pointer   if(m_function==NULL)   {      Print("Invalid function pointer");      m_initialized=false;   }}CBoostrap 有一个带参数的构造函数,它的输入参数决定了自举操作的方式:
boot_type- 设置自举计算的方法
nboot- 表示将生成的所需自举样本的数量,建议至少有100个,但更理想的情况是生成数千个,以获得稳健的结果。
function -将指向用户提供的用于计算正在估计的总体参数的函数定义。该函数的参数是用于计算测试统计的数据样本的数组。函数指针的默认整数参数定义了将在计算中使用的数组成员数。
最后,in_samples数组是将从中生成自举的数据容器。这个相同的数据集和它的自举变体将被传递给函数指针,以计算测试统计数据。
页: [1]
查看完整版本: 期货量化交易软件:用置信区间估计未来效能