带你入门MindGo-我的第一个策略

用户头像量化官方小助理
2023-03-07 发布

首先,我们进入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同步的仿真交易。

评论