龙听期货论坛's Archiver

龙听 发表于 2019-6-1 11:02

古期:一篇很棒的测试(回测)技术文章 外语翻译[古期心得]

[p=30, 2, left]网友Tianba提供了一篇网络上的测试简报,觉得很棒,先在此探讨此文的内容,有时间,再来谈交易上的应用与问题.[/p][p=30, 2, left]这是简报的原始网址:[/p][p=30, 2, left][url=http://research.cs.tamu.edu/prism/lectures/iss/iss_l13.pdf]http://research.cs.tamu.edu/prism/lectures/iss/iss_l13.pdf[/url][/p][p=30, 2, left]这篇简报,名为测试(Validation),分为四个部分来讨论.[/p][p=30, 2, left]中文的测试,涵盖的相当广,容易造成误解.这篇简报的原文,叫做Validatation,指的是有效性的测试.一般计算机程序的测试,指的是Verification,专门测试与解决程序撰写时所产生的问题.Verify动作在前,Validate在后.[/p]
[p=30, 2, left][b]以下是用中文来整理这篇简报[/b][/p]


[p=30, 2, left]    第一部分,谈到的是测试的动机(Motivation):[/p][p=30, 2, left]有效性测试,处理模式识别上(pattern recognition)的两个基本问题:[/p][p=30, 2, left]    模型选择(Model selection):[/p][p=30, 2, left]    几乎所有的模式识别技术,都会有一个或多个自由参数(free parameters),如[/p][p=30, 2, left]      kNN分类法(kNN Classification Rule)中的邻近数(Number of neighbors),[/p][p=30, 2, left]      MLPs方法的网络数(network size),学习参数(learning parameters)与加权(weights).[/p][p=30, 2, left]    要如何针对特定的分类问题(given classification problem)中,选择"最佳"参数或模型呢?  [/p][p=30, 2, left]    绩效估计(Performance estimation):[/p][p=30, 2, left]    一旦选择了模型,要怎样来估计绩效呢?传统上,绩效的测量是采用真实误差率(True Error Rate),采用的分类(Classifier)与要处理的真实母体之间,所存在的误差率.(X5super注: 此并非母体的绩效高低,而是估计准确度,如果100分,误差率0.2,那母体只有80分,如果90分,误差率0,那母体就是90分了.前者的分数虽然较高,但是误差率高,估计就过于乐观.若以程序交易为例,这只是评估回测的可靠度,不管策略本身的绩效好坏)[/p][p=30, 2, left]    假如我们没有取样数的限制,这些问题就有了直接的答案:取最低的母体误差率(Error Rate on Entire Population),当然,这时候就等于真实误差率(True Error Rate).[/p][p=30, 2, left]    在实际的应用上,我们只能用有限的取样数,而且通常都比我们想要的还小.一种做法是,把所有的数据(trainning data),只当成一个分类(Classifier),并以此来估计误差率.这样,产生了两个主要问题:[/p][p=30, 2, left]    问题1) 最终选定的模型会过度匹配于我们使用的数据(trainning data),如果模型的参数越多,问题就更显着.[/p][p=30, 2, left]    问题2) 误差率的估计,会太过于乐观(低于True Error Rate).事实上,要取得学习资料(Trainning data)100%正确率的分类(classification),不是不寻常的事.(X5super注:这样的估计太过于乐观)[/p][p=30, 2, left]    另一个更好的做法是,holdout method:把学习数据(trainning data)分割为更多互不交集的区块(disjoint subsets).[/p]

[p=30, 2, left]    第二部分: holdout method[/p][p=30, 2, left]    切割后的区块(dataset),有两类:学习组(Trainning set),用来找分类(Classifier)的模型;另一类是测试组(Test set)用来评估这分类(classifier)的误差率.[/p][p=30, 2, left]    [attach]8838[/attach][/p][p=30, 2, left]    这个方法有两个缺点:一是通常我们拥有的数据不多,无法在做这样奢华的切割后,还有测试的能力与价值;另一个是,只切割成为一组的学习与测试数据,一旦我们不幸选择了不具代表性的那个组合,结果的误差率计算就没有估计的意义与价值了.[/p][p=30, 2, left]    这样的限制,是有一些重复取样的方法族群(family of resampling methods)可以克服的,这些方法需要更多的计算过程.比如交互验证法(Cross Validation):随机子取样(random subsampling),K-Fold交互验证,Leave-One-Out交互验证.另外,还有BootStrap(引导)方法.[/p]

[p=30, 2, left]    第三部分: Re-sampling techniques[/p][p=30, 2, left]    A) Random subsampling:[/p][p=30, 2, left]       将数据分割为K组.首先,随机决定K个号码小于总样本数,这些号码不重复,每个号码代表每一个分割的最终样本数.在每一个分割中,学习数据组(trainning samples),带入模型参数,测试数据组(test samples)估计误差率.[/p][p=30, 2, left]     [attach]8839[/attach][/p][p=30, 2, left]       总共产生K组的估计,最后的误差估计值E=ΣEi/K,显着的比holdout method单组估计好很多.[/p][p=30, 2, left]    B) K-Fold Cross Validation:[/p][p=30, 2, left]       建立K格位的数据组,也就是把所有的测试数据等分成K组:第K次的试验(experiments),采用前面K-1组的数据来学习(trainning),第K组的数据来测试(testing)[/p][p=30, 2, left]        [attach]8840[/attach]
       此法与random subsampling类似.K-Fold Cross Validataion的优点,是每一个取样数据,最后都扮演过学习(trainning)与测试(testing)的脚色.[/p][p=30, 2, left]       绩效估计如同前者,误差估计值E=ΣEi/K.[/p][p=30, 2, left]    C) Leave-One-Out Cross Validation:[/p][p=30, 2, left]       这是K-Fold Validation的一种退化变形,总数据样本数就是K个.[/p][p=30, 2, left]       当样本数N个,就采取N个试验(experiments).第N次试验,采用前面N-1个的样本数据来学习(trainning),第N个样本数数据来试验(testing).         [/p][p=30, 2, left]       [attach]8841[/attach][/p][p=30, 2, left]       同样的,真实误差的估计=E=ΣEi/N.[/p][p=30, 2, left]       有一个有意思的问题,到底数据要折迭多少个分割(folds)呢?[/p][p=30, 2, left]       A)当数量大:[/p][p=30, 2, left]          (+有利):真实误差估计的偏差会很小(估计会接近正确)[/p][p=30, 2, left]          (-不利):真实误差估计的变异会很大[/p][p=30, 2, left]          (-不利):计算时间长[/p][p=30, 2, left]       B)当数量小:[/p][p=30, 2, left]          (有利):计算时间短[/p][p=30, 2, left]          (有利):真实误差估计的变异小[/p][p=30, 2, left]          (不利):真实误差估计的偏差会很大[/p][p=30, 2, left]       实务上,Folds的数量取决于拥有的样本数据数.当资料数够多,即使3-Fold Cross Valiation,也能有相当正确的估计.当数据数少,最好使用Leave-One-Out Cross Validation,尽量让试验数够多.[/p][p=30, 2, left]       K-Fold Cross Valiation一般的用法是K=10.[/p][p=30, 2, left]    第四部份: 数据三类别切割法(Three-Way data split)[/p][p=30, 2, left]    假如模型的选定与真实误差率的估计要同时算出,那么数据需要分割成互不交集的三部分.[/p][p=30, 2, left]    学习区(Trainning set):模型形成(learning)之用,让模型的参数符合这个分类(classifier).前面提到的MLP方法,在使用back-prop rule时,这学习区可以去寻找"最佳"的权数(weights).[/p][p=30, 2, left]    修正区(Validation set):用来微调参数.MLP方法在使用back Propagation算法时,修正区可以用来寻找"最佳隐藏单元的数量(number of hidden units),或决定停止点(stopping point)[/p][p=30, 2, left]    测试区(test set):只用来评估完全学习结束后的分类(classifier)绩效.(真实误差率).MLP方法在此已经选定了最终模型后(MLP size与实际权重),将估计模型误差率.在最终模型绩效估计后,不可再修改参数值了.[/p][p=30, 2, left]    把修正区(validation set)从测试区(test set)分离出来,有两个理由:一是合并选定模型与估计绩效在同一区的话,会低估误差率;另一个就是前面提过的,在最终模型绩效估计后,不可再修改参数值了.[/p][p=30, 2, left]    步骤纲要:[/p][p=30, 2, left]    1) 将可用的数据,分成学习(trainning set),修正(validation set)与测试(test set)三部分.[/p][p=30, 2, left]    2) 选定架构(architecture)与参数[/p][p=30, 2, left]    3) 用学习区(tranning set)的数据,让模型学习形成.[/p][p=30, 2, left]    4) 用修正区(validation set)的数据,来评价(evaluate)模型.[/p][p=30, 2, left]    5) 用不同的架构与学习参数,重复步骤2~4.[/p][p=30, 2, left]    6) 选定模型,并且用学习区与修正区的数据来学习[/p][p=30, 2, left]    7) 用测试数据(test set),来评估(assess)最后的模型.[/p][p=30, 2, left]    以上的步骤是假设用holdout method.如果用的是Cross Validation或Bootstrap方法,对于K folds中的每一个,都要重复步骤3与4.[/p]
[p=30, 2, left][attach]8842[/attach][/p]

龙听小虎 发表于 2023-11-2 21:22

{:86:}

页: [1]