这篇文章为大家介绍量化交易系统中最为常见的几个基本概念。本篇的预期读者主要是希望成为基金公司量化交易员的人,以及尝试搞搞个人算法交易的爱好者。
量化交易是量化金融行业中最为尖端的一个领域,不论你是希望通过面试还是构建自己的交易策略,都会花费大量的时间与精力学习相关的知识。不仅如此,你还需要过关的编程技术,至少需要精通一门高级编程语言(如MATLAB、R或Python),而且伴随着高频交易策略的日益盛行,技术层面对于策略执行效果越来越至关重要,精通C/C++也许是最佳的选择。
量化交易
量化交易系统包含以下四个主要组件:
- 策略构建模块:寻找策略,发掘可用优势,决定交易频率。
- 策略回测模块:获取数据,分析策略表现,排除模型偏差。
- 指令执行系统:对接券商,自动化交易,合理减少交易费用。
- 风险控制模块:最优化资产配置,根据凯利公式与交易心理学决定风险容忍度。
注:凯利公式
凯利公式是一条可应用在投资资金和赌注的公式。应用于多次的随机赌博游戏,资金的期望增长率最高,且永远不会导致完全损失所有资金的后果。它假设赌博可无限次进行,而且没有下注上下限。
凯利公式
策略构建
量化交易始于研究,研究过程包含选定策略、校验策略(检查其是否与当前投资组合的其他策略有冲突)、优化策略(通过数据对策略调优,提高回报率,降低风险)等过程。需要注意的是,如果你是非机构投资者,你还需要考虑自身的“资本充足率”,交易费用对于你策略的影响也会更大。
与大家的普遍印象不同,通过公共资源就可以获取到许多有用的策略,学术期刊会发布一些理论交易结果(大部分对于交易成本的考虑比较粗糙),相关博客会深入讨论一些策略,行业期刊上则会概述一些基金所使用的策略。
你可以会感到困惑,为什么这些个人与机构会热衷于公开讨论他们的策略?他们都非常明白如果其他人都蜂拥使用此策略时,这些策略可能会失效。真实原因在于,他们从来不会公开策略的调优方法与详细的参数设置,而调优过程才是将一个普通策略提升到高盈利状态的关键所在。事实上,找一个类似的已有策略,并实施自己的优化过程,才是目前构建自身策略的最佳实践。
你可以从以下网站找寻些策略的灵感:
- Social Science Research Network - www.ssrn.com
- arXiv Quantitative Finance - arxiv.org/archive/q-fin
- Seeking Alpha - www.seekingalpha.com
- Elite Trader - www.elitetrader.com
- Nuclear Phynance - www.nuclearphynance.com
- Quantivity - quantivity.wordpress.com
你看到的大多数策略可以分为均值回归与趋势跟踪/惯性策略两类。均值回归策略认为标的资产的价格序列(如两个关联资产的价格差异)存在长期均值,短期的偏离最终必定恢复。趋势跟踪策略则在跟踪市场趋势的同时,通过对投资者心理及大型基金的资产结构的分析收集某个交易方向的惯性,跟踪该趋势直到惯性发生反转。
另一个重要趋势是交易频率。低频交易(LFT)通常是指持有标的资产超过一个交易日的策略,高频交易(HFT)则只在交易日内持有资产,还有超高频交易(UHFT)只持有标的几秒甚至几毫秒。虽然对于个人投资者来说高频和超高频策略也都是可实现的,但必须对于交易的技术栈和交易所的报价成交原理非常了解,这篇文章不会对这些方面做过多的延伸。
策略/策略集一旦构建完成,就需要用历史数据进行收益能力的评估测试。接下来就是回测发挥的环节了。
回测
回测的目的在于使用历史及样本外数据对策略进行验证,确定其能否创造预期收益,结果也会被看做为该策略实盘操作的一个预期值。但实盘涉及因素极其复杂,回测并不能确保策略的成功。
回测可能是量化交易中要求最为精细的一环,因为太多可能的人为偏差会涉及其中,一般包括前视偏差、幸存偏差和优化偏差(也被成为数据透视偏差)。关于回测还有几个需要关注的关键点,包括历史数据的质量和可得性、实际交易成本的影响及如何确定一个健壮的回测平台,下文指令执行系统中会进一步讨论交易成本。
通过历史数据测试及优化是回测必须的步骤。市场中有各种不同的标的资产,更有数不胜数的数据供应商,服务价格取决于数据的质量、深度及实时性。对于菜鸟量化交易员(至少是个人投资级别)来说,一般Yahoo金融上的免费数据就足以大家使用。我会着重介绍在处理历史数据集是的常见问题,数据供应商这里不会详述。
注:数据透视偏差是指使用过多参数与拟合历史数据,而没有进行大数据量、样本外测试及敏感度分析导致的偏差
关于历史数据主要关心准确度/清洁度、幸存者偏差及对于公司行为(如发放股利、拆股等)的调整。
- 准确度指数据的整体质量(是否存在谬误数据)。错误数据有时候很容易发现,比如使用窄带滤波器可以从时间序列数据中筛选出超出范围的数据并修正它们,但有时候也非常难以确定,通常我们需要两个以上的数据提供商,通过比对确定数据是否准确。
- 幸存者偏差,通常免费或比较便宜的数据集都存在这个问题,幸存者偏差是指数据集中不在包含已经不再流通的资产,比如已经退市或者破产的股票。使用这种数据集进行回测会导致评估业绩比真实的(历史上)业绩要好,因为数据集相当于做了一次自我筛选,筛选出了历史上表现较好的股票。
- 公司行为通常会对原始股票价格出现阶梯性影响,而这部分影响在计算基于价格的收益率时不应当被考虑进来,股利分发与拆股是最为常见的公司行为。每当发生公司行为时,都要经历价格的回调,要注意千万别把拆股与真实的价格调整给混淆了,许多交易员都曾在公司行为上栽过跟头。
执行回测需要一个软件平台,你可以选择专业的回测软件,如Tradestation;一个数值处理平台,比如Excel或MATLAB;也可以使用Python或者C++自主研发一套软件。这里不会详述Tradestation、Excel和MATLAB,因为我希望构建一套完整的技术栈,这么做的一个好处在于回测软件和指令执行系统可以紧密的结合在一起,即使面对的是一个高级统计学策略,对于高频交易策略,自主研发甚至可以说是必须的。
进行回测时,回测系统必须能够定量地给出策略的收益表现。最大跌幅与夏普比率是业界公认的两个度量标准。最大跌幅标注了一定时期内(通常以年为单位)账户资金曲线中最大的波峰-波谷差,通常以百分比计量。因为一些统计学因素影响,低频交易的最大跌幅要比高频来得更大些。历史回测可以得到历史上的最大跌幅,对于未来具有很强的指导意义。第二个指标是夏普比率,它被定义为超额收益的平均值除以这些超额收益的标准差,超额收益指策略高于预定基准收益的部分,基准收益常会选择标普500或3个月的国债。需要注意的是,“年化收益”这个平日里常见的指标,回测里确基本不用,因为它没有将策略的波动性考虑进去。
回测完成,确信策略中已经排除了所有偏差,如果运气好夏普比率和最大跌幅表现都挺好,那么恭喜你,可以开始着手构建指令执行系统了!
指令执行系统
通过指令执行系统,策略产生的交易指令被传送给经纪商并执行。现实当中,指令生成可以是半自动或者全自动,执行机制也可以配置为手工、半手工或者完全自动。低频交易中,手工和半手工较为常见,而高频交易则需要建立完全自动化的执行机制,通常也需要与指令生成模块紧密配合。
构建指令执行系统的关键在于对接券商的接口、降低交易费用的策略(包含佣金、滑点及经纪商买卖差价)及处理实盘与回测预测业绩差异的处理。
经纪商提供了多种交易接入方式,从电话到高性能API任你挑选。理想情况下,每个人都希望自己的指令执行越自动化越好,还有支持多策略并行及如何提高执行频率,这些宏伟的目标都促使你不断前进。常用的回测软件,MATLAB、Excel及Tradestation在低频、简单的交易策略中都可以表现很好,但如果你希望实施实盘的高频交易,那么你必须使用高性能的编程语言如C++构建一个自己的指令执行系统。我之前就职的基金公司里,有一个10分钟的交易回路,每十分钟我们可以就可以从这个回路下载最新的市场数据,并基于新数据在这个10分钟的周期内完成交易,据说是用优化过的Python脚本实现的。如果需要实现分钟甚至秒级别的数据交互,C/C++可能表现会更好些。
在一个大型基金中,指令如何最优执行通常不在量化交易员的工作范畴,但在小型点的基金或做高频交易的公司,交易员既是指令的执行者,同时又必须要具备更广泛的技能。如果希望供职于基金,那么请你记住一点,你的编程技能可能要比你的统计学、经济学技能更为重要!
指令执行过程中经常会出现问题的地方在于交易费用的优化。最为常见的三类费用包含
- 佣金/税费(commission/tax),通常由经纪商、交易所或监管机构收取
- 滑点(slippage),指你订单希望的成交价格与实际成交价格的差异(一般会在行情波动大或市场缺乏流动性的时候出现)
- 价差(spread),指交易标的的买卖报价之差,注意价差并非常量,会跟随市场订单的情况而不停变化。
交易成本对策略影响很大,甚至可以让一个原本高盈利高夏普率的策略摇身一变成为烂到掉渣的策略,通过回测正确预测交易成本极具挑战性。依据交易策略频率,需要获取历史成交数据(包含逐笔交易的买卖信息),数据量很大,所以大型基金中,基本所有宽客团队都在专注于指令的执行优化。以如下场景为例,一个基金需要抛售大量的标的资产,如果上来就大量倾销,会导致股价快速大幅下降,该指令也就没有获得最优的执行。因此,算法一般会将该指令拆分为“点滴订单”,尽管可能需要承担滑点风险。再深入一步,甚至有专门的策略来捕捉这些情况并加以利用,这个领域被称为“基金结构套利”。
指令执行系统最后一个主要关注点在于策略的真实表现与回测中的期望的差别,有许多原因会导致这种情况,比如之前已经回测部分已经提到的前视偏差和数据透视偏差。但一些策略在真实运行前很难发现偏差,高频交易尤为明显。交易策略和指令执行系统都可能存在回测中无法复现,但在线上实盘又出来捣乱的bug,市场也可能因为一个策略的部署从而天翻地覆。新的监管环境,投资者情绪与宏观经济的变化都可能导致市场行为的变化,进而也会影响你策略的表现。
风险管理
风险管理是量化交易魔方的最后一块,我们之前讨论的所有偏差都属于风险的范畴。常见的风险有技术性风险(比如交易所的服务突然发生了硬盘故障)、经纪商风险(比如经纪商破产了,别笑,真的有,MF Global!)等,简言之,只要会影响交易进行的因素,都可能带来风险。
风险管理还需要确定最优资本配置(组合理论的一个分支),这意味着资本如何分配到不同的策略上执行。这是一个非常复杂的研究领域,需要依赖非凡的数学技能。目前凯利公式是业界公认进行资产及杠杆配置的标准,凯利公式提出了一些收益的统计特征假设,但在真实的金融市场中却不一定总是正确,交易员具体使用其时一般偏保守。
风险管理的另一个主要作用是用来排除交易员的心理障碍,有许多认知偏差会潜移默化地影响到交易过程。尽管大家普遍认同如果策略完全交由算法执行问题会更少,但目前很多交易还是需要经交易员之手。损失厌恶是一种常见偏差,当处于亏损状态时,可能会由于确认损失带来的痛苦而迟迟不进行止损,盈利情况下类似,可能会因为害怕失去已获收益而过早地交易。当交易员强调最近而忽略了长期,则会产生另一种常见偏差——近期偏差。当然也有经典的情绪偏差——恐惧与贪婪,它们会导致杠杆不足/杠杆过高,进而可能导致收益降低或爆仓的情况。
总结
显而易见,量化交易是量化金融中一个极其复杂,但却非常有趣的领域。这篇文章我只是触及皮毛地介绍了量化金融的基本框架,文中很多我只是一两句话带过的内容都有对应详尽的书籍与论文,所以建议在你准备申请量化交易相关工作之前,一定要补一补基础知识,至少要对统计、经济学有个大略的认识,有MATLAB、Python或者R的相关实践,对于更高级的高频交易,你还需要Linux内核、C/C++,汇编及网络延迟优化等技能。
如果你对创建自己的算法交易策略感兴趣,建议你首先精通编程,尽可能自己构建数据采集器、策略回测及指令执行系统,因为试想你的自有资本一直在线持续运作,亲自完成完备的测试、熟悉策略里的各种陷阱与问题,相对于把这部分工作外包出去,是不是更能睡个安稳觉呢:)