量化交易入门书籍-Quantitative Trading how to Build Your Own Algorithmic Trading Business 03


(yishui) #1

英文书籍的特点就是废话是比较多的,写这个系列也是挑出精华部分,另外加上自己在实操中的一些东东,进行修改,但是是按照书的内容精神走。

英文书籍的特点就是废话是比较多的,写这个系列也是挑出精华部分,另外加上自己在实操中的一些东东,进行修改,但是是按照书的内容精神走。

回测文件格式

做交易时往往涉及到不同的交易品种,一般会按品种区分文件夹,如下图(这里是下载了所有的主力合约,就是每天交易量最大的合约):

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘429’%20height='401’>)

每一个文件夹按照品种命名,我们在做回测时需要保证读取数据时,路径及数据格式统一,方便不同策略回测,我们打开a文件夹,如下图:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘384’%20height='191’>)

这个文件夹里装着这个品种从11年以来的所有交易数据,数据命名格式为交易的合约标的(如:a1201)+ 数据日期(如:20110329),储存格式为TXT文本文件,下面我们再打开一个数据交易合约看看,如下图:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘637’%20height='303’>)

我们可以看到第一行#开头的为昨日的数据:开盘价、收盘价、成交量;第二行为今日交易数据,分别为:交易时间(time)、买价(bidprice)、买量(bidvolume)、卖价(askprice)、卖量(askvolume)、成交价(settleprice)、成交量(settlevolume)、累计成交量(totalvolume)。

所有的交易数据都以以上的格式进行储存。

现在我们用PYTHON来读取一下交易文件:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘789’%20height='98’>)

输出结果:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘449’%20height='115’>)

在回测中我们会写一个批量读取文件的函数,然后打开每日交易数据后,按照行数依次读取,在这里多讲一点点,我们可以观察一下上图的输出结果,其实交易数据并不是连续的,因为交易所只有在有交易产生的时候才推送一次数据,而且是数据快照,我们在做统计套利的策略时,就需要做一些处理,两个方法,一是提前对基础数据进行填充,将缺失的数据以上一个数据源填充,二是在回测程序中去识别交易时间,推送匹配的数据。但是在做其他交易策略时,数据点的缺失影响并不大。

策略评价指标

量化交易员会使用很多不同的指标来衡量策略的表现,这个跟个人偏好有很大关系(也就是前面说到的个人对策略风险与收益之间的偏好),对EP.CHAN来说他最看重的两个指标是夏普率和回撤,在第二章中已经提到了夏普率,最大回撤和最大回撤期间(maximum drawdown duration),在这里,我们将介绍这些指标的具体计算方法。

夏普率:

通常,如果你计算你的平均收益和标准差收益需要基于一个交易区间T,T可以是按月、按天甚至按小时算,你必须确认你的交易时间跨度里有多个个T,我们记为Nt,那么年化夏普率为:

![](data:image/svg+xml;utf8,<svg%20xmlns=‘http://www.w3.org/2000/svg’%20width=‘505’%20height='35’>)

下面将用程序思维来表达计算方法,设:

value列= 每日日终的持有市值

daily return列 =value(2:end) - value(1 : end -1) / value (1 : end -1 )

每天的回报率都等于(T日终市值-T-1日终市值)/T-1日终市值

excessRet列 = dailyreturn - Rf(无风险收益率)/ 252 (每年252个交易日)

sharperatio = sqrt(252) * mean(excessRet)/std(excessRet)

大家可以测试一下每日赚0.01%的夏普率和今天赚0.03%,明天亏0.01%的两种情况下夏普率的差距,就比较能理解夏普率的概念了。

最大回撤:

最大回撤就比较简单了,设置一个变量 maxdraw = 0 ,当策略亏损时,就更新maxdraw , 交易结束时,就得到了期间最大亏损值。

最大回撤区间:

同样的设置变量 drawdownduration = 0,maxdownduration = 0

如果 t时刻策略亏损

drawdownduration + = 1

如果 t时刻策略盈利

drawdownduration = 0 (一旦盈利就初始化为0)

更新 maxdownduration

最后一部分是使用回撤数据需要注意的地方,作者东西写的比较散,但是都比较实用。

Look-ahead bias 使用未来数据

就是你在T日交易,你使用了T+1日的数据,我曾经有个策略就是这样,最终的结果就是策略盈利很恐怖,类似于如果T+1日涨,策略就在T日买入。基本上就是上帝视觉,你知道了明天市场将发生的情况。

Data-Snooping Bias 过度拟合

前面已经讲到了这个概念,解决方法:1、用新数据测试 2、对策略进行鲁棒性检验

Sample Size 数据集大小

以前有一个同学告诉我他发现了简单移动平均线赚大钱,我就问了他你按什么数据区间测试,他回答按照每日,共才800个数据。我说基本你选择了最优路线就回到了过度拟合中。

下一篇我们将按照书中的代码实现一个简单的统计套利策略。