快速开始
下载SDK
掘金量化平台提供策略开发服务包(SDK)用于策略开发者实现自己的策略。SDK下载地址请点击这里。
Python SDK支持Windows + Python2.7/3.6 + 32位/64位、Linux Python2/3 x64共六种版本,下载时找到对应本地安装的Python版本的SDK包。需要注意的是,此处所指的32位/64位不是指系统的版本,而是本地Python的版本。
安装配置
在Windows系统,需要解压下载的SDK包,双击安装程序进行安装。在安装过程中,安装程序会自行寻找Python安装路径,若提示找不到Python,需要手动添加注册信息或重新安装Python。若Python3.6不是安装在个人文件夹下,需要以管理员权限运行SDK安装程序。
在Linux系统,解压ZIP文件,运行pip install xxxx.whl命令进行安装;python3使用pip3 install xxxxx.whl 。Wheel文件名称以发布为准。
我的第一个策略
方式一,直接使用例子运行
解压SDK包,使用examples中的例子项目。
方式二,创建自己的策略
参考这里注册账号,登录终端。
参考这里创建策略基本架构。编程语言选择Python,订阅上交所浦发银行(证券代码:600000)的Tick行情。
编写自己的策略逻辑。
以下是一个完整的策略代码示例额,策略逻辑:每收到一笔Tick行情,以最新价买入100股。
from gmsdk.api import StrategyBase
class MyStrategy(StrategyBase):
def __init__(self, *args, **kwargs):
super(MyStrategy, self).__init__(*args, **kwargs)
def on_tick(self, tick):
self.open_long(tick.exchange, tick.sec_id, tick.last_price, 100)
print("OpenLong: exchange %s, sec_id %s, price %s" %
(tick.exchange, tick.sec_id, tick.last_price))
if __name__ == '__main__':
ret = MyStrategy(
username='username',
password='password',
strategy_id='strategy_2',
subscribe_symbols='SHSE.600000.tick',
mode=2
).run()
print(('exit code: ', ret))
4.编译策略并运行。策略运行起来后,控制台打印策略的每一笔下单记录,在掘金终端的模拟交易中可查看该策略的运行详情。
Python API范例
策略接口范例
策略构建
如何构建策略
构建策略的三种方式:
1.掘金终端构建自己的策略,然后在构建的策略类中重写基类方法
2.修改SDK包中的例子,构建自己的策略类
3.参考API定义文档,自定义策略类
策略运行
策略类应继承自StrategyBase基类,并以方法重写的方式满足策略开发需求。然后调用子类实例的run()方法,运行策略。
class Strategy(StrategyBase):
...
strategy.run()
如何初始化策略
策略在运行前,必须先初始策略对象。需要指定挖金子账户、密码、策略ID、订阅代码和运行模式。
示例:策略初始化并订阅上交所浦发银行的实时Tick数据和1min的Bar数据
方式一:以参数方式初始化策略
ret = Strategy(
username='demo@myquant.cn',
password='123456',
strategy_id='strategy_2',
subscribe_symbols='SHSE.600000.bar.60',
mode=2
)
策略支持四种运行模式及对应参数值:
1.不接收行情流:1
2.接收实时行情:2
3.模拟行情模式:3
4.回测模式:4
方式二:以配置文件方式初始化策略
策略初始化配置可以保存在*.ini为文件中,然后以文件路径为参数初始化策略。
ret = Strategy(config_file='strategy.ini')
strategy.ini文件配置示例:
[strategy]
;掘金用户名
username=-
;掘金密码
password=-
;策略ID
strategy_id=3c7e70be-7e02-11e5-b293-5ec5d48ea63a
;订阅证券代码或合约代码列表
subscribe_symbols=SHSE.600000.tick,SHSE.600000.bar.60
;行情模式,2-实时行情模式,3-模拟行情模式,4-回放行情模式
mode=2
;交易服务地址,使用掘金终端交易时,地址为localhost:8001, 如果此项配置为空,则订单发往掘金云服务器
td_addr=localhost:8001
如何运行策略
完善策略逻辑后,先初始化策略,然后运行策略。策略运行后,策略开始接收数据并执行策略逻辑
strategy.run()
如何停止策略
1.直接关闭程序来停止策略
2.调用api方式停止策略
strategy.stop()
策略运行模式
策略支持三种运行模式:
1.实时行情模式:订阅行情服务器推送的实时行情,也就是交易所的实时行情,只在交易时段提供。适用的场景是策略仿真交易和实盘交易阶段。
2.模拟行情模式:模拟行情是近期的历史行情,行情服务器将7*24小时不间断循环推送,推送频率近似实时行情。适用的场景是策略开发阶段,主要就是能方便随时随地都能有数据,能开发/调试策略,不受交易时段的限制。
3.回测模式:订阅指定时段、指定交易代码、指定数据类型的行情,行情服务器将按指定条件全速回放对应的行情数据。适用的场景是策略回测阶段,快速验证策略的绩效是否符合预期。
如何回测策略
策略使用回测模式初始化,并配置回测相关参数,即进入回测。
示例:回测上交所浦发银行的daily数据, 回测时间为 2015-04-15 09:00:00到 2015-05-15 15:00:00, 策略初始资金为1,000,000, 委托成交为全部成交, 手续费率为零, 滑点比率为零, 数据使用前复权.
方式一:在策略初始化后调用backtest_config()方法
strategy = Strategy(
username='demo@myquant.cn',
password='123456',
strategy_id='strategy_2',
subscribe_symbols='SHSE.600000.bar.daily',
mode=4,
td_addr='localhost:8001')
strategy.backtest_config(
start_time='2015-04-15 9:00:00',
end_time='2015-05-15 15:00:00',
initial_cash=1000000,
transaction_ratio=1,
commission_ratio=0,
slippage_ratio=0,
price_type=1,
bench_symbol='SHSE.000300')
方式二:在配置文件中指定参数
strategy = Strategy(config_file='strategy.ini')
在strategy.ini配置文件中添加backtest节点
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;策略回测参数配置
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
[backtest]
;历史数据回放开始时间
start_time=2015-04-15 09:00:00
;历史数据回放结束时间
end_time=2015-05-15 15:00:00
;策略初始资金
initial_cash=1000000
;委托量成交比率,默认=1(每个委托100%成交)
transaction_ratio=1
;手续费率,默认=0(不计算手续费)
commission_ratio=0
;滑点比率,默认=0(无滑点)
slippage_ratio=0
;行情复权模式,0=不复权,1=前复权
price_type=1
;基准
bench_symbol=SHSE.000300
如何在非交易时间段调试策略
示例:订阅上交所浦发银行Tick行情和1min的Bar的模拟行情
方式一,通过参数的方式设置:
ret = strategy("your user name",
"your password",
"strategy id",
"SHSE.600000.tick,SHSE.600000.bar.60",
3,
"localhost:8001")
方式二,通过配置方式初始化策略,策略的配置文件subscribe_symbols和mode节点设置如下:
;订阅证券代码或合约代码列表
subscribe_symbols=SHSE.600000.tick,SHSE.600000.bar.60
;行情模式,2-实时行情模式,3-模拟行情模式,4-回放行情模式
mode=3
如何设置策略仿真交易
示例:订阅上交所浦发银行Tick行情和1min的Bar的实时行情
方式一,通过参数的方式设置:
ret = strategy("your user name",
"your password",
"strategy id",
"SHSE.600000.tick,SHSE.600000.bar.60",
2,
"localhost:8001")
方式二,通过配置方式初始化策略,策略的配置文件strategy节点设置如下:
;订阅证券代码或合约代码列表
subscribe_symbols=SHSE.600000.tick,SHSE.600000.bar.60
;行情模式,2-实时行情模式,3-模拟行情模式,4-回放行情模式
mode=2
如何设置策略实盘交易
2.参考如何设置策略仿真交易,接收实时行情即可开始实盘交易。
策略事件
策略提供哪些事件
策略的基类提供策略3类事件:
1.登录事件:策略初始化时触发
2.行情数据事件:接收实时行情数据时触发,主要有Tick行情事件和Bar行情事件
3.交易相关事件:交易时触发,主要有下单、撤单、订单回报事件
用户重写自己关注事件的回调方法完善策略逻辑。
策略登录
如何处理策略登录事件
策略在初始化时将触发登录事件,可以在自己的策略类中重写策略基类的on_login方法,以便策略初始化时进行自定义操作
class Strategy(StrategyBase):
def on_login(self):
...
数据接口范例
行情类型
掘金SDK提供回测行情、模拟行情、实时行情及历史行情数据
1.回测行情、模拟行情和实时行情在订阅了symbol后,在策略的on_tick方法和on_bar方法中接收行情数据
2.各频率的历史行情数据提供对应的API提取。
数据定义
数据类型分为tick数据和bar数据
1.Tick行情是指按交易所实际发送的行情数据
2.Bar数据是指各种频率的行情数据,可订阅 1分、15分、60分的实时Bar数据。
日频数据提供DailyBar数据类型,日频仅在回测和历史数据提取时可用,不能实时订阅。
行情订阅方法
如何初始化行情接口
方式一,策略对象也提供行情接口,请参考如何初始化策略
方式二,获取行情对象实例,然后调用行情接口获取数据,该方式下仅获取数据
from gmsdk import md
ret = md.init("your user name", "your password")
如何订阅指定证券代码的tick行情
订阅上交所浦发银行和深交所平安银行的Tick行情数据,订阅的证券代码格式定义详细介绍请点击这里。
方式一,通过策略类对象订阅实时行情
1.策略初始化时订阅
ret = Strategy("your user name",
"your password",
"strategy id",
"SHSE.600000.tick,SZSE.000001.tick",
2,
"localhost:8001")
2.策略程序运行中订阅
ret = strategy.subscribe("SHSE.600000.tick,SHSE.600000.bar.60")
方式二,通过行情类对象订阅实时行情,该方式仅提供行情数据
1.行情类对象初始化时订阅
from gmsdk import md
ret = md.init("your user name",
"your password",
2,
"SHSE.600000.tick,SZSE.000001.tick")
2.程序运行过程中订阅
ret = md.subscribe("SHSE.600000.tick,SZSE.000001.tick")
如何订阅指定证券代码的Bar行情
示例:订阅上交所浦发银行的1min Bar行情和深交所平安银行的30s Bar行情
方式一,通过策略类对象订阅实时行情
1.策略初始化时订阅
ret = strategy("your user name",
"your password",
"strategy id",
"SHSE.600000.bar.60,SZSE.000001.bar.30",
3,
"localhost:8001")
2.策略运行过程中订阅
ret = strategy.subscribe("SHSE.600000.bar.60,SZSE.000001.bar.30")
方式二,通过行情类对象订阅实时行情,该方式仅提供行情数据
1.行情类对象初始化时订阅
ret = md.init("your user name",
"your password",
2,
"SHSE.600000.bar.60,SZSE.000001.bar.30")
2.程序运行过程中订阅
ret = md.subscribe("SHSE.600000.bar.60,SZSE.000001.bar.30")
如何订阅指定证券代码的日频行情
日频行情(DailyBar)仅在策略回测时订阅使用,其他策略运行模式下订阅将接收不到日频行情
示例:订阅上交所浦发银行的日频行情和深交所平安银行的日频行情
通过策略类对象订阅实时行情
1.策略初始化时订阅
ret = strategy("your user name",
"your password",
"strategy id",
"SHSE.600000.bar.daily,SZSE.000001.bar.daily",
3,
"localhost:8001")
2.策略运行中订阅
ret = strategy.subscribe("SHSE.600000.daily,SZSE.000001.daily")
如何退订指定证券代码的行情
示例:退订上交所浦发银行的tick行情和深交所平安银行的1min Bar行情
方式一,通过策略类对象退订:
ret = strategy.unsubscribe("SHSE.600000.tick,SZSE.000001.bar.60")
方式二,通过行情类对象退订:
ret = md.unsubscribe("SHSE.600000.tick,SZSE.000001.bar.60")
历史数据提取
如何提取指定时间的Tick数据
示例:提取上交所浦发银行和深交所平安银行 2015-10-29 9:30:00 到 2015-10-29 15:00:00 的Tick数据
方式一,通过策略类对象接口提取
ticks = strategy.get_ticks("SHSE.600000,SZSE.000001",
"2015-10-29 9:30:00",
"2015-10-29 15:00:00")
方式二,通过行情类对象接口提取
ticks = md.get_ticks("SHSE.600000,SZSE.000001",
"2015-10-29 9:30:00",
"2015-10-29 15:00:00")
如何提取指定时间的Bar数据
示例:提取上交所浦发银行和深交所平安银行2015-10-29 10:00:00到2015-10-29 15:00:00的1min Bar数据,提取30s、5min频率的bar数据修改参数bar_type为30、300即可。
方式一,通过策略类对象接口提取
bars = strategy.get_bars("SHSE.600000,SZSE.000001",
60,
"2015-10-29 10:00:00",
"2015-10-29 15:00:00")
方式二,通过行情类对象接口提取
bars = md.get_bars("SHSE.600000,SZSE.000001",
60,
"2015-10-29 10:00:00",
"2015-10-29 15:00:00")
如何提取指定日期的日频数据
示例:提取上交所浦发银行和深交所平安银行2014-10-29到2015-10-29 的日频数据(DailyBar)。
方式一,通过策略类对象接口提取
daily_bars = strategy.get_dailybars("SHSE.600000,SZSE.000001", "2014-10-29", "2015-10-29")
方式二,通过行情类对象接口提取
daily_bars = md.get_dailybars("SHSE.600000,SZSE.000001","2014-10-29", "2015-10-29")
如何提取最近N笔tick数据
示例:提取上交所浦发银行和深交所平安银行最近100笔Tick数据
方式一,通过策略类对象接口提取
ticks = strategy.get_last_n_ticks("SHSE.600000,SZSE.000001", 100)
方式二,通过行情类对象接口提取
ticks = md.get_last_n_ticks("SHSE.600000,SZSE.000001", 100)
如何提取最近N个Bar数据
示例:提取上交所浦发银行和深交所平安银行最近20笔1min频率的Bar数据,提取30s、5min频率的bar数据修改参数bar_type为30、300即可。
方式一,通过策略类对象接口提取
bars = strategy.get_last_n_bars("SHSE.600000,SZSE.000001", 60, 20)
方式二,通过行情类对象接口提取
bars = md.get_last_n_bars("SHSE.600000,SZSE.000001", 60, 20)
如何提取最近N个交易日的日频数据
示例:提取上交所浦发银行和深交所平安银行最近20笔日频数据(DailyBar)
方式一,通过策略类对象接口提取
daily_bars = strategy.get_last_n_dailybars("SHSE.600000,SZSE.000001", 20)
方式二,通过行情类对象接口提取
daily_bars = md.get_last_n_dailybars("SHSE.600000,SZSE.000001", 20)
如何提取最近1笔tick数据
示例:提取上交所浦发银行和深交所平安银行最近1笔Tick数据
方式一,通过策略类对象接口提取
ticks = strategy.get_last_ticks("SHSE.600000,SZSE.000001")
方式二,通过行情类对象接口提取
ticks = md.get_last_ticks("SHSE.600000,SZSE.000001")
如何提取最近1个Bar数据
示例:提取上交所浦发银行和深交所平安银行最近1个1min频率的Bar数据,提取30s、5min频率的bar数据修改参数bar_type为30、300即可。
方式一,通过策略类对象接口提取
bars = strategy.get_last_bars("SHSE.600000,SZSE.000001", 60)
方式二,通过行情类对象接口提取
bars = md.get_last_bars("SHSE.600000,SZSE.000001", 60)
如何提取最近1笔日频数据
示例:提取上交所浦发银行和深交所平安银行最近1笔日频数据(DailyBar)
方式一,通过策略类对象接口提取
daily_bars = strategy.get_last_dailybars("SHSE.600000,SZSE.000001")
方式二,通过行情类对象接口提取
daily_bars = md.get_last_dailybars("SHSE.600000,SZSE.000001")
行情事件方法
如何处理tick事件和bar事件
tick、bar事件在接收实时行情时触发,在tick和bar事件的回调方法on_tick、on_bar中可接收订阅的Tick行情和Bar行情
方式一,在策略类中处理
在自己的策略类中重写策略基类的on_tick、on_bar方法。
class Strategy(StrategyBase):
def on_tick(self, tick):
...
def on_bar(self, bar):
...
方式二,在纯行情模式中处理
1.编写tick事件和bar事件的回调方法
def on_tick(tick):
...
def on_bar(bar):
...
2.订阅tick事件和bar事件
md.ev_tick += on_tick
md.ev_bar += on_bar
如何处理行情状态事件
在自己的策略类中重写策略基类的on_md_event方法,行情状态事件在开盘、收盘、回放行情结束时触发
class Strategy(StrategyBase):
def on_md_event(self, evt):
...
交易接口范例
交易相关数据类型
委托
如何开多仓
示例:市价买入1000股上交所浦发银行股票,市价开1手IF1512的多单
注意:股票、基金等现货品种只有买入和卖出,对应下单类型是开多仓open_long和平多仓close_long;
方式一,调用开多仓的异步接口open_long
1.在策略类的方法中调用,必须在策略执行了Run方法后调用有效
class Strategy(StrategyBase):
def on_some_event(self): ## eg. def on_tick(self, tick):
self.open_long("SHSE", "600000", 0, 1000)
self.open_long("CFFEX", "IF1512", 0, 1)
Strategy(...).run()
2.通过交易服务类对象调用,必须执行对象的Run方法后调用有效
from gmsdk import td
def on_some_event():
td.open_long("SHSE", "600000", 0, 1000)
td.open_long("CFFEX", "IF1512", 0, 1)
td.ev_some_event += on_some_event
td.init(...)
td.run()
方式二,调用开多仓的同步接口open_long_sync,无需策略执行Run方法
1.通过策略类对象调用
strategy = Strategy(...)
strategy.open_long_sync("SHSE", "600000", 0, 1000)
strategy.open_long_sync("CFFEX", "IF1512", 0, 1)
2.通过交易服务类对象调用
from gmsdk import td
td.init(...)
td.open_long_sync("SHSE", "600000", 0, 1000)
td.open_long_sync("CFFEX", "IF1512", 0, 1)
如何平多仓
示例:市价卖出1000股上交所浦发银行股票,市价平1手IF1512的多单
注意:股票、基金等现货品种只有买入和卖出,对应下单类型是开多仓open_long和平多仓close_long;
方式一,调用平多仓的异步接口close_long
1.在策略类的方法中调用接口,必须在策略执行了Run方法后调用有效
class Strategy(StrategyBase):
def on_some_event(self): ## eg. def on_tick(self, tick):
self.close_long("SHSE", "600000", 0, 1000)
self.close_long("CFFEX", "IF1512", 0, 1)
Strategy(...).run()
2.通过交易服务类对象调用接口,必须执行对象的Run方法后调用有效
from gmsdk import td
def on_some_event(): ##eg. def on_tick(tick):
td.close_long("SHSE", "600000", 0, 1000)
td.close_long("CFFEX", "IF1512", 0, 1)
td.ev_some_event += on_some_event ##eg. td.ev_tic