设定任务: 主题与方法
最重要的问题就是, 拉布谢尔资金管理系统是否真的能够把一个数学期望转化为真正的盈利方法. 当然, 引用的段落中提到的大约 33% 的胜率就输赢临界点听起来有些不可思议. 但是, 也许49% 或者 50% 的胜率就足够了?如果不是的话, 拉布谢尔系统有哪些其他优势呢?赫兹量化软件
我们将会使用统计学, 也就是说我们需要开发一个MQL程序(本例中是MQL4, 我还没有完全掌握MQL5). 让我们的程序来进行数以百万计的交易, 并且"清空"成千上万的存款 - 我们将会在不损坏我们真正资金的情况下分析结果. 如果程序可以盈利, 将有可能在真实交易中实现这算法.赫兹量化软件
拉布谢尔系统的开发是基于输赢比率相同的假定的. 其他比率情况下也可以采用此系统, 但是这看起来不大合理. 如果此系统可以影响输赢比率相同的数学期望, 它也应该影响其他的比率. 如果不能的话, 我们只是简单地浪费时间思考了一个合适的适应方案.赫兹量化软件
另外, 我们可以把输赢相同的系统想像成50%赢率的系统, 这样考虑就简单多了, 因为我们对抛硬币非常熟悉. 因此, 让我们把我们的程序叫做硬币测试(CoinTest).赫兹量化软件
首先, 我们应该描述我们未来程序的主要特性:
-
我们应该能够改变获胜可能性. 50/50比率只是一个特殊的平衡条件.
- 我们应该能够设置风险水平. 拉布谢尔系统有一个固定下注大小. 如果我们根据我们的存款规模来扩大初始赌注, 我们的存款将永远不会回到最初的状态, 因为所有的数值都比最初有所改变. 在有回撤退出后, 我们可以重新计算下注大小, 但是, 这将会引出难以处理的分数. 所以, 我们使用两个变量来设置风险 - 初始存款和初始下注.赫兹量化软件
-
有必要设置每笔存款的最大交易次数. 它应该被设置得足够大, 这样我们就能知道, 就算初始风险非常低的时候我们是否会损失全部存款. 毕竟, 如果存款持续增长, 这个过程可能是无限的, 我们可能永远都不知道结果.赫兹量化软件
-
我们应该有能力检查一个单一的存款的交易序列的结果, 这既是为了程序的调试, 也是为了我们可以改变交易逻辑. 把结果输出到文件中可以很好满足我们的目标.赫兹量化软件
-
在我们完成任务, 为单一存款过程写完代码后, 我们因该继续收集一系列独立的存款中(最好)使用不同参数过程的统计数据. 你要知道, 单一的试验几乎是没有意义的. 统计结果也被发送到文件中. 我们不需要每一个单独存款的历史.
我们的下注规模选择系统可能可以用于真实交易, 所以我们应该把它做成一个类.
对我们来说, 现阶段在MetaTrader中真的做交易没有必要, 因为会耗用很多计算资源. 我们只需要使用所需的规模和一个给定的胜率来得到随机交易的结果. 使用这种想法, 我们将会开发一个脚本程序, 因为这种MQL程序和EA交易或指标相比非常适合单独运行一次.赫兹量化软件
伪随机数生成器质量的统计学验证
伪随机数生成器(PRNG)的质量对我们非常重要, 因为它将用于定义每个交易的结果(赢/输). 一个很长的赢/输序列分布的准确性是最重要的. 晚些时候我们会尝试不使用复杂的数学和统计学理论对它进行评估.
这篇文章的目的不是对PRNG的质量做详细的研究(否则, 我们必须进行15个不同的测试). 我们所感兴趣的PRNG特点是它不会影响拉布谢尔系统的测试结果, 并不需要复杂的验证过程.
MetaTrader 有标准的 MathRand() PRNG 函数. PRNG 序列使用MathSrand() 函数进行初始化.
让我们写一个小的脚本程序 (RandFile) 来检查标准 PRNG 的质量. 此脚本程序将有两个参数:
-
它应该可以生成数以百万计的32位随机数(每个32位随机数通过3次调用MathRand()函数, 每个函数可以提供15位). 测量单位通常是10进制的二不是2到2的20次方, 因为我们需要看到测试的结果.赫兹量化软件
-
CalcSeries 逻辑参数(是否应该计算相同位序列长度的分布).
对位序列长度分布的计算是非常耗费资源的(增加脚本执行时间十倍). 因而, 它被设为一个独立的选项.
该脚本程序生成如下结果:
- 计算时间 (显示于日志中);
- 全部生成位中1 位 的数量 (显示于日志中);
- RandFile.bin 文件 — PRNG 运行结果的二进制文件;
- RandStat.csv 文件 — 包含某些字节出现频率的记录文件;
- RandOnesSeries.csv 文件 — 包含"1"位序列长度的记录文件;
- RandZerosSeries.csv 文件 — 包含"0"位序列长度的记录文件.
让我们生成3个不同长度的测试集:
- 1000万个测试数, 每个数字4个字节(一共4000万字节);
- 1亿个测试数, 每个数字4个字节(一共4亿个字节);
- 10亿个测试数, 每个数字4字节(一共40亿个字节).
现在让我们检查以下参数:
- 使用WinRAR最大压缩设置进行压缩, 包含随机数文件的压缩率. 高质量的随机数据是很难压缩的. 当然, 文件不能压缩的程度也不一定表示它们包含随机数的质量高. 但是如果它们很容易压缩, 这表明数据具有统计上的相似性.
- "1" 位的数量:
平衡值 真实 绝对偏差 偏差百分率 10М 160 000 000 160 004 431 4 431 0,0027694 100М 1 600 000 000 1 599 978 338 21 662 0,0013539 1000М 16 000 000 000 15 999 996 180 3 820 0,0000239 - 某些字节的数值在随机数文件中出现的频率:
-
相同位序列的长度. 我们将对每个大小的样本生成两个图表:
- 第一个显示某确定长度相同位的实际数量, 以及该系列的长度(在对数刻度)的平衡值;
- 第二个显示实际量的百分比偏离检测到的相同的位序列(在对数刻度)的平衡值.
线性图表是不符合我们要求的, 因为我们拥有的数据非常分散(在同一图表上, 数值从1到4,000,000,000或者从0.00001到6000)另外, 对数标度的长系列的平衡值的图表显示为直线, 而序列长度增加1,其发生的概率减少了一半。