第一节:MindGo 量化交易平台
MindGo 量化交易平台是同花顺旗下的人工智能投资平台,拥有高质海量的金融数据,
零延迟的回测引擎,最接近真实市场环境的仿真交易平台,干净、完整的API 文档,同时支
持目前广泛使用的脚本语言——Python 语言,致力打造国内一流的专业在线量化交易平台,
帮助广大投资者和高校师生实现量化策略,开启AI 时代,让投资变得更简单!
MindGo 提供以下服务:
1.数据
MindGo 数据基于 2014 年至今完整的Level-2 数据,包括完整的停牌、复权数据,且会
在第二 日早晨更新。除此之外,MindGo 还提供上市公司财务数据、场外基金数据、行业指
数数据、股指期货数据等等。
2. 回测引擎
MindGo 提供了高效快捷的回测环境和简洁的API 文档,支持对沪深A 股、ETF 的日级
或分钟级回测,回测结果实时显示、快速响应、数据全面,方便用户随时检验和优化策略。
3.模拟交易
MindGo 提供实时的沪深A 股和 ETF 模拟交易工具,并支持分钟和日级运行,实时呈现
策略表现。为量化交易爱好者提供全面、及时、专业、个性的一站式服务。
4.研究平台
MindGo 提供IPython Notebook 研究平台,初学者可在研究平台上学习 Python 语言,专
业研究者可获取数据,进行研究,最终研究结果支持文件导出和策略应用。
5.量化交流社区
MindGo 提供线上交流社区,便于量化爱好者交流量化策略,学习量化知识,一起成长。
----------------------- Page 10-----------------------
第二节:MindGo API 介绍
一、回测引擎介绍
回测环境
MindGo 提供的回测引擎运行在Python 3.5 之上, 因此策略代码必须兼容Python3.5 ,整个
回测环境支持所有的Python 标准库和部分常用第三方库。
回测过程
1.您的策略必须在initilize 函数框架下实现:
A.initilize 为初始化函数,用于初始一些全局变量,在整个回测过程最开始执行一
次。
B.handle_data 为时间驱动函数,用于设置买卖条件等,每个回测时间频率 (每日/
分钟/tick )调用一次。
以下是一个简单的策略,每日开盘买入 100 股贵州茅台,让我们体验一下整个回
测过程 !
# 初始化账户
def initialize(account):
# 定义要交易的股票:贵州茅台
account.security = '600519.SH'
# 设置买卖条件,每个交易频率 (日/ 分钟/tick )调用一次
def handle_data(account,data):
# 每天开盘买入 100 股贵州茅台
order(account.security,100)
2. 完成策略编写后,选定回测开始日期和结束日期,选择初始资金、调仓频率(每日或每
分钟) 等参数, 点击"进行回测" ,即开始回测。
3. 回测引擎根据您选择的调仓频率调用 handle_data 函数,也就是执行该函数下的代
码。回测引擎会实时显示策略当前时间的数据,如收益、风险指标、持仓等信息。
----------------------- Page 11-----------------------
4. 回测引擎会根据您所使用的下单方式进行下单,并根据后续实际成交情况进行订单处
理;
----------------------- Page 12-----------------------
5.您可以在任何时候调用 log 函数来打印需要输出的日志;通过 record 函数输出自定义
图形。添加log.info 函数与 record 函数后的代码如下:
# 初始化账户
def initialize(account):
# 定义要交易的股票:贵州茅台
account.security = '600519.SH'
# 设置买卖条件,每个交易频率 (日/ 分钟/tick )调用一次
def handle_data(account,data):
# 每天开盘买入 100 股贵州茅台
order(account.security,100)
# 获取账户可用资金
money=account.cash
# 获取账户已用资金
used_money=account.capital_used*(-1)
#log.info() 函数打印信息
log.info(' 已使用资金'+str(used_money))
#record 函数进行 自定义画图,分别为可用资金与已用资金
record(money=money,used_money=used_money)
策略运行结果,回测结果页面上分别显示了可用资金和 已用资金曲线:
----------------------- Page 13-----------------------
运行时间
回测引擎通过以下方法对您的策略进行回测
1.开盘前(9:00)运行:
before_trading_start 函数
2. 盘中运行:
handle_data 函数
> 日回测(9:30:00)运行一次
> 分钟回测(9:30:00-11:30,13:00:00-15:00:00) ,每分钟运行一次
3.盘后(15:30)运行:
after_trading_end 函数
订单处理
对于你的策略在某个单位时间下的单,回测引擎会做如下处理:
1.按每日回测
A. 交易价格:
> 市价单:开盘价+滑点。
> 限价单:委托价+滑点。
B.最大成交量:
> 默认为下单个股当日总成交量的 25% 。
> 若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大
成交量成交。
C.撮合方式:
> 市价单:开盘下单,一次性撮合,不成交或未成交部分即刻取消委托。若开盘价为
涨停价,则买入不成交;若开盘价为跌停价,则卖出不成交。
> 限价单:开盘下单,之后每分钟均按分钟价量撮合一次,未成交部分顺延至下一分
钟进行撮合,直到完全成交或者当天收盘为止。
2.分钟回测
A. 交易价格:
> 市价单:当前分钟起始价+滑点
> 限价单:委托价 + 滑点,如不符合则不成交
B.最大成交量:
> 默认为下单个股当前分钟总成交量的 50% 。
> 若下单量低于最大成交量,则按下单量成交;若下单量大于最大成交量,则按最大
成交量成交。
----------------------- Page 14-----------------------
C.撮合方式:
> 市价单:分钟起始点下单,一次性撮合,不成交或未成交部分即刻取消委托。若分
钟起始价为当日涨停价,则买入不成交;若分钟起始价为当日跌停价,则卖出不成交
> 限价单:分钟起始点下单,之后每分钟均按分钟价量撮合一次,未成交部分顺延至
下一分钟进行撮合,直到完全成交或者当天收盘为止。
二、函数 API 介绍
MindGo 量化交易平台有80 多个函数,每个函数都有其功能,本节主要介绍三类函数,
并针对该类函数中的最常用 1 至2 个函数做简要介绍,并在下一节中,能完成第一个量化策
略。
第一类量化策略框架函数,为了驱动策略回测、规范量化策略编写,MindGo 提供以下
两个函数:
1.初始化函数:initialize
函数调用方法:
def initialize(account):
函数功能:
def initialize(account): 是初始化函数,整个回测只在最开始时执行一次,用于初始化
账户信息、回测参数、全局变量等.
注意事项:
1.该函数用于初始化账户,任何一个策略都必须有该函数,相当于开户.
2.在该函数下,你可以设置很多初始条件,例如:基准指数,交易佣金,滑点,股票池等
等.
3.该函数不能写成initialize(account) ,而必须写成python 的函数形式:def
initialize(account) :(温馨提示:不能落下冒号.)
示例:
def initialize(account):
#初始化策略时设置股票池
account.security='000001.SZ'
2.定时运行函数:handle_data
函数调用方法:
def handle_data(account, data):
函数功能
def handle_data(account, data):函数用来定时执行买卖条件,每个交易频率 (日/分
钟/tick )自动调用一次.
注意事项:
1.该函数在回测中的非交易日是不会触发的.(例如1 月1 日至3 日是非交易日,则handle_data
在1 日至3 日不触发,直到下一个交易日4 号触发)
2.该函数的交易频率根据策略的交易频率,在盘中运行:
i. 日回测(9:30:00),每日运行一次.
ii.分钟回测(9:30:00-11:30,13:00:00-15:00:00),每分钟运行一次.
----------------------- Page 15-----------------------
3.在该函数中,可以传入其他函数的运行结果,用来判断买卖条件.
4.该函数不能写成handle_data(account, data) ,而必须写成python 语言中规范的函数形式:
def handle_data(account, data):(温馨提示:不能落下冒号)
示例:
# 每个交易频率下单买 100 股的平安银行股票.
def handle_data(account, data):
order('000001.SZ', 100)
第二类获取数据函数,以函数形式,通过参数设置以满足您数据获取:
1.行情数据获取函数:history
调用方法:
history(symbol_list, fields, bar_count, fre_step, skip_paused = False, fq = 'pre', is_panel=0)
函数功能:获取多只股票多属性的历史行情数据。
函数参数:
参数 含义 参数举例
symbol_list 股票、指数或基金代码列表 填写需要获取数据的股票代码,可多个股票
同时获取,例如:['600519.SH']
fields 数据字段 填写需要获取的数据字段,例如:收盘价为
close,最高价为high ,['close','high']
bar_count 历史长度 填写需要获取的数据历史长度,例如:20
fre_step 时间步长 填写获取数据的时间步长,例如:按天则
为’1d’, 按x 分钟则为’xm’ 。
skip_paused 是否跳过停牌数据 填写获取数据是是否跳过停牌,例如:不跳过
为 skip_paused=False,跳过为
skip_paused=True 。
fq 复权选项 填写获取数据的复权选项,fq=None 为不复权,
fq='post'为后复权,fq='pre'为前复权。
is_panel 返回数据格式 选择返回的数据格式,is_panel=1 为
pandas.panel 格式,is_panel=0 为 dict 格式。
注意事项:
1.该函数没有起始日期,结束日期默认为上一个交易日或上一分钟。
您只需要在策略代码中调用相该函数,并确定函数内的参数,即可获取到相应数据,详细参
考以下两个示例。
【示例1】
def initialize(account):
pass
def handle_data(account,data):
#获取万科 A 与平安银行过去 10 日的收盘价与最高价,并且输出数据
price=history(['000001.SZ','000002.SZ'], ['close','high'], 10, '1d', False, 'pre', is_panel=1)
log.info('收盘价:'+str(price['close']))
log.info('最高价:'+str(price['high']))
----------------------- Page 16-----------------------
【示例2 】
def initialize(account):
pass
def handle_data(account,data):
#获取万科 A 与平安银行过去 10 个 60 分钟级的开盘价,并且输出数据
price=history(['600519.SH','300033.SZ'], ['open'] , 10, '60m', False, 'pre', is_panel=0)
log.info('300033.SZ 开盘价:'+str(price['300033.SZ']))
log.info('600519.SH 开盘价:'+str(price['600519.SH']))
示例返回结果:
【示例1】返回结果:
2017-01-03 09:30:00 - INFO
收盘价: 000001.SZ 000002.SZ
2016-12-19 9.20 21.10
2016-12-20 9.11 20.33
2016-12-21 9.16 20.48
2016-12-22 9.14 20.61
2016-12-23 9.08 20.30
2016-12-26 9.12 20.65
2016-12-27 9.08 21.42
2016-12-28 9.06 21.20
2016-12-29 9.08 20.84
2016-12-30 9.10 20.55
2017-01-03 09:30:00 - INFO
最高价: 000001.SZ 000002.SZ
2016-12-19 9.23 22.00
2016-12-20 9.20 21.00
2016-12-21 9.16 20.70
2016-12-22 9.16 20.77
2016-12-23 9.14 20.67
2016-12-26 9.13 20.69
2016-12-27 9.13 21.98
2016-12-28 9.11 21.48
2016-12-29 9.09 21.32
2016-12-30 9.10 20.96
【示例2 】返回结果:
2017-01-03 09:30:00 - INFO
300033.SZ 开盘价: open
2016-12-27 13:59:00 69.00
2016-12-27 14:59:00 68.50
2016-12-28 10:29:00 68.12
2016-12-28 11:29:00 68.69
2016-12-28 13:59:00 68.49
2016-12-28 14:59:00 68.55
2016-12-29 10:29:00 68.90
2016-12-29 11:29:00 68.81
2016-12-29 13:59:00 70.20
2016-12-29 14:59:00 70.11
2017-01-03 09:30:00 - INFO
600519.SH 开盘价: open
2016-12-27 13:59:00 328.30
----------------------- Page 17-----------------------
2016-12-27 14:59:00 326.55
2016-12-28 10:29:00 326.99
2016-12-28 11:29:00 326.00
2016-12-28 13:59:00 325.19
2016-12-28 14:59:00 325.40
2016-12-29 10:29:00 324.01
2016-12-29 11:29:00 323.70
2016-12-29 13:59:00 325.80
2016-12-29 14:59:00 325.80
第三类下单函数,以函数形式,通过参数设置以满足您策略下单交易:
1.按金额下单函数:order_value
函数调用方法:
order_value (symbol, amount)
函数功能
order_value 是下单函数,根据股数下单,交易股票.
函数参数:
参数 含义 参数举例
symbol 股票、指数或基金代码列表 填写需要下单交易的股票代码,不可多个股票
同时获取,例如:'600519.SH'
value 下单金额 填写需要下单的交易的金额,正数表示买入,负
数表示卖出
注意事项:
1. 由于股票单次买入必须以 1 手 (100 股 )为单位,实际成交金额小于等于下单金额。
示例:
def initialize(account):
pass
def handle_data(account,data):
#买入 10000 元平安银行
order_value(symbol='000001.SZ',value=10000)
2.按股数下单函数:order
函数调用方法:
order(symbol, amount)
函数功能
order 是下单函数,根据股数下单,交易股票.
函数参数:
参数 含义 参数举例
symbol 股票、指数或基金代码列表 填写需要下单交易的股票代码,不可多个股票
同时获取,例如:'600519.SH'
amount 下单股数 填写需要下单交易的股票数量,正数表示买入,
负数表示卖出
----------------------- Page 18-----------------------
示例:
def initialize(account):
pass
def handle_data(account,data):
#买入 100 股平安银行
order(symbol='000001.SZ',amount=100)
----------------------- Page 19-----------------------
第三节:我的第一个量化策略
对于大部分人来说,量化交易是非常陌生与神秘的。本节内容将带你开启第一个量化策
略!
本节内容摘要:1.理解量化策略的基本框架。2.学会编写一个简单的量化交易策略。3.
学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号。
1.理解量化策略的基本框架
通常情况下,完整的量化交易策略至少需要确定两件事:
A.交易标的,即买什么;
B.确定交易时机,即怎么买卖。
让我们来设计一个简单完整的量化交易策略:
策略交易标的:贵州茅台;
策略交易时机:5 日均线与 20 日均线金叉时,买入;5 日均线与 20 日均线死叉时,
卖出。
----------------------- Page 20-----------------------
2.学会编写一个简单的量化交易策略
第一步:打开MindGo 量化交易平台,先在上方导航栏点击 “我的策略”—“策略编译”,
再点击蓝色按钮 “+新建策略”,接着点击已创建的策略进入策略编译器页面,如下:
温馨提示:“回测列表”下方三个按钮,可以设置编译器字体大小,背景颜色,开启全屏编
译,查看 API 文档,如下:
第二步:理解量化交易策略框架对应的代码框架。
def initialize(account):
#初始化函数:确定交易标的
def handle_data(account,data):
#定时运行函数:确定交易时机
----------------------- Page 21-----------------------
框架理解:
1.def initialize(account)与 def handle_data(account,data)是两个函数,函数格式固定为:def
函数名 (参数),其中def 后面带空格键,函数末尾必须带冒号。
2.def initialize(account) 函数是初始化函数,只运行一次,确定初始化条件;def
handle_data(account,data) 函数是定时运行函数,平台默认该函数定时运行。日级策略,每日
9 :30 ;分钟级策略,交易期间内的每分钟。
3.“#”后面为注释内容,用于注释代码,便于编写和阅读。
第三步:确定交易标的:account.security = '600519.SH' 。
温馨提示:
1.account 是账户对象,该对象存放所有账户相关信息,持仓、可用现金、资产盈亏。
2.account.security 是在账户对象下,设置security 变量,存放在账户内,这里我们需要确
定交易标的,即:account.security = '600519.SH' 。
def initialize(account):
account.security = '600519.SH'# 已确定交易标的
def handle_data(account,data):
#定时运行函数:确定交易时机
第四步:确定交易时机,即为:5 日均线与 20 日均线金叉时,买入;5 日均线与 20 日均线
死叉时,卖出。
从交易时机出发,我们需要计算交易标的 5 日和 20 日均线,那么5、20 日均线需要用
历史行情数据的收盘价来计算。
整个流程即:获取历史行情20 日的收盘价数据———计算 5、20 日均线———判断
5、20 日均线,进行买卖交易。
A.获取历史行情20 日的收盘价数据:
1.找到函数历史数据函数:history
2.填写函数参数,获取到数据:
i.交易标的,即:获取那个股票的数据。
ii.数据字段:['close']收盘价,即:获取哪个数据。
iii.输入历史长度,即:获取多长时间的数据。
iv.获取数据的时间步长,即:获取日线级步长数据。
v.填写是否跳过停牌数据,复权选项,返回数据格式。
最终结果即为:history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1)
3.将获取到的数据储存,便于计算,即:close = history(account.security, ['close'], 20,
'1d', False, 'pre', is_panel=1)
#获取证券过去 20 日的收盘价数据
close = history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1)
B.计算 5、20 日均线:
1.获取数据值,即:close.values,values 可以直接获取储存中的数据值,格式为
close.values 。温馨提示:close 是我们刚才获取的数据,但是数据有股票、时间、数值,我们
直接用values 获取值用于计算即可。
----------------------- Page 22-----------------------
2.选取数据长度,即:close.values[-5:] 。[]用于取值,我们之前获取20 个数据,但5
日均线只需要过去 5 日的收盘价,因此[-5:]即为获取倒数第五个到最后一个数据。温馨提
示:
i.[:]是获取所有数据。
ii.[:x]是从第一个获取到第 x 个,不包括第 x 个。
iii.[x:y]是从第x 个到第 y 个,包括x ,但不包括y 。
iv.[-x:]获取倒数第x 个到最后一个数据。
3.计算均值,即close.values[-5:].mean(),赋值给MA5 。同理
MA20=close.values.mean() ,即对所有值取平均,相当于MA20=close.values[:].mean() 。
#计算五 日均线价格
MA5 = close.values[-5:].mean()
#计算二十 日均线价格
MA20 = close.values.mean()
C.判断 5、20 日均线,进行买卖交易:
1.if 判断条件,即为 if MA5 > MA20: 。温馨提示if 判断函数的格式为 if +添加判断
+:,其中if 后面必须带一个空格键,其次末尾必须带冒号。
2.当MA5 小于 MA20 时,我们再对持仓市值判断,如果有持仓,那么持仓市值必
然大于 0,需要进行卖出交易,我们直接通过 account 账户对象来获取持仓市值,即
为:account.positions_value。
3.下单买入交易:
i.当触发MA5 大于MA20 时,我们需要买入股票,这时候我们可以使用
order_value 下单函数,该函数以金额下单。
ii.输入下单函数的参数,order_value 函数需要输入两个参数:
1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直
接用。
2.下单的金额,即account.cash,这里的account 是账户对象,我们从账户中获
取可用资金,即为 account.cash 。
iii.触发条件后程序提醒,当代码执行完下单函数后,我们用log.info()来打印日
志,这样我们也可以看到程序下单了。
温馨提示:log.info() 内你可以直接输入中文,例如:log.info('条件满足!买入贵
州茅台啦!')
if MA5 > MA20:
#使用所有现金买入证券
order_value(account.security,account.cash)
#记录这次买入
log.info("买入 %s" % (account.security))
4.下单卖出交易:
i.当触发MA5 小于MA20 时,我们需要卖出股票,这时候我们可以使用
order_target 下单函数,该函数以目标股数下单。
ii.输入下单函数的参数,order_target 函数需要输入两个参数:
1.下单的股票,即为 account.security,我们之前将交易标的传入进去,可以直
接用。
2.下单的目标股数,即0,因为我们需要将持仓股票卖出,卖到0 股为止。
----------------------- Page 23-----------------------
iii.触发条件后程序提醒,当代码执行完下单函数后,我们同log.info()来打印日
志,这样我们也可以看到程序下单了。
#如果五日均线小于二十日均线,并且目前有头寸
if MA5 < MA20 and account.positions_value > 0:
#卖出所有证券
order_target(account.security,0)
#记录这次卖出
log.info("卖出 %s" % (account.security))
最终结果:
# 双均线策略
# 策略逻辑:当五日均线与二十日均线金叉时买入,当五日均线与二十日均线死叉时卖出。
#初始化账户
def initialize(account):
#设置要交易的证券(600519.SH 贵州茅台)
account.security = '600519.SH'
#设置买卖条件,每个交易频率 (日/分钟/tick )调用一次
def handle_data(account,data):
#获取证券过去 20 日的收盘价数据
close = history(account.security, ['close'], 20, '1d', False, 'pre', is_panel=1)
#计算五 日均线价格
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))
----------------------- Page 24-----------------------
第五步 回测量化交易策略
通过以上 4 步,我们已经完成了量化交易策略编写,那么接下来我们需要进行量化交易
策略回测。
A.首先,我们尝试去跑通整个历史行情,排查代码错误。
i.右上角设置回测历史长度,设置资金,设置交易频率。
ii.点击左上角 “编译运行”按钮,右边出现量化交易策略在历史行情中的表现情况
B. 当量化交易策略能跑通整个历史行情后,我们可以确定该代码正确无误,随后点击右
上角蓝色按钮 “进行回测”。页面跳转至回测页面,在回测详情界面,您可以查看策略收益
曲线,风险指标,每日持仓,交易明细,输出日志等信息,如下:
----------------------- Page 25-----------------------
3.学会将量化交易策略绑定实盘模拟交易,并实时收到交易策略的买卖信号
1.在回测显示结果页面,右上角点击蓝色按钮开启仿真交易.如下图:
2.在账户类型一栏,有股票型、期货型、混合型三种交易账户,选择股票型账户如下图:
3.为账户选择相应的资金配置,一旦确定就无法更改,如下图:
4.至此,我们成功开启了模拟交易。点击模拟交易账户下绑定的策略,开启交易信号实时推
送,即可将策略的买卖信号发送至同花顺手机 APP 上。如下图:
----------------------- Page 26-----------------------
5.您可以为您模拟交易账户重命名、删除账户、暂停策略运行、发布策略至社区、重启策
略、查看策略运行 日志、查看策略代码。注意:重启按钮只会在策略运行错误后显示,如果
策略运行正常,显示暂停按钮。如下图:
----------------------- Page 27-----------------------
6.您可以查看您的模拟交易账户详细情况:交易明细、持仓、盈亏情况、账户风险指标等等。
7.当您的模拟交易策略运行出错时,您可以在模拟交易账户的状态栏看到 “错误”提示,
如下图:
----------------------- Page 28-----------------------
8.策略运行出错还可能跟系统有关,如果你没发现代码层面的错误,直接点击重启按钮,策
略就会继续运行啦。
----------------------- Page 29-----------------------