本来只是看到 @清醒疯子 回答了这个问题,顺手抖个机灵,没准备把回答说明白,懒得很。但是想到之前作为某些方向的小白在知乎里也受益颇多,因此就多写一些吧,算是回馈社群,也算是领证结婚给大家发喜糖^_^。

我的建议是,依次了解并检验下面的内容,原因是在我的经验里,这些问题出现的概率是由高到低的:

1. 算错了。不是我乱回答好嘛,是血的教训啊。在我做量化测试的历史里,回测出现有显著盈利能力结果时,95%以上是这个原因导致的错误。例如,某个负号在计算时漏掉了、百分号忘记除了、不同语言下迭代0和1起始点的混淆,等等等等,往往会给出一个好到我觉得必将改变世界的结果。所以本人现在都养成了只要结果很好,一定先彻查是否算错的习惯。
顺便给个我用来判断结果是否过好的检测手段。鉴于我的交易策略跨度比较大,因此需要一个适用性广泛的手段,我的做法是用期望为0的正态分布模拟资产回报率,首先使用历史数据估计出标准差,然后模拟n段测试期等长的回报序列,从而得到n个交易策略盈亏结果,如果实测结果在这n个结果的尾部两端,就说明结果过好或过坏。这是单资产的交易策略,如果是多资产,融合相应的组合流程即可。当然也存在一些变种,例如求得概率结果而非直观的盈亏结果等进行判断。不过本人大部分时间都不会做的那么详细,受打击的次数多了,稍微看看都知道是不是有问题了。

2. 未来函数。其他答案中多次出现了这个提法了,说明确实是一个根本性问题。未来函数的杀伤力在于,它会出现的不知不觉。例如一个著名的分析师语言:“在熊市末期积极建仓,在牛市末期卖出股票”,我要是知道这是末期了,我还听你这些话干什么啊。还比如做量化的时候对曲线的平滑、整体模型的估计、统计特征的提取等等,都应该注意未来函数的出现。
要控制它的出现,唯一要做的就是小心,因为逻辑中的错误,比前面说的“算错了”更难以检查出来。我自己的经验是,在编制测试流程时严格按照时间顺序进行,样本内的计算就强迫自己彻底屏蔽样本外的数据。一句话,经验是财富。

3. 存活者偏差。这是“未来函数”族群中的王者,单独拿出来说。下面的内容来自维基百科:

幸存者偏差(英语:survivorship bias),另译为“生存者偏差 [1]”或“存活者偏差”。常用俗语“死人不会说话”来解释其成因。 意思是指,当取得资讯之管道,仅来自于幸存者时(因为无从由死者获得来源),此资讯可能会存在与实际情况不同之偏差。常见于财务金融领域之文章。
此情况常见于投资理财之节目或文章,例如当投资理财之电视节目仅邀请投资成功者上节目谈论其成功投资之经验,观众会将该成功投资者投资之方式,视为高成功率之投资方式,但观众并不会在电视节目看到以相同或类似投资方式,但最后失败的投资者,因而高估此投资方式之成功机率。

用指数或者全市场样本进行长期交易策略测试的同志们,请一定小心指数成分股的变更和股票退市对策略的影响!

4. 过拟合。先给定义,来自百度百科:

为了得到一致假设而使假设变得过度复杂称为过拟合。想像某种学习算法产生了一个过拟合的分类器,这个分类器能够百分之百的正确分类样本数据(即再拿样本中的文档来给它,它绝对不会分错),但也就为了能够对样本完全正确的分类,使得它的构造如此精细复杂,规则如此严格,以至于任何与样本数据稍有不同的文档它全都认为不属于这个类别。
标准定义:给定一个假设空间H,一个假设h属于H,如果存在其他的假设h’属于H,使得在训练样例上h的错误率比h’小,但在整个实例分布上h’比h的错误率小,那么就说假设h过度拟合训练数据。 —-《Machine Learning》Tom M.Mitchell

好吧,数据挖掘的人写的东西,看来国内搞金融的人都高端大气不愿意用百科,有空我把wiki的英文翻译过来好了。针对量化交易的小方向来说,就是说交易策略中参数用多了、或者交易流程设置过于复杂了,导致交易策略过度提取了样本数据中的某些显性信息,而误读了整体数据中的真实信息。如果你有较好的统计基础或者计量基础,你应该明白过拟合的含义,学界为了R方和结果显著性不顾一切乱来的太多了,负面例子不胜枚举,如果不太理解请补课。

5. 泛化能力。与“过拟合”关系密切,在绝大部分情况下就是“过拟合”问题导致的结果,不过含义是截然不同的,且存在例外,因此单列出来。最出名的例外就是现在红火到爆的Deep Learning了,实际上就是隐层数增加的人工神经网络,所以亦称Deep Neural Network,虽然由于隐层的问题,参数一度多到无法正确估计,但是有了Autoencoder之类的处理方法之后屌丝逆袭杀掉了SVM。最近去百度的吴恩达就是这方面的专家,更不用提Hinton他老人家,Google的科技吉祥物好嘛。扯远了,回来,下面的定义来自百度百科:

概括地说,所谓泛化能力(generalization ability)是指机器学习算法对新鲜样本的适应能力。学习的目的是学到隐含在数据对背后的规律,对具有同一规律的学习集以外的数据,经过训练的网络也能给出合适的输出,该能力称为泛化能力。

好吧,这还是搞数据挖掘的人写的东西。用我们这个方向上更易理解的话说就是:样本内的数据的某些特征规律,在样本外的数据中也存在,这种特征可以提取出具有盈利能力的交易策略。因此,这种存在性越强、或者说样本外盈利能力越强,泛化能力就越强。
在我个人的交易哲学中,已知数据全部都是样本内数据,人为划分样本内外的做法是学术术语,有可能会产生自欺欺人的后果。个人看法,仅供参考,而且为了交流方便我仍然会在下面使用这种学术说法。为了将这种泛化能力的欺骗性尽量降低,我的做法是在某一段样本期内划分样本内外,然后将这段样本期作为样本内,在另一段时期做样本外检验,依此迭代,能做几层做几层。抱歉我暂时没法把这个流程说清楚,有灵感了我来改答案。但是确实很有效,一般做两层,大部分好策略就不好了,根本不用实盘浪费时间浪费钱。
泛化能力是量化交易盈利的灵魂,涉及到哲学和技术两个层面。有空我会增加这部分的内容。

6. 真实交易环境限制。@Awing Xu 写的很好,请移步参考。
闪烁信号的问题主要出现在中长期交易中,大部分是使用日度数据进行回测造成的。解决方案包括设定一个与交易点差距的阈值,使得交易行为的到达条件不那么敏感;或者固定在一天的某个时间点监测并进行交易,忽略其他时段的价格变动,等等。

实际交易中不可能成交的价位。
使用市场单,价位变动,单个价位容量不能满足,市场剧烈波动影响成交价。
场内规制,庄家或报价商打止损。

这三个我统一归纳为交易中的摩擦,不知道有没有理解错,如有,致歉。第一个我展开说一下,由于下单环境的不同,单子到达交易所的时间也就不同,较大的时间差往往造成策略计算时的价位不可能成交的情况,波动大时尤甚。另一种情况则是流动性较低时,买卖单无法被对手及时匹配所导致的价位变动。这一问题可以通过提高议价能力、优化下单和计算环境等来缓解。第二个和第三个问题,主动的解决方案包括狭义的Algo Trading所代表的分单建仓等技术,以及对交易规则的合理应用等。这是另一个大的研究方向,不作展开。
与闪烁信号主要出现在长期策略不同,摩擦在高频交易中极为明显。高频中稀薄的盈利往往会被大量摩擦蚕食,进而导致理想环境下的盈利策略失去盈利能力。实践中,一个优秀的策略测试流程一定会考虑到摩擦因素,而针对套利类交易来说,对于摩擦损失的估计和预判甚至是整个策略的核心所在。
真实交易环境的限制涵盖很广。断电、断网、计算机故障等因素也是其中之一。肯定还有其他的问题限制,欢迎补充。集思广益,不甚感激。

7. 策略周期。策略是有周期的,站在风口上,猪都会飞。在趋势行情下,盘整策略会亏,在盘整行情下,趋势策略会亏。那我用技术手段,区分趋势行情和盘整行情呢?这是对未来行情的预测,提前固化的预测手段是具有时效性的,依然是一个大的周期问题。存不存在不会过期的盈利性策略呢,我认为有,具体的内容我会在后面混沌等内容中展开来讲,因为太哲学。目前而言,我寄希望于找到一个有效周期足够长的策略,我还没有找到,但会继续努力。
实际上,策略周期是“泛化能力”在时间上的着重体现,基于这个思路,我对这个性质的检测方式仍然是两层的样本内外检验,只不过会对样本期的长短、时段变化更为关注,研究这些变化带来的结果的变化。到了这里,我已经开始感到自身的软弱无力,交易是一个看天吃饭的活计,量化交易也不例外。

———————–
马上要写混沌、社会学、哲学的东西了,有点畏惧,歇一歇先。

混沌(不是挂羊头卖狗肉的那些东西,只是混沌的理念:长期不可预测)
心理史学(借用于科幻小说)下的多方博弈

本来想把哲学思维继续一下,但是考虑到那更偏向于另一个问题,市场为何会波动以及波动特性,算了。

— 完 —

本文作者:杨改之

【知乎日报】
你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 24 个回答,查看全部。

分享到