# 变量约定

# symbol - 代码标识

掘金代码(symbol)是掘金平台用于唯一标识交易标的代码,

格式为:交易所代码.交易标代码, 比如深圳平安的symbol,示例:SZSE.000001(注意区分大小写)。 板块为:BK.板块代码,比如鸿蒙概念的symbol,示例:BK.007347,板块symbol可通过get_symbols(sec_type1=1070)获取。 代码标识表示可以在掘金终端的仿真交易或交易工具中进行查询。

# 交易所代码

目前掘金支持国内的 8 个交易所, 各交易所的代码缩写如下:

市场中文名 市场代码
上交所 SHSE
深交所 SZSE
中金所 CFFEX
上期所 SHFE
大商所 DCE
郑商所 CZCE
上海国际能源交易中心 INE
广期所 GFEX

# 交易标的代码

交易表代码是指交易所给出的交易标的代码, 包括股票(如 600000), 期货(如 rb2011), 期权(如 10002498), 指数(如 000001), 基金(如 510300)等代码。

具体的代码请参考交易所的给出的证券代码定义。

# symbol 示例

市场中文名 市场代码 示例代码 证券简称
上交所 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 月期货合约
广期所 GFEX GFEX.lc2405 碳酸锂 2024 年 05 月期货合约

# 虚拟合约

市场中文名 市场代码 示例代码 证券简称
上期所 SHFE SHFE.RB 螺纹钢主力连续合约
上期所 SHFE SHFE.RB22 螺纹钢次主力连续合约
上期所 SHFE SHFE.RB99 螺纹钢加权指数合约
上期所 SHFE SHFE.RB00 螺纹钢当月连续合约
上期所 SHFE SHFE.RB01 螺纹钢下月连续合约
上期所 SHFE SHFE.RB02 螺纹钢下季连续合约
上期所 SHFE SHFE.RB03 螺纹钢隔季连续合约

# 期货主力连续合约

仅回测模式下使用,期货主力连续合约为量价数据的简单拼接,未做平滑处理, 如 SHFE.RB 螺纹钢主力连续合约,其他主力合约请查看期货主力连续合约

# mode - 模式选择

策略支持两种运行模式,需要在run()里面指定,分别为实时模式和回测模式。

# 实时模式

实时模式需指定 mode = MODE_LIVE

订阅行情服务器推送的实时行情,也就是交易所的实时行情,只在交易时段提供,常用于仿真和实盘。

# 回测模式

回测模式需指定 mode = MODE_BACKTEST

订阅指定时段、指定交易代码、指定数据类型的历史行情,行情服务器将按指定条件全速回放对应的行情数据。适用的场景是策略回测阶段,快速验证策略的绩效是否符合预期。

# context - 上下文对象

context 是策略运行上下文环境对象,该对象将会在你的算法策略的任何方法之间做传递。用户可以通过 context 定义多种自己需要的属性,也可以查看 context 固有属性,context 结构如下图:

# context.symbols - 订阅代码集合

通过 subscribe 行情订阅函数, 订阅代码会生成一个代码集合

函数原型:

context.symbols

返回值:

类型 说明
set(str) 订阅代码集合

示例:

subscribe(symbols=['SHSE.600519', 'SHSE.600419'], frequency='60s')
context.symbols

返回值:

{'SHSE.600519', 'SHSE.600419'}

# context.now - 当前时间

实时模式返回当前本地时间, 回测模式返回当前回测时间

函数原型:

context.now

返回值:

类型 说明
datetime.datetime 当前时间(回测模式下是策略回测的当前历史时间, 实时模式下是用户的系统本地时间)

示例:

context.now

返回:

2020-09-01 09:40:00+08:00

# context.mode - 运行模式

实时模式为1,回测模式为2

函数原型:

context.mode

返回值:

类型 说明
int 实时模式为1,回测模式为2

示例:

if context.mode == 1:
    print('执行实时模式:', context.mode)
elif context.mode == 2:
    print('执行回测模式:', context.mode)
else:
    print('未知模式:', context.mode)

返回:

执行实时模式:1

# context.data - 数据滑窗

获取订阅的tick 对象 或者 bar 对象滑窗,数据为包含当前时刻推送 tick 或 bar 的前 count 条tick或者bar数据

原型:

context.data(symbol,frequency,count,fields)

参数:

参数名 类型 说明
symbol str 标的代码(只允许单个标的的代码字符串),使用时参考symbol
frequency str 频率, 支持 'tick', '1d', '60s' 等, 默认 '1d', 详情见股票行情数据期货行情数据, 实时行情支持的频率
count int 滑窗大小(正整数),需小于等于 subscribe 函数中 count 值
fields str 指定返回对象字段, 如有多个字段, 中间用, 隔开, 默认所有, 具体字段见:tick 对象bar 对象 ,需在 subscribe 函数中指定的fields范围内,指定字段越少,查询速度越快

返回值:

当subscribe的format="df"(默认)时,返回dataframe

类型 说明
dataframe tick 的 dataframe 或者 bar 的 dataframe

示例:

def init(context):
    subscribe(symbols='SHSE.600519', frequency='60s', count=50, fields='symbol, close, eob', format='df')

def on_bar(context,bars):
    data = context.data(symbol=bars[0]['symbol'], frequency='60s', count=10)
    print(data.tail())

输出:

                symbol    close                       eob
5  SHSE.600519  1629.96 2024-01-22 14:56:00+08:00
6  SHSE.600519  1627.25 2024-01-22 14:57:00+08:00
7  SHSE.600519  1627.98 2024-01-22 14:58:00+08:00
8  SHSE.600519  1642.00 2024-01-22 15:00:00+08:00
9  SHSE.600519  1632.96 2024-01-23 09:31:00+08:00

subscribe的format ="row"时,返回list[dict]

类型 说明
list[dict] 当frequency='tick'时,返回tick列表:[{tick_1}, {tick_2}, ..., {tick_n}],列表长度等于滑窗大小,即n=count, 当frequency='60s', '300s', '900s', '1800s', '3600s'时,返回bar列表:[{bar_1}, {bar_2}, {bar_n}, ..., ] ,列表长度等于滑窗大小,即n=count

示例:

def init(context):
    subscribe(symbols='SHSE.600519', frequency='tick', count=50, fields='symbol, price, quotes,created_at', format='row')


def on_tick(context, tick):
    data = context.data(symbol=tick['symbol'], frequency='tick', count=3)
    print(data)

输出:

[{'symbol': 'SHSE.600519', 'price': 1642.0, 'quotes': [{'bid_p': 1640.0, 'bid_v': 100, 'ask_p': 1642.0, 'ask_v': 4168}, {'bid_p': 1634.52, 'bid_v': 300, 'ask_p': 1642.01, 'ask_v': 100}, {'bid_p': 1633.0, 'bid_v': 100, 'ask_p': 1642.06, 'ask_v': 100}, {'bid_p': 1632.96, 'bid_v': 100, 'ask_p': 1642.08, 'ask_v': 200}, {'bid_p': 1632.89, 'bid_v': 100, 'ask_p': 1642.2, 'ask_v': 200}], 'created_at': datetime.datetime(2024, 1, 22, 15, 1, 51, 286000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}, {'symbol': 'SHSE.600519', 'price': 1642.0, 'quotes': [{'bid_p': 1640.0, 'bid_v': 100, 'ask_p': 1642.0, 'ask_v': 4168}, {'bid_p': 1634.52, 'bid_v': 300, 'ask_p': 1642.01, 'ask_v': 100}, {'bid_p': 1633.0, 'bid_v': 100, 'ask_p': 1642.06, 'ask_v': 100}, {'bid_p': 1632.96, 'bid_v': 100, 'ask_p': 1642.08, 'ask_v': 200}, {'bid_p': 1632.89, 'bid_v': 100, 'ask_p': 1642.2, 'ask_v': 200}], 'created_at': datetime.datetime(2024, 1, 22, 15, 1, 54, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}, {'symbol': 'SHSE.600519', 'price': 0.0, 'quotes': [{'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}, {'bid_p': 0.0, 'bid_v': 0, 'ask_p': 0.0, 'ask_v': 0}], 'created_at': datetime.datetime(2024, 1, 23, 9, 14, 1, 91000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))}]

subscribe的format ="col"时,返回dict

类型 说明
dict 当frequency='tick'时,返回tick数据(symbol为str格式,其余字段为列表,列表长度等于滑窗大小count),当frequency='60s', '300s', '900s', '1800s', '3600s'时,返回bar数据(symbol和frequency为str格式,其余字段为列表,列表长度等于滑窗大小count)

示例:

def init(context):
    subscribe(symbols='SHSE.600519', frequency='tick', count=10, fields='symbol, price, bid_p, created_at', format='col')


def on_tick(context, tick):
    data = context.data(symbol=tick['symbol'], frequency='tick', count=10)
    print(data)

输出:

{'symbol': 'SHSE.600519', 'price': [1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 1642.0, 0.0], 'bid_p': [1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 1640.0, 0.0], 'created_at': [datetime.datetime(2024, 1, 22, 15, 1, 12, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 21, 277000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 24, 278000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 33, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 36, 282000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 39, 279000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 48, 283000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 51, 286000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 22, 15, 1, 54, 280000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai')), datetime.datetime(2024, 1, 23, 9, 14, 1, 91000, tzinfo=datetime.timezone(datetime.timedelta(seconds=28800), 'Asia/Shanghai'))]}

注意:

1. 只有在订阅后,此接口才能取到数据,如未订阅数据,则返回报错。

2. symbol 参数只支持输入一个标的。

3. count 参数必须小于或等于订阅函数里面的 count 值。

4. fields 参数必须在订阅函数subscribe里面指定的 fields 范围内。指定字段越少,查询速度越快,目前效率是row > col > df。

5. 当subscribe的format指定col时,tick的quotes字段会被拆分,只返回买卖一档的量和价,即只有bid_p,bid_v, ask_p和ask_v。

# context.account - 账户信息

可通过此函数获取账户资金信息及持仓信息。

原型:

context.account(account_id=None)

参数:

参数名 类型 说明
account_id str 账户信息,默认返回默认账户, 如多个账户需指定 account_id

返回值:

返回类型为account - 账户对象

示例-获取当前持仓:

# 所有持仓
Account_positions = context.account().positions()
# 指定持仓
Account_position = context.account().position(symbol='SHSE.600519',side = PositionSide_Long)

返回值:

类型 说明
list[position] 持仓对象列表

注意: 没有持仓的情况下, 用 context.account().positions()查总持仓, 返回空列表, 用 context.account().position()查单个持仓,返回 None

输出:

# 所有持仓输出
[{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600419', 'side': 1, 'volume': 2200, 'volume_today': 100, 'vwap': 16.43391600830338, 'amount': 36154.61521826744, 'fpnl': -2362.6138754940007, 'cost': 36154.61521826744, 'available': 2200, 'available_today': 100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 30, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}, {'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600519', 'side': 1, 'volume': 1100, 'vwap': 1752.575242219682, 'amount': 1927832.7664416502, 'fpnl': -110302.84700805641, 'cost': 1927832.7664416502, 'available': 1100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 15, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'volume_today': 0, 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}]
# 指定持仓输出
{'account_id': 'd7443a53-f65b-11ea-bb9d-484d7eaefe55', 'symbol': 'SHSE.600519', 'side': 1, 'volume': 1100, 'vwap': 1752.575242219682, 'amount': 1927832.7664416502, 'fpnl': -110302.84700805641, 'cost': 1927832.7664416502, 'available': 1100, 'created_at': datetime.datetime(2020, 9, 1, 9, 40, tzinfo=tzfile('PRC')), 'updated_at': datetime.datetime(2020, 9, 15, 9, 40, tzinfo=tzfile('PRC')), 'account_name': '', 'volume_today': 0, 'vwap_diluted': 0.0, 'price': 0.0, 'order_frozen': 0, 'order_frozen_today': 0, 'available_today': 0, 'available_now': 0, 'market_value': 0.0, 'last_price': 0.0, 'last_volume': 0, 'last_inout': 0, 'change_reason': 0, 'change_event_id': '', 'has_dividend': 0}

示例-获取当前账户资金:

context.account().cash

返回值:

类型 说明
dict[cash] 资金对象字典

输出:

{'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': ''}

示例-获取账户连接状态:

context.account().status

输出:

{'state': 3, 'error': {'code': 0, 'type': '', 'info': ''}}

# context.parameters - 动态参数

获取所有动态参数

函数原型:

context.parameters

返回值:

类型 说明
dict key 为动态参数的 key, 值为动态参数对象, 参见动态参数

示例-添加动态参数和查询所有设置的动态参数

add_parameter(key='k_value', value=context.k_value, min=0, max=100, name='k值阀值', intro='k值阀值',group='1', readonly=False)

context.parameters

输出:

{'k_value': {'key': 'k_value', 'value': 80.0, 'max': 100.0, 'name': 'k值阀值', 'intro': 'k值阀值', 'group': '1', 'min': 0.0, 'readonly': False}}

# context.xxxxx - 自定义属性

通过自定义属性设置参数, 随 context 全局变量传入策略各个事件里

context.my_value = 100000000

返回值:

类型 说明
any type 自定义属性

示例-输出自定义属性

print(context.my_value)

输出:

100000000

上次更新: 3/27/2024, 3:01:49 PM