文章 "交易中的数学:夏普(Sharpe)和索蒂诺(Sortino)比率" - 页 2

 
Ivan Titov #:
我对 Sharpe.mqh 只计算年度夏普比率的理解正确吗?月度 Sortino 不起作用?

这篇文章包含您问题的答案。

 
Andrey Khatimlianskii #:

再说一遍,什么是 "低数字"?在我看来,70-80 分是低分,但这样的传球不会被罚下。

这些数字是与其他传球相比的吗?

是否根据测试间隔的长度进行了归一化处理?

很有可能是设置了某个固定值,否则就需要多次重新计算整个结果表。

我同意您的上述论点。

 
Andrey Khatimlianskii #:
两者一致,但并不总是一致

如果在测试仪中设置周时间框架,它们几乎总是不一致:

在月时间框架上,两者的差距更大:


 
Rashid Umarov #:

这篇文章包含了您问题的答案。

我没有在文章中找到问题的答案,但从 Sharpe.mqh 代码来看,其中并没有 Sortino。因此,我在下面附上了修正后的代码,其中包含了 Sortino 计算选项。同时,我还优化了代码中不必要的函数调用。

在我看来,Sortino 系数的缺点在于计算时只考虑低于无风险利率(本例中为零)的收益率。但是,如果某一时期的正收益率低于测试策略的计算平均值,也是一种风险。这就是为什么我增加了一个系数计算,只考虑低于平均值的收益。我还没有找到类似的系数,所以谦虚地将其命名为 Titov 系数))。找到后,我会重新命名。

在原版中,计算周期取决于当前时间框架,这很不方便。因此我增加了设置计算周期的功能(如果没有明确设置,则以当前时间框架为准):

Returns.SetTF(PERIOD_MN1);

我在任何资料中都没有找到在计算夏普比率时使用收益率对数并将其转换为年值的必要性。这就是为什么我增加了禁用这些选项的可能性。

由于某些原因,文章中的示例忽略了收益为零的时期。这就扭曲了结果。因此,我添加了一个选项,在计算中包含这些时期。

与原文一样使用夏普比率计算的示例:

#include <Sortino.mqh>
CReturns Returns;

..

void OnTick()
{
        Returns.OnTick();
        ..
}


double OnTester(void)
{
        return(Returns.OnTester(DEF_SHARPE));
}

在其他条件相同的情况下计算 Sortino 系数的示例:

#include <Sortino.mqh>
CReturns Returns;

..

void OnTick()
{
        Returns.OnTick();
        ..
}


double OnTester(void)
{
        return(Returns.OnTester(DEF_SORTINO));
}

就我个人而言,我决定按月评估低于平均收益率的风险:

#include <Sortino.mqh>
CReturns Returns;

..

int OnInit()
{
        Returns.SetTF(PERIOD_MN1);
        ..
}


void OnTick()
{
        Returns.OnTick();
        ..
}


double OnTester(void)
{
        return(Returns.OnTester(DEF_TITOV, false, false, false));
}
附加的文件:
Sortino.mqh  10 kb
 
Ivan Titov #:
我没有在任何资料中发现在计算夏普比率时需要使用收益的对数。

引用一段话来回答

严格来说,在计算夏普比率时使用收益率的对数并不是必须的,但对于简化计算和改善数据的统计特性很有用,尤其是在处理长周期或波动性很大的资产时。通常使用对数收益率是因为它们能更好地接近收益率的正态分布,并在编制投资组合时简化计算。

我想补充一点--试试不使用对数,然后告诉我不寻常的副作用。你应该会遇到的。

 
Ivan Titov #:
我没有在任何资料中找到计算夏普比率并使其达到年化值的必要性。

另一段话

至于将夏普比率调整为年化值,这是为了使该比率标准化,以便在不同的投资策略和投资组合之间进行比较,而不考虑投资的原始时间范围。这是一种常见的做法,有助于投资者根据共同的标准衡量投资业绩,特别是在不同资产类型或不同交易频率的策略之间进行比较时

 
Rashid Umarov #:
我引用一段话作为回应

我所说的资料来源,是指本文之外有关夏普比率和索蒂诺比率的信息。

Rashid Umarov#:
至于夏普比率的年化值,这样做是为了使该比率标准化,以便在不同的投资策略和投资组合之间进行比较,而不考虑投资的原始时间范围。
夏普比率是特定时期各部分的平均收益与相同部分的标准差之比。也就是说,分段的长短对于比较不同策略的可能性并不重要。在我看来,为了消除不必要的噪音,最好选择比交易平均持续时间长几倍的长度。
Rashid Umarov#:
尝试不使用对数,并告诉我不寻常的副作用。您应该会遇到

我试过了:没什么异常。但我发现了一个错误,现附上更正后的版本。

附加的文件:
Sortino.mqh  10 kb
 
Rashid Umarov #:

我引用一段话作为回应

我自己再补充一句--试试不加对数的情况,然后告诉我不寻常的副作用。你应该会遇到的。

奇怪的是,对于这种股票,这个脚本给出的夏普值是 2.08:

而这个脚本(同样是再投资)的夏普值为 3.66:

尽管很明显,第二种股票的质量更差(再投资总是会降低股票的质量)。

如果我们不使用股票增量的对数,而是使用增量本身:

         log_return = (m_equities[i] - prev_equity); // 递增 
         //log_return = MathLog(m_equities[i] / prev_equity); // 递增对数

我们可以得到第一笔投资的对数是 3.85,第二笔投资的对数是 2.1。这样就更合理了。

 
此外,对数夏普在很大程度上取决于初始存款的规模。在上述示例中(净值 1),初始入金为 4000,夏普值为 2.08;入金为 400000,夏普值为 3.83。尽管权益的形状没有发生任何变化(以固定手数进行交易)。
 

只有在进行再投资交易时,对数的夏普才不取决于存款额。

但在这种情况下,简单增量的夏普并不取决于存款规模。

因此,我不明白为什么要使用对数夏普。