首先,我们进入MindGo平台,点击导航栏的开始研究,进入策略编辑页面,如下图:
点击新建,点击新建策略,进入MindGo的新默认策略页面,左侧是编写策略代码,右侧是运行策略后的结果:
我们现在在左侧编写一个简单的双均线策略,记得重命名策略名称哦(本文的例子交易单只股票-平安银行,使用日级别回测)。
1 平台框架与策略逻辑
平台框架:
(1)def initialize(account):
#初始化方法,在整个回测、仿真交易中最开始执行一次,用于初始一些回测参数,也可定义全局变量
(2)def handle_data(account, data):
#设置买卖条件,每个交易频率(日/分钟/tick)调用一次(循环操作);
#该函数在回测中的非交易日是不会触发的(如回测结束日期为1月5日,而1月1日至3日是非交易日,则handle_data在1日至3日不会运行,4日继续运行)。
MindGo平台的几乎所有策略都基于这个框架,即:
(1)初始化账户,即最开始要做的事情,如选定股票,设置变量、参数等;
(2)设置买卖条件,每个交易频率(日/分钟/tick)调用一次。
策略逻辑:当五日均线与二十日均线金叉时买入,当五日均线与二十日均线死叉时卖出。
人为操作(分三步):
(1)先决定好交易哪一个股票;
(2)获取收盘价数据并计算五日均线和二十日均线;
(3)判断五日均线与二十日均线是否金叉,如果是,开盘就买入;如果不是,开盘就卖出。每天都这么做,循环下去。
接下来我们告诉计算机如何去实现这个策略逻辑,也分三步:
(1)初始化账户;
(2)获取收盘价数据,计算均线;
(3)判断是否买卖并下单。
2 初始化账户
我们先设置要交易的股票的代码,比如平安银行(000001):
def initialize(account):
account.security = '000001.SZ' #设置要交易的股票(000001.SZ 平安银行)
其中:account参数为Account对象,存放当前账户、股票持仓信息
3 获取收盘价数据,计算均线
# 首先,获取股票过去20日的收盘价数据:
def handle_data(account, data):
# 获取股票过去20日的收盘价数据
close = data.attribute_history(account.security, ['close'], 20, '1d')
# 然后,计算五日均线价格和二十日均线价格
MA5 = close.values[-5:].mean() # 计算五日均线价格
MA20 = close.values.mean() # 计算二十日均线价格
其中:
attribute_history:data对象,获取单只证券历史行情数据(单只证券多属性数据,只能在handle_data中使用)
data.attribute_history(symbol, fields, bar_count, fre_step, skip_paused=False, fq=None) (详见帮助的API文档)
例:
value = data.attribute_history('000001.SZ', ['close', 'open'], 2, '1d', True, None) # 获取平安银行股票前两天的收盘价
4 判断是否买卖并下单
数据已获取完毕,接下来我们做买卖判断:
# (1)如果五日均线大于二十日均线,则使用所有现金买入股票,记录这次买入;
if MA5 > MA20:
# 使用所有现金买入股票
order_value(account.security, account.cash)
# 记录这次买入
log.info("买入 %s" % (account.security))
# (2)如果如果五日均线小于二十日均线,并且目前有头寸,则使用所有现金买入股票,记录这次卖出。
if MA5 < MA20 and account.positions_value > 0:
# 卖出所有股票
order_target(account.security, 0)
# 记录这次卖出
log.info("卖出 %s" % (account.security))
其中:
(1)order_value:按金额下单
order_value(symbol, value, limit_price=None, style=None) (详见帮助的API文档)
例:
order_value(symbol='000001.SZ', value=1000, limit_price=10.0) # 以开盘价买入价值1000元的平安银行股票,如果价格超过10元,则不买入
(2)order_target:按目标股数下单,即将标的证券的持仓数量调整至目标股数
order_target(symbol, target, limit_price=None, style=None)
例:
order_target('000001.SZ', 0) # 将股票全部卖出
order('000001.SZ', 100) # 若order下单买入100股成功,则当前持仓100股
(3)log:打印输出
log.info:打印输出日志或其他信息
log.error:正常情况下不使用,可以使用log.error来结束回测(即当执行到log.error后,回测将停止)
例:
log.info(get_open_orders()) # 打印所有未完成订单
if account.cash < 1000: # 当资金小于1000元时,打印信息并结束回测
log.error("资金不足")
6 策略代码写完,进行回测
把买入卖出和下单的代码写好后,策略就写完了,记得保存哦,完整双均线策略如下:
# 双均线策略
# 策略逻辑:当五日均线与二十日均线金叉时买入,当五日均线与二十日均线死叉时卖出。
# 初始化账户
def initialize(account):
# 设置要交易的股票(000001.SZ 平安银行)
account.security = '000001.SZ'
# 设置买卖条件,每个交易频率(日/分钟/tick)调用一次
def handle_data(account, data):
# 获取股票过去20日的收盘价数据
close = data.attribute_history(account.security, ['close'], 20, '1d')
# 计算五日均线价格
MA5 = close.values[-5:].mean()
# 计算二十日均线价格
MA20 = close.values.mean()
# 如果五日均线大于二十日均线
if MA5 > MA20:
# 使用所有现金买入股票
order_value(account.security, account.cash)
# 记录这次买入
log.info("买入 %s" % (account.security))
# 如果五日均线小于二十日均线,并且目前有头寸
if MA5 < MA20 and account.positions_value > 0:
# 卖出所有股票
order_target(account.security, 0)
# 记录这次卖出
log.info("卖出 %s" % (account.security))
进行回测:在我的策略回测界面右上角,先设置回测时间:从2016-04-05到2017-04-05,设置初始资金100000,回测频率为每日,最后点击左上角的运行。
运行结果:
如果代码无误,点击运行后就会顺利进行回测,点击回测结果,如下图,共耗时11秒:
至此,我们就完成了一个简单的双均线策略啦!接下来就是开启交易提醒,使MindGo上的仿真交易信号可以实时推送至同花顺手机APP~
7 开启与同花顺APP同步的仿真交易
策略写好,回测完成后(记得要回测完成后哦),点击回测结果中的开启仿真交易:
页面跳转出开启仿真交易的对话框,选择已有账户:
点击确定后即开启仿真交易(如果尚无账户,可先在交易页面的左上角添加账户后再点击开启仿真交易)。
开启交易提醒,仿真交易与同花顺APP同步,交易信号,实时推送!
绑定账户并开启交易提醒后,当模拟交易发出下单信号时,同花顺手机APP上将收到这样的消息推送:
点开同花顺APP的消息推送,显示:
点击查看:
MindGo上的仿真交易信号就同步在同花顺手机APP上了,是不是很方便呢~
至此,带你入门MindGo之我的第一个策略就学完啦,聪明的您是不是觉得很简单呢?快来编写您的第一个策略吧~
温故知新
通过阅读这篇帖子,我们学会了:
(1)MindGo的回测框架;
(2)学会写一个简单的策略--双均线策略;
(3)开启与同花顺APP同步的仿真交易。