本文作者是一位从事量化交易的实战者,他将他的实战心得写成一个量化交易系列,本篇则是系列的第一篇,从文中你会对整个量化交易的框架、流程、以及策略思路的来源地都有相应地说明。接下来就和文摘菌一起来看看量化交易应该如何入门吧!
在此文中我将为你们介绍一些端对端量化交易系统的基本概念,希望借此帮助到两类读者:一类是希望在基金公司中找到量化交易相关工作的人,另一类是那些希望能自行利用算法进行交易的“散户”。
量化交易是量化金融中非常复杂的一个领域。要通过面试或者制定自己专属的交易策略,需要花费大量时间来学习相关知识。不仅如此,你还需要粗略会些编程技能,至少要会MATLAB,R语言或者Python其中一种语言。然而,随着策略交易频率的增加,技术方面相关性更强了,因此熟悉C语言或C++就更为重要。
量化交易系统由四个主要部分组成:
- 策略识别-寻找策略,利用优势以及决定交易频率
- 策略回测-获取数据,分析策略性能以及消除偏差
- 执行系统-与经纪(开户)公司对接,自动化交易以及最小化交易成本。
- 风险管理-最优资本配置,“押注规模”/凯利公式以及交易心理。
我们先来看看如何确定交易策略。
策略识别
所有的量化交易过程都是在研究初期就开始了的。这个研究过程包括寻找策略,看看这个策略是否与你正在运行的其他策略组合相融,获取测试策略所需的所有数据,并试图优化策略以获得更高的回报和/或更低的风险。如果你是以“散户”的身份运行交易策略,还需要考虑自己的资金要求,以及每项交易成本是如何影响策略的。
与人们普遍认为的相反,通过各种公开渠道寻找可盈利的策略是非常简单的。学术界会定期发表理论交易结果(尽管大部分是交易成本总额),量化金融的博客通常会详述其使用的策略,行业期刊也会概述基金采用的部分策略。
你可能会问,为什么个人和企业都这么热衷于讨论自己的盈利策略呢,尤其是知道其他人都想来“分一杯羹”的情况下,可能这个策略长期来看就未必还能盈利了。原因在于,他们其实不会讨论他们使用的确切的参数设置和微调方法。这些优化手段是将相对平庸的策略转为获取高额收益的关键。实际上,创建自己独特策略的最佳方法之一,就是找到相似的方法,然后自己进行调优。
以下是可供各位寻找策略的网址列表:
- 社会科学研究网
www.ssrn.com - arXiv量化金融
arxiv.org/archive/q-fin - 寻找阿尔法
www.seekingalpha.com - 精英交易员
www.elitetrader.com - Nuclear Phynance
www.nuclearphynance.com - Quantivity
quantivity.wordpress.com
很多你接触到的策略通常都是划分到均值回归和趋势追踪/动量这两类里的。均值回归策略是一种希望利用“价格序列”(如两个相关资产之间的价差)上的长期均值的存在以及围绕该均值的短期波动终会回归的策略。动量策略试图利用投资者心理和大型基金结构,搭上市场趋势的顺风车,这种顺风车可以在一个方向聚集动量,并跟随趋势,直到趋势逆转。
定量交易的另一个非常重要的方面是交易策略的频率。低频交易(LFT)通常指持有资产超过一个交易日的策略。
相对应的是高频交易(HFT),通常指持有资产不超过一个交易日的策略。超高频交易(UHFT)指的是以秒和毫秒为单位进行资产交易的策略。作为散户,高频交易和超高频交易当然也有可能,但只在对交易的“技术栈”和订单动态有详细了解的情况下才可实现。因此在这篇介绍性文章中不会过多涉及。
一旦确定了某个或某套策略组合,就需要根据历史数据对其盈利能力进行测试,这就属于回测的范畴了。
策略回测
回测的目的是提供证据,以证明通过上述过程确定的策略在应用于历史数据和样本外数据时是能获得收益的。这就为该策略在“现实世界”中的表现设定了预期。然而,由于种种原因,回测并不能完全保证策略的成功。这或许是量化交易中最为微妙的领域了,因为这其中有许多的偏差,需要经过深思熟虑尽量消除偏差。我们会讨论一些常见的偏差类型,比如前瞻性偏差,幸存者偏差和优化偏差(也称“数据透视”偏差)。回测中的其他重要领域还包括历史数据的可用性和清洗程度,考虑实际的交易成本和选择一个稳定的回测平台。我们将在后面的执行系统部分讨论交易成本。
一旦确定了一项策略,就应该获取历史数据用于测试,或更进一次用于改进策略。在所有种类的投资中都拥有大量的数据供应商。它们的售价会因数据质量、深度和实效性而有所区别。开始量化交易,最传统的开始手段(至少是散户开始的手段)是使用雅虎今日的免费数据集。在此我不会过多讲述这些供应商,而是集中于讨论处理历史数据集时可能会遇到的一般问题。
对历史数据的主要关注点在于准确性/清洗程度,幸存者偏差和企业行动(如股息和股票分割)的调整:
- 准确度和数据的整体质量挂钩,即它是否包含错误数据。有时,错误很容易被识别,比如使用窄带滤波器(spike filter),在时间序列数据中挑出错误的“高峰”并予以纠正。而有的时候又会很难发现。这时我们通常需要有两个或以上的供应商,来检验双方的数据。
- 幸存者偏差通常是免费或廉价数据集的一种“特征”。数据集具有幸存者偏差意味着它不包含不再进行交易的资产。就股票而言,指的就是那些退市或破产的股票。这一偏差意味着,在这样的数据集中,任何股票策略都会比在“现实世界”中表现更佳,因为历史的“赢家”已经被预先挑选出来了。
- 企业行动包括企业进行的“后手”活动,这些活动通常会导致原始价格的阶跃函数变化,不应被包含在价格回报的计算中。股息和股票分割的调整是这类变化的罪魁祸首。在每一个这类动作中都需要进行一次反向调整。我们必须非常小心,不要将股票分割和真正的回报调整混为一谈。很多交易员都被这类企业行动坑了一把。
为了执行回测程序,我们得使用软件平台。你可以使用专用的回测软件,如Tradestation,或是数字平台,如Excel或MATLAB,或者使用编程语言如Python或C++进行自定义实现。我不会Tradestation类似的软件或是Excel和MATLAB这类工具做过多研究,因为我相信可以搭建一个完整的自用技术栈,原因如下:这样做的一个好处是,哪怕是使用最先进的统计策略,都可以紧密地集成化回测软件和执行系统。特别是对于高频交易策略而言,使用自定义实现是至关紧要的。
回测系统时,必须能量化其性能表现。量化策略的“工业标准”指标是最大回撤率和夏普率。最大回撤率是指账户权益曲线在特定时间段内(通常是每年)的最大峰谷跌幅,通常以百分比的形式出现。由于许多统计因素的影响,低频交易策略的最大回撤率通常会比高频交易策略高。历史回测会找出过去的最大回撤率,对未来的最大回撤率会有很大指导作用。第二个衡量指标是夏普率,定义是超额回报的平均值除以这些超额回报的标准差。
在这里,超额回报指的是战略回报高于预设基准,比如标准普尔500指数或是三个月的短期国库券。请注意,年化回报通常不是衡量的指标,因为与夏普率不同,它没有考虑策略的波动性。
一旦策略通过回测并被认为是基本没有偏差,还有了好的夏普率和最低限度的回撤率,是时候建立一个执行系统了。
执行系统
执行系统是指将一系列由策略生成的交易发送给经纪去执行的系统。尽管实际上交易生成可以是半自动或全自动的,执行机制会是全手动、手动的(如“点击一次”)或全自动的。对于低频交易策略,手动和半手动技术是非常常见的。对于高频交易策略,必须搭建一个全自动的执行机制,(由于策略和技术的相互依赖),该机制通常与交易生成器紧密耦合。
搭建执行系统时最优先考虑的是与经纪业务的对接,最小化交易成本(包括佣金、时延和差价)以及实时系统和回测系统性能之间的差异。
与经纪业务的对接实现方式有很多,可以和直接打给你的交易员,或是编写一个全自动化的高性能程序编程接口(API)。理想情况下是希望尽可能地自动化执行交易操作。能让你有时间关注于进一步的研究,并且允许你同时运行多个策略,甚至更高频的策略(实际上如果没有自动执行,高频交易基本上是不可能实现的)。上述常用的回测软件,如MATLAB、Excel和Tradestation,使用较低频率和较简单的策略时表现尚可。然而,如果要执行高频交易策略的话,必须要用C++等高性能语言编写搭建一个自用执行系统。说个题外话,在我以前工作的基金机构中,我们有个10分钟的“交易循环”,每10分钟下载一次新的市场数据,然后在同一时间段内基于该信息进行交易,使用的是优化后的Python脚本。若是分钟级或秒级的数据,我相信C语言或C++会更理想。
在更大的基金机构中,优化执行往往不是量化交易员的职责。然而在小公司或是高频交易型公司,交易员就是执行者,因此需要更广泛的技能组合。请记住,如果你想在基金机构工作,你的编程技术和你的统计学和计量经济学知识同样重要,甚至更重要。
另外一个在执行层面需关注的重要问题是如何最小化交易成本。交易成本通常由三个部分组成,佣金(或纳税),由经纪机构、交易所和证监会(或其他类似的政府监管机构)规定收取的费用;时延,即打算提交订单的时间和实际提交订单的时间差;差价,即交易证券买卖价格的差别。请注意,差价不是恒定的,而是取决于当前市场上的流动性(如买卖订单是否可用)。
交易成本会区分开拥有良好夏普率的可盈利策略和拥有较差夏普率的不可盈利策略。使用回测较难准确预测出交易成本。根据策略的频率,需获得历史的交易数据,其中包括买卖价格的勾选数据。基于这些原因,大型基金机构的整个量化团队都会致力于优化执行情况。
考虑这样的场景:某基金机构需要抛售大量交易(这样做的原因有很多)。抛售如此大的份额到市场上,会迅速地压低价格,从而得不到最佳执行。因此将订单慢慢流入市场的算法是存在的,尽管这样做会导致基金机构时延的风险。除此之外,还有一些针对这些必然性并利用其效率低下的其他策略。这就属于基金结构套利的范畴。
执行系统最后一个主要问题是关于策略性能和回测性能的差异的。产生差异的原因有很多。我们在考虑回测时,已经深入讨论过前瞻性偏差和优化偏差的问题了。然而,有些策略在部署之前并不能很好地测试出这些偏差。这主要发生在高频交易中。在执行系统和交易策略本身都可能存在漏洞,这些漏洞并不会在回测时出现,但却会出现在实时交易中。在策略实施后,市场可能会出现制度变化。新的监管环境、不断变化的投资者情绪和宏观经济现象都可能导致市场行为的变化,从而改变你策略的盈利能力。
风险管理
量化交易的最后一块拼图是风险管理流程。“风险”包括了之前讨论的各种偏差。还包括了技术风险,比如交易所的突然故障。还包括了经纪风险,比如经纪公司破产(这并非不可能,鉴于最近对曼氏金融这类情况的恐慌情绪)。简而言之,风险涵盖所有可能干涉交易实施的因素,来源可能有很多。很多作者用了整本书去讲述量化策略的风险管理,所以在这我不会展开讲述所有可能的风险来源。
风险管理还包括了所谓的最优资本配置,这是投资组合理论的分支。通过这种方式,资本被分配到一系列不同的策略以及策略中的交易上。这是个复杂的领域,依赖于一些高深的数学。与最优资本配置和策略杠杆相关的行业标准称为凯利公式。因为这是一篇介绍性文章,我不会深入讲述其计算方法。凯利公式对回报的统计性质作出了一些假设,在金融市场上未必成立,因此交易员在对其实施上通常持保守态度。
风险管理的另一关键组成部分是管理个人心理状况。在交易过程中可能会出现有许多的认知偏差。虽然在算法交易中,大家公认这不算是大问题,前提是让策略独自完成决策。一个常见的认知偏差是损失厌恶,即在处于损失状态,由于损失的痛苦,人们通常不愿进行斩仓处理。同样,还会发生由于害怕损失已经获得的足够多的利润,从而提前取出利润。另外一个常见的认知偏差是近期偏差。当交易员着眼于近期事件而非长远时,这种认知偏差就会出现。当然还有另外一对经典的情绪偏差——恐惧和贪婪。这通常会导致杠杆过低或过高,从而导致崩盘(例如账户权益趋于零或更糟)或减少收益。
总结
可以看出,量化交易是一个极其复杂但很有趣的量化金融领域。在这篇文章中,我只涉及到其皮毛,但篇幅已经很长了。有很多我只提了一两句的内容,都有很多对应的书籍和论文针对该内容详细展开。因此在申请量化交易岗位前,必须进行大量的基础性研究工作。至少你要在统计学和计量经济学方面有广泛的背景,并利用如MATLAB、Python或R等编程语言进行实现的大量实操经验。在更高频的更复杂的策略中,所需技术可能还包括Linux内核修改,C语言/C++,其它语言和优化网络延迟等。
如果你有兴趣尝试搭建自己的算法交易策略,我的首要提议是善于编程。我个人偏好是尽可能多地去搭建自己的数据采集器,策略回测和执行系统。如果你的资金要冒险投资,那么对系统进行过全面测试并了解其缺陷和特定问题后,你晚上睡觉才能安眠吧?将此外包给供应商,虽然短期内可以节省时间,但长期来看代价是昂贵的。