文章 "运用 R-平方 评估策略余额曲线的品质" - 页 4

 

如果不处理异常值--异常值检测,关于某些统计关系的结论可能是不正确的。

 
Dennis Kirichenko:

如果不进行异常值检测,关于某些统计关系的结论可能是错误的。

如果将 R^2作为优化(OnTester) 的标准,那么任何对 LR 残差及其系数的分析都将被取消。

由于额外的分析会增加优化的宝贵时间,而且用处不大,因此情况不会发生重大变化: 同样的 "平滑 "权益曲线会出现在顶端,而这正是最初所希望的。

 
СанСаныч Фоменко:

作者完全不了解偶然过程。文章的所有结论都与偶然性的概念无关,误导了人们。

让我来解释一下这个观点。

文章一开始就给出了一个定义:

线性回归 是一个变量y 与另一个自变量x 的线性关系,用公式y = ax+b 表示。在这个公式中,a 是乘数,b 偏差系数。

线性回归不是 用公式表示的

y = ax+b是线性方程式

而是用公式表示

y = ax+b + 误差

误差必须是正态分布的,如果不是正态分布,就会出现许多细微差别,从而极大地限制了线性回归的应用。

必须认识到,与线性方程不同,线性回归系数 不是常量,而是偶然值,这一点极为重要。如果使用标准线性回归拟合(如 R),那么对于线性回归系数,总是会指定与该系数值的偏差以及概率(在 "没有证据证明该系数 "的零假设中的概率)。再次强调:与线性方程不同,线性回归系数可能根本不存在。这就是为什么文章中讨论的 R2 系数只有在回归系数不存在的概率低于 10%时才有意义。在金融序列方面,我从未见过线性回归系数是有意义的,因此可以使用这种线性回归。

桑-桑尼奇,不要干涉。我们按自己的想法来!

p.s. 很明显,您是对角阅读的。R^2 不是为报价图表计算的,而是为股本计算的。它的主要任务是显示平均股本。就是这样。至于它是否与随机相对应,则由用户自己决定:

fxsaber:

如果我们将 R^2 作为优化(OnTester)的标准,那么任何对 LR 残差及其系数的分析都将见鬼去吧。

由于额外的分析会增加优化的宝贵时间,而且用处不大,因此情况不会发生重大变化: 同样的 "平滑 "股本曲线将位于顶端,而这正是最初所希望的。

+
 

总之,错误的标志是从这里开始的:

我们以 100 000 美元起步,佣金为 0。交易总额 +513,但总余额为 99 755.90,即少了 757.1 美元。

这是怎么回事?

 
Vasiliy Sokolov:

简而言之,这里的标志是错误的:

我想重述一下。关于符号正确性的评论涉及一般情况,而不仅仅是公平。如果像你所做的那样,用公平来比较第一个值和最后一个值,那么在这种情况下,不正确的符号很可能会被打败。最好还是处理一般情况。

我们以 100 000 开始。交易总和 +513,但总余额为 99 755.90,即少了 757.1 美元。

这是怎么回事?

HTML 报告有助于理解。

 
fxsaber:

我想重述一下。关于符号正确性的评论是针对一般情况的,而不仅仅是衡平法。如果像您那样,用公平来比较第一个值和最后一个值,那么在这种情况下,符号的不正确性很可能就不成立了。最好还是处理一般情况。

HTML 报告有助于理解。

不幸的是,它显示的结果与余额相同。两种情况下的总数完全一致:+513$。但在一般情况下,它们应该是一致的,因为在测试之后,所有交易都会关闭,资产净值会与余额进行比较。

fxsaber:

HTML 报告有助于理解。

我现在就发送。

 

我知道了。我忘了把掉期计算在内(没有总结掉期利润)!

 

已完成。修复了余额计算功能。现在每笔交易都会考虑掉期:

//+------------------------------------------------------------------+
//| 返回根据策略平衡计算得出的 R^2 分数。
//+------------------------------------------------------------------+
double CustomR2Balance(ENUM_CORR_TYPE corr_type = CORR_PEARSON)
{
   HistorySelect(0, TimeCurrent());
   double deals_equity[];
   double sum_profit = 0.0;
   int current = 0;
   int total = HistoryDealsTotal();
   for(int i = 0; i < total; i++)
   {
      ulong ticket = HistoryDealGetTicket(i);
      double profit = HistoryDealGetDouble(ticket, DEAL_PROFIT);
      double swap = HistoryDealGetDouble(ticket, DEAL_SWAP);
      if(profit == 0.0 && swap == 0.0)
         continue;
      if(ArraySize(deals_equity) <= current)
         ArrayResize(deals_equity, current+16);
      sum_profit += profit + swap;
      deals_equity[current] = sum_profit;
      current++;
   }
   ArrayResize(deals_equity, current);
   return CustomR2Equity(deals_equity, corr_type);
}

修正了权益计算,使其最终值与实际结果同步:

//+------------------------------------------------------------------+
//|| 增加公平监测|
//+------------------------------------------------------------------+
double CStrategyList::OnTester(void)
{
   switch(m_custom_type)
   {
      case CUSTOM_NONE:
         return 0.0;
      case CUSTOM_R2_BALANCE:
         return CustomR2Balance(m_corr_type);
      case CUSTOM_R2_EQUITY:
      {
         double equity[];
         m_equity_exp.GetEquityArray(equity);
         int total = ArrayResize(equity, ArraySize(equity)+1);
         equity[total-1] = AccountInfoDouble(ACCOUNT_EQUITY);
         return CustomR2Equity(equity, m_corr_type);
      }
   }
   return 0.0;
}

由于权益收集间隔可能很大,最后的已知值可能与实际值不同。因此,我们增加了一个与最终结果相同的最后值。

附注:文章已作更正。文章已送交版主更新。
 
Vasiliy Sokolov:

我知道了。我忘了把掉期计算在内(掉期与利润不相加)!

我会继续不考虑

关于交易、自动交易系统和交易策略测试的论坛。

讨论文章 "R-平方作为策略平衡曲线质量的评估"

fxsaber, 2017.10.24 15:18

计算 "权益 "的代码,适用于 R^2。以 MT4 风格编写,翻译成 MT5 并不难...

static double GetOrderProfit( void )
  {
    return((OrderProfit()/* + OrderCommission() + OrderSwap()*/) / OrderLots()); // 佣金和交换有时可以忽略
  }

掉期几乎与 TS 盈利能力评估无关,只会在评估稳健性时引入扭曲。

 
fxsaber:

我会继续无视

掉期与评估 TS 的盈利能力几乎毫无关系,只会在评估稳健性时造成扭曲。

这是一个有争议的说法。但这根本不是重点。这只是边界条件。掉期规模并不大,但当它接近于零时,其记账与否会影响最终的符号。