# coding=utf-8
from __future__ import print_function, absolute_import
from gm.api import *
def init(context):
schedule(
schedule_func=algo
, date_rule='id'
, time_rule='14:50:00'
)
def algo(context):
order_volume(
symbol = 'SHSE.600000'
, volume = 200
, side = OrderSide_Buy
, order_type = OrderType_Market
, position_effect = PositionEffect_Open
, price = 0
)
def on_backtest_finished(context, indicator):
print(indicator)
if __name__ == '__main__':
run(
strategy_id = 'strategy_id'
, filename = 'main.py'
, mode = MODE_BACKTEST
, token = 'token_id'
, backtest_start_time = ''
, backtest_end_time = ''
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.0001
, backtest_slippage_ratio = 0.0001
)
# coding = utf-8
from __future__ import print_funtion, absolute_import
from gm.api import *
def init(context):
subscribe(
symbols = 'SHSE.600000'
, frequency = '1d'
)
subscribe(
symbols = 'SHSE.600000'
, frequency = '60s'
)
def on_bar(context, bars):
print('bars is:\n', bars)
def on_bar(context, ticks):
print('ticks is:\n', ticks)
if __name__ == '__main__':
run(
strategy_id = '74e6c8ee-0c7d-11ec-a692-f875a4c87ef8'
, filename = 'main.py'
, mode = MODE_BACKTEST
, token = 'token_id'
, backtest_start_time = '2021-01-01 08:00:00'
, backtest_end_time = '2021-09-01 16:00:00'
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.0001
, backtest_slippage_ratio = 0.0001
)
# coding = utf-8
from __future__ import print_function, absolute_import
from gm.api import *
def init(context):
subscribe(
symbols = 'SHSE.600000'
, frequency = '1d'
, count = 50
)
subscribe(
symbols = 'SHSE.600000'
, frequency = '60s'
, count = 50
)
def on_bar(context, bars):
data = context.data(
symbol = bars[0]['symbol']
, frequency = '60s'
, count = 50
, fields = 'close, bob'
)
print(data.tail())
if __name__ == '__main__':
run(
strategy_id = 'strategy_id'
, filename = 'main.py'
, mode = MODE_BACKTEST
, token = 'token_id'
, backtest_start_time = '2021-08-01 08:00:00'
, backtest_end_time = '2021-09-03 16:00:00'
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.001
, backtest_slippage_ratio = 0.001
)
# coding = utf-8
from __future__ import print_function, absolute_import
from gm.api import *
def init(context):
subscribe(
symbols = 'SHSE.600000, SZSE.000001'
, frequency = '1d'
, count = 5
, wait_group = True
, wait_group_timeout = '10s'
)
def on_bar(context, bars):
for bar in bars:
print(bar['symbol'], bar['eob'])
if __name__ == '__main__':
run(
strategy_id = 'strategy_id'
, filename = 'main.py'
, mode = MODE_BACKTEST
, token = 'token_id'
, backtest_start_time = '2021-08-01 08:00:00'
, backtest_end_time = '2021-09-03 16:00:00'
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.001
, backtest_slippage_ratio = 0.001
)
# coding = utf-8
from __future__ import print_function, absolute_import
from gm.api import *
def init(context):
subscribe(
symbols = 'SHSE.600000'
, frequency = '60s'
)
def on_bar(context, bars):
print(bars)
if __name__ == '__main__':
run(
strategy_id = 'strategy_id'
, filename = 'main.py'
, mode = MODE_LIVE
, token = 'token_id'
, backtest_start_time = '2021-08-01 08:00:00'
, backtest_end_time = '2021-09-03 16:00:00'
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.001
, backtest_slippage_ratio = 0.001
)
# coding = utf-8
from __future__ import print_function, absolute_import
from gm.api import *
set token('token_id')
data = history(
symbol = 'SHSE.600000'
, frequency = '1d'
, start_time = '2021-01-01 09:00:00'
, end_time = '2021-09-03 16:00:00'
, fields = 'open, high, low, close'
, adjust = ADJUST_PREV
, adjust_end_time = '2021-09-03'
, df = True
)
print(data)
# coding = utf-8
from __future__ import print_function, absolute_import
from gm.api import *
def init(context):
instruments = get_history_instruments(
symbols = 'SZSE.000001, SZSE.000002'
, start_date = context.backtest_start_time
, end_date = context.backtest_end_time
)
context.ins_dict = {(i.symbol, i.trade_date.date()): i for i in instruments}
subscribe(
symbols = 'SZSE.000001, SZSE.000002'
, frequency = '1d'
)
def on_bar(context, bars):
print(context.ins_dict[(bars[0].symbol, bars[0].eob.date())])
if __name__ == '__main__':
run(
strategy_id = 'strategy_id'
, filename = 'main.py'
, mode = MODE_BACKTEST
, token = 'token_id'
, backtest_start_time = '2021-08-01 08:00:00'
, backtest_end_time = '2021-09-03 16:00:00'
, backtest_adjust = ADJUST_PREV
, backtest_initial_cash = 10000000
, backtest_commission_ratio = 0.001
, backtest_slippage_ratio = 0.001
)
# coding=utf-8
from __future__ import print_function, absolute_import, unicode_literals
from gm.api import *
import numpy as np
import pandas as pd
def init(context):
log(
level = 'info'
, msg='平安银行信号触发'
, source='strategy'
)
context.k_value = 23
add_parameter(
key = 'd_value'
, value = context.k_value
, min = 0
, max = 100
, name = 'k值阀值'
, intro = '设置d值阀值'
, group = '2'
, readonly = False
)
print('当前的动态参数有:', context.parameters)
def on_bar(context, bars):
data = context.data(
symbol = bars[0]['symbol']
, frequency = '60s'
, count = 100
)
kdj = KDJ(data, 9, 3, 3)
k_value = kdj['kdj_k'].values
d_value = kdj['kdj_d'].values
if k_value[-1] > context.k_value and d_value[-1] < context.d_value:
order_percent(
symbol = bars[0]['symbol']
, percent = 0.01
, side = OrderSide_Buy
, order_type = OrderType_Market
, position_effect = PositionEffect_Open
)
print('{}下单买入, k值为{}'.format(bars[0]['symbol'], context.k_value))
def KDJ(data, N, M1, M2):
lowList = data['low'].rolling(N).min()
lowList.fillna(value = data['low'].expanding().min(), inplace = True)
highList = data['high'].rolling(N).max()
highList.fillna(value = data['high'].expanding().max(), inplace=True)
rsv = (data['close'] - lowList) / (highList - lowList) * 100
data['kdj_k'] = rsv.ewm(alpha = 1/M1).mean()
data['kdj_d'] = data['kdj_k'].ewm(alpha = 1/M2).mean()
data['kdj_j'] = 3.0 * data['kdj_k'] - 2.0 * data['kdj_d']
return data
def on_parameter(context, parameter):
# print(parameter)
if parameter['name'] == 'k值阀值':
context.k_value = parameter['value']
print('{}已经修改为{}'.format(parameter['name'], context.k_value))
if parameter['name'] == 'd值阀值':
context.d_value = parameter['value']
print('{}已经修改为{}'.format(parameter['name'], context.d_value))
def on_account_status(context, account):
print(account)
if __name__ == '__main__':
run(strategy_id='strategy_id',
filename='main.py',
mode=MODE_LIVE,
token='token_id',
backtest_start_time='2020-09-01 08:00:00',
backtest_end_time='2020-10-01 16:00:00',
backtest_adjust=ADJUST_PREV,
backtest_initial_cash=500000,
backtest_commission_ratio=0.0001,
backtest_slippage_ratio=0.0001)
| 市场中文名 | 市场代码 |
|---|---|
| 上交所 | SHSE |
| 深交所 | SZSE |
| 中金所 | CFFEX |
| 上期所 | SHFE |
| 大商所 | DCE |
| 郑商所 | CZCE |
| 上海国际能源交易中心 | INE |
| 市场中文名 | 市场代码 | 示例代码 | 证券简称 |
|---|---|---|---|
| 上交所 | SHSE | SHSE.600000 | 浦发银行 |
| 深交所 | SZSE | SZSE.000001 | 平安银行 |
| 中金所 | CFFEX | CFFEX.IC2011 | 中证500指数2020年11月期货合约 |
| 上期所 | SHFE | SHFE.rb2011 | 螺纹钢2020年11月期货合约 |
| 大商所 | DCE | DCE.m2011 | 豆粕2020年11月期货合约 |
| 郑商所 | CZCE | CZCE.FG101 | 玻璃2021年1月期货合约 |
| 上海国际能源交易中心 | INE | INE.sc2011 | 原油2020年11月期货合约 |
[{'symbol': 'SHSE.600000', 'open': 9.680000305175781, 'high': 9.720000267028809, 'low': 9.619999885559082, 'price': 9.630000114440918, 'quotes': [{'bid_p': 9.630000114440918, 'bid_v': 360197, 'ask_p': 9.640000343322754, 'ask_v': 124200}, {'bid_p': 9.619999885559082, 'bid_v': 1265300, 'ask_p': 9.649999618530273, 'ask_v': 172859}, {'bid_p': 9.609999656677246, 'bid_v': 1030400, 'ask_p': 9.65999984741211, 'ask_v': 233400}, {'bid_p': 9.600000381469727, 'bid_v': 1200000, 'ask_p': 9.670000076293945, 'ask_v': 150700}, {'bid_p': 9.59000015258789, 'bid_v': 208000, 'ask_p': 9.680000305175781, 'ask_v': 199543}], 'cum_volume': 29079145, 'cum_amount': 280888066.0, 'last_amount': 963.0, 'last_volume': 100, 'created_at': datetime.datetime(2020, 11, 20, 11, 30, 1, 400000, tzinfo=tzfile('PRC')), 'cum_position': 0, 'trade_type': 0}, {'quotes': [{'bid_p': 9.630000114440918, 'bid_v': 315497, 'ask_p': 9.640000343322754, 'ask_v': 125900}, {'bid_p': 9.619999885559082, 'bid_v': 1291300, 'ask_p': 9.649999618530273, 'ask_v': 177959}, {'bid_p': 9.609999656677246, 'bid_v': 1035000, 'ask_p': 9.65999984741211, 'ask_v': 233400}, {'bid_p': 9.600000381469727, 'bid_v': 1213300, 'ask_p': 9.670000076293945, 'ask_v': 150700}, {'bid_p': 9.59000015258789, 'bid_v': 212100, 'ask_p': 9.680000305175781, 'ask_v': 173943}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}, {'bid_p': 0, 'bid_v': 0, 'ask_p': 0, 'ask_v': 0}], 'symbol': 'SHSE.600000', 'created_at': datetime.datetime(2020, 11, 20, 13, 0, 2, 430000, tzinfo=tzfile('PRC')), 'price': 9.630000114440918, 'open': 9.680000305175781, 'high': 9.720000267028809, 'low': 9.619999885559082, 'cum_volume': 29171845, 'cum_amount': 281780897.0, 'cum_position': 0, 'last_amount': 892831.0, 'last_volume': 92700, 'trade_type': 0, 'receive_local_time': 1605863292.163}]
| symbol | open | close | volume | eob |
|---|---|---|---|---|
| SHSE.600000 | 12.64000 | 12.65000 | 711900 | 2017-06-30 15:00:00 |
| SHSE.600000 | 12.64000 | 12.62000 | 241000 | 2017-07-03 09:31:00 |
{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'nav': 1905248.2789094353, 'pnl': -94751.72109056474, 'fpnl': -94555.35135529494, 'frozen': 1963697.3526980684, 'available': 36106.277566661825, 'cum_inout': 2000000.0, 'cum_trade': 1963697.3526980684, 'cum_commission': 196.3697352698069, 'last_trade': 1536.1536610412597, 'last_commission': 0.153615366104126, 'created_at': datetime.datetime(2020, 9, 1, 8, 0, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 30, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'currency': 0, 'order_frozen': 0.0, 'balance': 0.0, 'market_value': 0.0, 'cum_pnl': 0.0, 'last_pnl': 0.0, 'last_inout': 0.0, 'change_reason': 0, 'change_event_id': ''}
{'k_value': {'key': 'k_value', 'value': 80.0, 'max': 100.0, 'name': 'k值阀值', 'intro': 'k值阀值', 'group': '1', 'min': 0.0, 'readonly': False}}
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码 |
| open | float | 日线开盘价 |
| high | float | 日线最高价 |
| low | float | 日线最低价 |
| price | float | 最新价 |
| cum_volume | long | 成交总量/最新成交量,累计值(日线成交量) |
| cum_amount | float | 成交总金额/最新成交额,累计值 (日线成交金额) |
| cum_position | int | 合约持仓量(只适用于期货),累计值(股票此值为0) |
| trade_type | int | 交易类型(只适用于期货) 1: ‘双开’, 2: ‘双平’, 3: ‘多开’, 4: ‘空开’, 5: ‘空平’, 6: ‘多平’, 7: ‘多换’, 8: ‘空换’ |
| last_volume | int | 瞬时成交量 |
| last_amount | float | 瞬时成交额(郑商所last_amount为0) |
| created_at | datetime.datetime | 创建时间 |
| quotes | [] (list of dict) | 股票提供买卖5档数据, list[0]~list[4]分别对应买卖一档到五档, 期货提供买卖1档数据, list[0]表示买卖一档; 注意:可能会有买档或卖档报价缺失,比如跌停时无买档报价(bid_p和bid_v为0),涨停时无卖档报价(ask_p和ask_v为0); 其中每档报价quote结构如下: |
| 参数名 | 类型 | 说明 |
|---|---|---|
| bid_p | float | 买价 |
| bid_v | int | 买量 |
| ask_p | float | 卖价 |
| ask_v | int | 卖量 |
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码 |
| frequency | str | 频率, 支持多种频率, 具体见股票行情数据和期货行情数据 |
| open | float | 开盘价 |
| close | float | 收盘价 |
| high | float | 最高价 |
| low | float | 最低价 |
| amount | float | 成交额 |
| volume | long | 成交量 |
| position | long | 持仓量(仅期货) |
| bob | datetime.datetime | bar开始时间 |
| eob | datetime.datetime | bar结束时间 |
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码 |
| side | str | 委托方向 |
| price | float | 委托价 |
| volume | int | 委托量 |
| total_orders | int | 委托总个数 |
| queue_orders | int | 委托量队列中元素个数 |
| queue_volumes | list[int] | 委托量队列 |
| created_at | datetime.datetime | 创建时间 |
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码 |
| side | str | 委托方向 ‘1’买, ‘2’卖, ‘F’借入, ‘G’出借 |
| price | float | 委托价 |
| volume | int | 委托量 |
| order_type | str | 委托类型 ‘1’市价, ‘2’限价, ‘U’本方最优 |
| order_index | int | 委托编号 |
| created_at | datetime.datetime | 创建时间 |
| 参数名 | 类型 | 说明 |
|---|---|---|
| symbol | str | 标的代码 |
| side | str | 委托方向 B – 外盘,主动买, S – 内盘,主动卖, N – 未知 |
| price | float | 委托价 |
| volume | int | 委托量 |
| exec_type | str | 成交类型 ‘4’撤单,’F’成交 |
| exec_index | int | 成交编号 |
| ask_order_index | int | 叫卖委托编号 |
| bid_order_index | int | 叫买委托编号 |
| created_at | datetime.datetime | 创建时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| id | str | 账户id,实盘时用于指定交易账户 |
| title | str | 账户标题,实盘时用于指定账户名称 |
| cash | dict | 资金字典 |
| positions(symbol=’’, side=None) | list | 持仓情况 列表, 默认全部持仓, 可根据单一symbol(类型str), side 参数可缩小查询范围 |
| position(symbol, side) | dict | 持仓情况 查询指定单一symbol(类型str)及持仓方向的持仓情况 |
| status | dict | 交易账户状态 查询交易账户连接状态 |
| 属性 | 类型 | 说明 |
|---|---|---|
| strategy_id | str | 策略ID |
| account_id | str | 账号ID |
| account_name | str | 账户登录名 |
| cl_ord_id | str | 委托客户端ID,下单生成,固定不变(掘金维护,下单唯一标识) |
| order_id | str | 委托柜台ID(系统字段,下单不会立刻生成,委托报到柜台才会生成) |
| ex_ord_id | str | 委托交易所ID(系统字段,下单不会立刻生成,委托报到柜台才会生成) |
| algo_order_id | str | 算法单ID |
| symbol | str | 标的代码 |
| status | int | 委托状态 取值参考 OrderStatus |
| side | int | 买卖方向 取值参考 OrderSide |
| position_effect | int | 开平标志 取值参考 PositionEffect |
| position_side | int | 持仓方向 取值参考 PositionSide |
| order_type | int | 委托类型 取值参考 OrderType |
| order_duration | int | 委托时间属性 取值参考 OrderDuration |
| order_qualifier | int | 委托成交属性 取值参考 OrderQualifier |
| order_business | int | 委托业务属性 取值参考 OrderBusinessOrderBusiness |
| ord_rej_reason | int | 委托拒绝原因 取值参考 OrderRejegectReason |
| ord_rej_reason_detail | str | 委托拒绝原因描述 |
| position_src | int | 头寸来源(系统字段) |
| volume | int | 委托量 |
| price | float | 委托价格 |
| value | int | 委托额 |
| percent | float | 委托百分比 |
| target_volume | int | 委托目标量 |
| target_value | int | 委托目标额 |
| target_percent | float | 委托目标百分比 |
| filled_volume | int | 已成量 (一笔委托对应多笔成交为累计值) |
| filled_vwap | float | 已成均价,公式为(price*(1+backtest_slippage_ratio)) (仅股票实盘支持,期货实盘不支持) |
| filled_amount | float | 已成金额,公式为(filled_volume*filled_vwap) (仅股票实盘支持,期货实盘不支持) |
| created_at | datetime.datetime | 委托创建时间 |
| updated_at | datetime.datetime | 委托更新时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| strategy_id | str | 策略ID |
| account_id | str | 账号ID |
| account_name | str | 账户登录名 |
| cl_ord_id | str | 委托客户端ID |
| order_id | str | 委托柜台ID |
| exec_id | str | 委托交易所ID |
| symbol | str | 委托标的 |
| side | int | 买卖方向 取值参考 OrderSide |
| position_effect | int | 开平标志 取值参考 PositionEffect |
| order_business | int | 委托业务属性 OrderBusiness |
| order_style | int | 委托风格 OrderStyle |
| ord_rej_reason | int | 委托拒绝原因 取值参考 OrderRejectReason |
| ord_rej_reason_detail | str | 委托拒绝原因描述 |
| exec_type | int | 执行回报类型 取值参考 ExecType |
| price | float | 成交价格 |
| volume | int | 成交量 |
| amount | float | 成交金额 |
| cost | float | 成交成本金额(仅期货实盘支持,股票实盘不支持) |
| created_at | datetime.datetime | 回报创建时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| account_id | str | 账号ID |
| account_name | str | 账户登录名 |
| currency | int | 币种 |
| nav | float | 总资金 |
| fpnl | float | 浮动盈亏 |
| frozen | float | 持仓占用资金 (仅期货实盘支持,股票实盘不支持) |
| order_frozen | float | 冻结资金 |
| available | float | 可用资金 |
| market_value | float | 市值 (仅股票实盘支持,期货实盘不支持) |
| balance | float | 资金余额 |
| created_at | datetime.datetime | 资金初始时间 |
| updated_at | datetime.datetime | 资金变更时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| account_id | str | 账号ID |
| account_name | str | 账户登录名 |
| symbol | str | 标的代码 |
| side | int | 持仓方向 取值参考 PositionSide |
| volume | int | 总持仓量; 如果要得到昨持仓量,公式为 (volume - volume_today) |
| volume_today | int | 今日买入量 |
| vwap | float | 持仓均价 new_vwap=((position.vwap position.volume)+(trade.volumetrade.price))/(position.volume+trade.volume) (实盘时,期货跨天持仓,会自动变成昨结价,仿真是开仓均价) |
| vwap_open | float | 开仓均价(期货适用,实盘适用) |
| amount | float | 持仓额 (volumevwapmultiplier) |
| price | float | 当前行情价格(回测时值为0) |
| fpnl | float | 持仓浮动盈亏 ((price - vwap) volume multiplier) (基于效率的考虑,回测模式fpnl只有仓位变化时或者一天更新一次,仿真模式3s更新一次, 回测的price为当天的收盘价) (根据持仓均价计算) |
| fpnl_open | float | 浮动盈亏(期货适用, 根据开仓均价计算) |
| cost | float | 持仓成本 (vwap volume multiplier * margin_ratio) |
| order_frozen | int | 挂单冻结仓位 |
| order_frozen_today | int | 挂单冻结今仓仓位(仅上期所和上海能源交易所标的支持) |
| available | int | 非挂单冻结仓位 ,公式为(volume - order_frozen); 如果要得到可平昨仓位,公式为 (available - available_today) |
| available_today | int | 非挂单冻结今仓位,公式为 (volume_today - order_frozen_today)(仅上期所和上海能源交易所标的支持) |
| available_now | int | 当前可用仓位 |
| credit_position_sellable_volume | int | 可卖担保品数 |
| created_at | datetime.datetime | 建仓时间 |
| updated_at | datetime.datetime | 仓位变更时间 |
| 属性 | 类型 | 说明 |
|---|---|---|
| account_id | str | 账号ID |
| pnl_ratio | float | 累计收益率 (pnl/cum_inout) |
| pnl_ratio_annual | float | 年化收益率 (pnl_ratio/自然天数*365) |
| sharp_ratio | float | 夏普比率 ([E(Rp)-Rf]/δp,E(Rp) = mean(pnl_ratio),Rf = 0,δp = std(pnl_ratio) ) |
| max_drawdown | float | 最大回撤 max_drawdown=max(Di-Dj)/Di;D为某一天的净值(j>i) |
| risk_ratio | float | 风险比率 (持仓市值/nav) |
| calmar_ratio | float | 卡玛比率 |
| open_count | int | 开仓次数 |
| close_count | int | 平仓次数 |
| win_count | int | 盈利次数(平仓价格大于持仓均价vwap的次数) |
| lose_count | int | 亏损次数 (平仓价格小于或者等于持仓均价vwap的次数) |
| win_ratio | float | 胜率 (win_count / (win_count + lose_count)) |
| created_at | datetime.datetime | 指标创建时间 |
| updated_at | datetime.datetime | 指标变更时间 |