楼主: yao_heart
5270 3

[交易策略] 常见的回测陷阱(三) [推广有奖]

  • 3关注
  • 1粉丝

硕士生

5%

还不是VIP/贵宾

-

威望
0
论坛币
464 个
通用积分
2.7000
学术水平
1 点
热心指数
1 点
信用等级
0 点
经验
1929 点
帖子
67
精华
0
在线时间
117 小时
注册时间
2014-7-16
最后登录
2023-10-25

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

公众号的内容都是本人这些年在交易过程中的所看、所感和所悟,以下内容是从国外的一本交易书籍(《ALGORITHMIC TRADING》)亲自翻译过来,以后会陆续的翻译,觉得有意思的会和大家分享,当然,翻译水平有限,希望大家多多体谅,希望大伙能喜欢,正文如下:

    之前讲过了五种偏差,分别是前视偏差、数据透视偏差和线性美,股票拆分和股息的调整 股票数据库的幸存者偏差  原始和合成的股票价格,以下是继续翻译的内容:


货币报价的场所依赖


    相比股市,外汇市场更加分散,没有规定要求,在这个场地成交的交易必须要和所有其他场地的交易交互,两者买价和卖价必须处于最好的价位。因此,为了使回测更贴近现实,我们的历史数据只能从预期要做交易的场所里去提取。


    有一些报价整合机构,例如Streambase,会把不同场地的交易数据整合在一个订单表格里,在这种情况下,只要你能在形成这些综合订单表格的组成场所执行交易,你才可能用这些综合数据做回测。


    外汇的实时报价和历史数据的另外一个特征是,成交价格和成交量一般是不常用的,至少是会有个小小的延迟,这个与买入和卖出报价截然不一样。因为没有监管要求做市商或ECN必须把交易价格报告给市场上所有参与者。事实上,许多做市商有专有权利查看交易信息和有价值的信息(他们非常聪明的利用这些信息,因为很多高频交易策略依赖于订单流量信息和交易价格,我们将会在第七章提到,还有银行的外汇自营盘毫无疑问乐于把这些信息给自己用)。因为同样的外汇对的买卖价在不同的场所变化非常不一样,所有任何时候都建议用买卖报价对外汇策略进行回测。因此,交易成本高度依赖交易场所,所以在回测中要考虑到这点。


卖空限制

   

    一个涉及做空的股票交易模型,它的前提假设是这些股票可以卖空,但是实际情况中,许多股票是很难卖空。为了做空股票,你的经纪人是有能力去从其他的顾客或者机构(通常是共同基金或者其他资产管理公司,持有许多股票的大量多头头寸)“定位”一定数量的这些股票,并且安排股票借给你。如果已经存在一个大空头了,那么说明该公司的大量股票已经被借出去了,或者股票的持有量有限,你的股票可能“难借”。难借就意味着你必须要为做空给股票出借者支付利息,这个和正常情况是倒过来的。极端情况下,你可能根本借不到你想要做空的股票数量。自从雷曼兄弟在08-09年金融危机倒闭后,美国证监会(SEC)就在几个月内禁止了所有金融行业卖空股票的行为。如果你的回测模型在做空股票的时候,难以借到或不能借到票,这可能会展示一个美好的回报,因为没有其他人可以做空和压低它的价格,但是这个结果是完全没有实际意义的。这使得卖空约束对回测是非常危险的。但是你又不容易从经纪商给你的股票名单里面,准确找到历史上很难借到的股票列表。作为一般的情况,小盘股比大盘股受卖空约束的影响大得多,所以通过空头头寸获取的回报是要受到更多的质疑的,要牢记一定,有事ETFs比个股还要难借,这是我的发现,例如在雷曼兄弟倒闭之后,连短期做空几个月的SPY都借不到。


    另外一个附加的卖空约束是所谓的”报升规则“,有美国证监会(SEC)施加的。原始的报升规则生效于1938-2007年,卖空的成交价格正常情况下必须要高于最后一次成交价格,或者如果最后一些成交价格高于之前的成交价格,就等于最后一次成交价格。(对于纳斯达克的股票,卖空价格必须高于最近的买入价,而不是最后的成交价格。)新的报升规则生效于2010年,它要求卖空的成交价格必须高于全市场最好的买入价,和旧的规则相比,它的区别仅仅是在熔断已经触发的时候。当股价比前一个收盘价低10%时,该股票就会触发熔断。该熔断在第二天恢复正常,所以很有效地阻止了空头报单被填满。所以再次强调,一个真正准确涉及到卖空的策略回测必须要考虑到这些约束,看看在历史交易应该发生的时候,这些约束是否生效。否则,回测结果会被夸大!


期货连续合约


    期货合约有到期日的,所以一个交易策略在比如原油期货上,实际上在许多不同的合约上交易。通常,策略是应用在近月合约上,那张合约为近月取决于你何时把仓位展期到下月,也就是说,当你计划把当前月份的合约卖掉,然后买入下月最近到期的合约(假设你准备持有多头合约)。有些人会在近月合约到期前的10天换仓到下月合约,其他人根据“持仓交叉”来换仓,,即当下个合约的持仓量大于当前合约的时候。所以不管你什么时候换仓,都是要额外费心在你交易模型体现出来,因为这一买一卖是和你的策略是相互独立的,但是会导致额外最小的收益或回报和损失(P&L)。(P&L,或收益,当然会受所谓的换仓影响,但我们会在第五章做广泛的讨论,换仓的收益会受每天的影响,而不是只在换仓那一下有结果。)幸运的是,许多期货数据供应商也会意识到这点,所以他们通常会提供我们所知的“期货连续合约”数据


    在这里我们不会讨论你自己如何创建一个连续合约,因为这些数据你可以在许多期货公司的网站上看到。但是这个过程中有个细微差别你需要注意到,创建连续合约的第一步是在给定一个特定的展期日,然后把近月合约的价格连接在一起,但是这样会导致价格序列在展期日前后,会有一个显著的缺口,这个差距将会在你的回测里,凭空创造一个虚假的收益率或者P&L。


    为了说明这点,我们假设近月合约的收盘价在T日是p(T),T+1日是p(T + 1),同理假设下个最近合约(也称为后面合约)的收盘价在T + 1是q(T + 1)。假设T+1是展期日,如果我们是做多近月合约的,我们应该是先在T+1日以价格p(T + 1)卖掉近月合约,然后以价格q(T + 1)买入下个合约。策略在T+1日的P&L(点数,不是金额)和收益率是多少呢?P&L是p(T + 1)−p(T),收益率是(p(T + 1) − p(T)/ p(T)。但是未经调整的连续合约的收盘价格在T日会显示为p(T),T+1日为q(T + 1),如果你安装一贯方法来计算P&L和收益率,你可能会计算到错误值,它们分别是q(T + 1)−p(T)和(q(T + 1)−p(T)/ p(T)。为了防止这样的错误,期货数据供应商通常回调数据序列,以消除价格缺口,使得在T+1日的P&L为p(T + 1)−p(T)。他们地做法是,在T日或T日前,把数值q(T + 1)−p(T + 1)加到每个价格p(t)上,这样在T日到T+1日之间,价格和P&L的变化都会被正确计算成q(T + 1)−(p(T)+q(T + 1)−p(T + 1))= p(T + 1)−p(T)。(当然,要考虑到每个展期,当你的往回调用的历史数据越多,你不得不调整更多次。)


    我们的问题解决了吗?不完全。我们计算下调整之后的T+1日的收益率:( p(T + 1) − p(T ))/( p(T ) + q(T + 1) − p(T +1)),不是(p(T + 1)−p(T)/ p(T)。如果你调整好了,使得P&L计算正确,你计算收益率就会不正确,反过来,你调整好了价格序列使得收益率计算正确(在T日或T日前,把数值q(t + 1)/ p(t + 1)乘到每个价格p(t)上),但是之后P&L的计算会错误,两者不可得兼。只要你想通过使用连续合约序列方便回测,你不得不选择其中之一作为业绩评估,P&L或者收益率。(如果你愿意费心去回测你每个策略在不同的单张合约上,而且亲自考虑到换仓是一买一卖,这样你的P&L和收益的计算会同时正确。)


    我们选择价格调整方法来代替收益率回调方法会出现额外的困难:在遥远的以前,价格可能会出现负数。这样会对你的交易策略带来难题,也会对你计算收益率产生问题。一个普遍的处理方法是,在所有的价格上都加上一个常数,这样价格就不会出现负数了。


    当我们的策略涉及到不同合约的价差时,准确的选择调整方法是非常重要的。如果策略的交易信号是基于跨合约的价差,你必须选择价格调整方法,否则,价差可能是错误,这样会产生错误的交易信号。当策略涉及到跨期价差(相同标的物,不同交割日的合约价差),这个回调方法更重要。这是因为相比于单腿的价格,跨期价差是非常小的,所以因为展期导致的任何错误值,和价差相比,都会是很大比例,这样有很大可能在回测和实盘触发错误的信号。然而,如果你的策略产生的交易信号是基于两个合约的价格比率,那么你必须选择收益率回调方法。


    如上所述,当你选择供应商提供的期货历史数据时,你必须要准确了解他们是怎么处理这个回调问题的,因为它必定会影响到你的回测。例如,csidata.com仅使用价格回调方法,但是可以选择加入常数到价格上,以防出现负数。但是tickdata.com允许你选择价格和收益率回调方法,但是没有额外的选择常量以防价格出现负数。


期货的收盘价或结算价


    对于期货合约的每日收盘价,数据供应商一般都是结算价,而不是该合约的当日最后一次成交价。请注意,每个期货合约都会有一个结算价(由交易所决定),即使该合约当天没有任何交易。如果该合约有交易,它的结算价一般也是不同于最后一次成交价。大部分历史数据供应商提供结算价作为收盘价。但也有一些供应商,提供实时tick数据,可能只提供实际交易价格, 因此它的收盘价可能是最后一次成交价格。如果某天只有一次交易,哪个价格我们用来回测策略呢?


    在大多数情况下,我们应该使用结算价,因为如果你在收盘附近做交易,结算价是最接近你的成交价格的。最后一次有记录成交价格可能是在几个小时前出现的,和你接近收盘时的成交价基本上没有关联。尤其是在我们构建成对交易策略时,价格的使用更重要。如果你的是结算价去计算期货之间的价差,你要确保两者是同时发生的(如果两个合约是同一标的物,它们的收盘时间是一致,因为可以确保是同时发生的,如果交易的是跨市场价差,我们将在后面的章节讨论)。然而,如果用最后的成交价格去计算价差,你用的价格可能产生于两个非常不同的时间,显而易见是不对的。这个错误意味着你的回测程序会造成错误的交易,因为计算出的价差虽然很大,但是不真实。这会导致你的回测可能产生不真实的收益,但是在将来实盘的时候,成对交易同时发生时,真实的价差可能是个很小的值。所以,和之前所以的一样,夸大测试结果是一件很危险的事情。


    如果你有一个盘中价差策略,或者你的价差策略需要期货盘中价格数据,你需要两种数据之一就行,一是两个合约都要有买价和卖价数据,二是直接来源于交易所的原始盘中数据。这是必须的,因为好多期货合约没有很强的流动性。所以用每根K线的最后价格来计算价差,我们会发现合约A和合约B在同一根K线上的最后成交价格,可能在成交时间上离得很远。使用不是同时发生的价格计算价差是不真实的,实际操作中是要同时买入一腿,卖出另一腿的。盘中价差的回测使用的是每条腿的最后价格,而不是价差本身的最后价格,同样会夸大收益率结果。推荐一个供应商,可以提供盘中历史跨期价差数据(包括报价和成交价),网址是cqgdatafactory.com。

   

    在回测跨市场价差时,有一个大众的细节不能忽视,如果两个合约在不同的交易所交易,它们很可能是不同的收盘时间,所以如果用收盘价计算跨市场价差会是错误的。这个细节同样适用于期货和ETF的价差。一个显而易见的补救方法是,保证获取到的盘中数据是同步的。其他可能的方法是交易ETF的同时,另一腿交易可以代替期货本身的标的物。例如,我们可以选择黄金信托GLD和GDX成对交易,去代替黄金期货GC(收盘时间在美国东部时间下午1:30)和黄金矿业ETF GDX的成对交易,因为两者都是在Arca交易,而且收盘时间一致,都是美国东部时间下午4:00.



欢迎加入“量化投资宽客”,这里会分享量化策略和最新观点,欢迎您的留言!



二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:Algorithmic Algorithm tickdata Trading factory 希尔顿酒店 数据库 幸存者 股息 机构

沙发
wb123456 发表于 2017-6-13 10:32:22 |只看作者 |坛友微信交流群
[handshake]

使用道具

藤椅
lwell20 发表于 2017-6-13 12:40:53 |只看作者 |坛友微信交流群

使用道具

板凳
刘小仔仔 发表于 2017-12-6 12:28:45 |只看作者 |坛友微信交流群
谢谢了楼主

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jr
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 03:46