@Channelchan
2017-02-17T19:00:18.000000Z
字数 2841
阅读 818
未分类
如下图,一段策略代码在BigFish平台上挂载运行的过程可以分为三个阶段:
- 初始化阶段:
BigFish首先根据用户输入的运行起止时间,K线时间框架,交易品种,起始资金等运行参数生成资金账户(Account)和数据发生器(DataGenerator),生成策略运行引擎(StrategyEngine),并根据策略代码生成策略信号(Strategy)对象。它们分别有以下功能:
**Account**:负责管理记录账户的资金情况。
**DataGenerator**:向数据库拉取数据并向**StrategyEngine**推送数据。
**StrategyEngine**:核心事件引擎,管理行情数据、订单请求、订单取消等各种事件,缓存行情数据,保存策略运行时的所有信息。
**Strategy**:将策略代码拆分为多个单独的信号,管理它们的运行。
运行阶段:
StrategyEngine开始运行,DataGenerator开始向其推送数据。每当有新数据到来,StrategyEngine将通知挂载于其上的Strategy,Strategy中订阅了该数据的信号将被执行,执行过程中产生的下单指令将会被提交给StrageEngine,再由StrageEngine在合适的时间提交给经销商或者判断是否满足模拟成交。若下单成功,则更新Account中账户现金和当前持有仓位等相关信息。
绩效计算阶段:
DataGenerator告知StrategyEngine数据完结,StrategyEngine停止运行,并交由Performce模块根据Account中保存的账户净值等信息计算策略各项绩效指标,如最大回撤,sharpe ratio等,生成绩效报告(Backtest Report)。
您进入BigFish云量化平台所见的第一个demo,就是以下这个策略。它包含了在BigFish上实现策略所需要的最最基本的结构。您在新建策略时,也会生成此策略作为模板。您可以在此基础上进行修改以实现自己的策略思想。
def init():
# 初始化方法。在策略运行之初会且仅会执行一次。
# 在该方法中定义的变量均为全局变量,可以在信号方法中访问。
pass
def handle():
# 信号方法。每当有新的数据推送的时候都会执行一次。
# 在该方法中监测市场数据,进行订单操作。
"""
编写你的主要算法逻辑
通过变量Open,Close,High,Low,Time,Volume获取K线数据。
通过Buy,Sell,SellShort,BuyToCover进行下单。
详情请参见BigFish策略开发语法大全。
"""
# 若当前没有持仓,且收盘价小于开盘价
if MarketPosition==0 and Close[0]<Open[0]:
Buy(Symbol,1) # 开一手多仓
# 若当前持多仓,且收盘价大于开盘价
elif MarketPosition>0 and Close[0]>Open[0]:
Sell(Symbol,1) # 平一手多仓
您在策略代码中需要实现的基本方法分为两种:
- init方法: 该方法接受策略初始化事件,在策略挂载并开始运行时会被调用一次;
- 信号方法: 其他不以init为名的方法将被视为一个“信号”,信号订阅行情数据事件,每当有行情数据更新时都会被执行。在信号中,您可以通过我们提供的系统变量和函数,访问行情数据,持仓信息,订单信息等,并通过相应函数下单。
详情请阅读Bigfish系统关键字与操作符一节。
如果您想了解更多Python语法知识,请查看Python入门语法。
为了用户更加方便的实现各种风格的策略,我们将在之后提供对更多特定事件如定时事件乃至用户自定义事件进行接收处理的函数接口。