从一个非常简单的交易策略开始什么是“初始化+周期循环”框架?为了将投资灵感高效地转化成计算机可执行的量化策略,必须基于一种模式来写,框架就是指这种模式。而此框架包含两个部分即初始化与周期循环: 初始化即指策略最开始运行前要做的事。比如,准备好要交易的股票。 周期循环即指策略开始后,随着时间一周期一周期地流逝时,每个周期要做的事。如例中,周期为天,周期循环的则是每天买100股的平安银行。 能帮助你理解这一框架的是,其实人本身日常做交易就是符合“初始化+周期循环”框架的,初始化就是已存在人脑的交易思想与知识,周期循环就是每天或每分钟地查看行情、判断、下单等行为。
如何把策略变成计算机可执行的程序?那么如何将策略写成代码?这并非三言两语就能说清,尤其是对于没有编程基础的人。所以我们将通过后续的内容逐步地介绍。首先我们将学习“初始化+周期循环”框架代码的写法。 写法一 def initialize(context):
这里是用来写初始化代码的地方,例子中就是选定要交易的股票为平安银行 def handle_data(context,data):
这里是用来写周期循环代码的地方,例子中就是买100股的平安银行 写法二 def initialize(context):
run_daily(period,time='every_bar')
这里是用来写初始化代码的地方,例子中就是选定要交易的股票为平安银行 def period(context):
这里是用来写周期循环代码的地方,例子中就是买100股的平安银行
框架写成代码了,那例子的完整的代码该怎么写呢?剩下的两行代码这么写。完全理解需要学习后续的内容,此处不要求理解。知道大概什么样子往哪里写即可。 选定要交易的股票为平安银行: g.security = '000001.XSHE' 买100股的平安银行(市价单写法): order(g.security, 100) 以写法二为例把剩下的代码补上后,完整代码为: def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
那么现在这些代码就可以运行了吗?是的。以写法二为例,如图把代码写到策略编辑区,设置好初始资金与起止时间(比如初始资金100000元,起止时间20160601-20161231),频率设置成天。点击编译运行,运行结束后就可以看到结果了。
 可以看到,若你20160601有初始资金100000元,每个交易日尝试买100股的平安银行,到20161231,你的收益曲线将如图中蓝线般增长。图中红线是基准收益(默认是沪深300指数,代表整个市场增长水平) 接下来,点击运行回测,运行结束后就可以看到更为详细的结果,包括下单记录、持仓记录等。

策略出错不能运行?- 策略不能运行时,日志中会报错并给出一定的提示信息,像这样:
 首先注意,右上角的箭头按钮能展开运行日志。看到日志中,最后一行是错误的提示信息: SyntaxError: invalid syntax 汉义是 语法错误:不合法的语法。 最后一行之前的是错误的位置信息,一般只看后面就行。 File "user_code.py", line 1
def initialize(context)
^ 意思是文件user_code.py(就是你的策略代码)的第一行,“^”符号指向的位置有错。你到代码中的这个位置看下,会发现少个冒号。 为了顺利运行策略,需要耐心解决错误,但错误的原因极度的复杂多样(所以日志的报错信息也多种多样,不止图上一种),故在此只针对例子讲下新手容易犯的错误: - 符号要用英文输入法。下图,代码第一行的冒号是中文的,所以出错
 - 拼写不要错。下图,security拼写错了
 - 缩进要对齐。下图,缩进没对齐。缩进的时候可以按键盘tab键或四个空格。

编程界往往把错误叫bug,而不断调试去除错误的过程叫debug,做量化时也是时常听到的说法,大家应该知道下。 - 而且debug通常就是要耗费不低于写bug写代码的时间的,所以会debug是很重要的能力,大家平时debug的时候不妨多思考下,如何更有效率的debug。当然,我们后续也会介绍些debug的技巧。
回测、编译运行、运行回测都是什么意思?像刚刚那样,用一段时间内的历史的真实行情数据,来验证一个确定的交易策略在这段时间表现如何,这个过程叫回测。 运行回测就是是字面意思,让计算机运行这次回测,运行后会告诉你策略在这段时间表现情况,比如收益率、年化收益率、最大回撤、夏普比率等指标,而且一般也会包括下单记录、持仓记录等。 编译运行其实也是让计算机运行这次回测,不过相比于点击运行回测,编译运行的结果比运行回测要简单,只有收益率等指标,因此也速度更快。所以,当还不必要得到详细的结果时,或只是想调试下策略的代码,看是否无误可运行时,编译运行就比运行回测更方便。
周期循环具体是什么时候开始的呢?
|