主题
策略引擎简介
业务流程框架
- PTrade量化引擎以事件触发为基础,通过初始化事件
initialize、盘前事件before_trading_start、盘中事件handle_data、盘后事件after_trading_end来完成每个交易日的策略任务。 initialize和handle_data是一个允许运行策略的最基础结构,也就是必选项,before_trading_start和after_trading_end是可以按需运行的。handle_data仅满足日线和分钟级别的盘中处理,tick级别的盘中处理则需要通过tick_data或者run_interval来实现。- PTrade还支持委托主推事件
on_order_response、交易主推事件on_trade_response,可以通过委托和成交的信息来处理策略逻辑,是tick级的一个补充。 - 除了以上的一些事件以外,PTrade支持通过定时任务来运行策略逻辑,通过
run_daily接口实现。 - 框架对
initialize、before_trading_start、handle_data、after_trading_end、tick_data、run_daily、run_interval、on_order_response、on_trade_response做了try保护,即这些事件中策略执行报错不会导致程序主进程退出,下一个事件会正常触发。

initialize
python
initialize(context):
pass该函数用于初始化一些全局变量,是策略运行的唯二必须定义的函数之一
注意事项
- 该函数只会在每次回测或交易启动的时候运行一次。
使用场景
❌研究 ✅回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
示例
python
def initialize(context):
#g为全局对象
g.security = '600570.XSHG'
set_universe(g.security)
def handle_data(context, data):
order('600570.XSHG', 100)before_trading_start
python
before_trading_start(context, data):
pass该函数用于添加每天盘前的处理逻辑,如无盘前初始化需求,该函数可以在策略中不做定义。
注意事项
- 在回测中,该函数在每个回测交易日 8:30 分执行。
- 在交易中,该函数在开启交易时立即执行,从隔日开始每天 9:10(股票)/08:58(港股通) 分(默认)执行。
- 当在 9:10(股票)/08:58(港股通) 前开启交易时,受行情未更新原因在该函数内调用实时行情接口会导致数据有误。可通过在该函数内 sleep 至 9:10(股票)/08:58(港股通) 分或调用实时行情接口改为
run_daily执行等方式进行避免。
使用场景
❌研究 ✅回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
data
保留字段暂无数据
示例
python
def initialize(context):
#g为全局变量
g.security = '600570.XSHG'
set_universe(g.security)
def before_trading_start(context, data):
log.info(g.security)
def handle_data(context, data):
order('600570.XSHG',100)handle_data
python
handle_data(context, data):
pass该函数在交易时间内按指定的周期频率运行,是用于处理策略交易的主要模块,根据策略保存时的周期参数分为每分钟运行和每天运行,是策略运行唯二必须定义的函数之一。
注意事项
- 该函数每个单位周期执行一次。
- 该函数执行时间由券商配置决定。
- 如果是日线级别策略,每天执行一次。股票回测场景下,默认在 15:00 执行;股票交易场景下,默认在 14:50 执行。期货回测场景下,默认在 14:50 执行;港股通交易场景下,默认在 16:00 执行。
- 如果是分钟级别策略,每分钟执行一次。股票回测场景下,默认执行时间为 9:31-15:00,股票交易场景下,默认执行时间为 9:30-14: 59;港股通交易场景下,默认执行时间为 9:30-16:09。
- 回测与交易中,handle_data 函数不会在非交易日触发(如回测或交易起始日期为2015年12月21日,则策略在2016年1月1日-3日时,
handle_data不会运行,4日继续运行)。
使用场景
❌研究 ✅回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
data
- 类型:
dict[str, BarData]
一个字典,key是标的代码,value是当时的BarData对象,存放当前周期(日线策略,则是当天;分钟策略,则是这一分钟)的行情数据;
说明
为了加速,data中的数据只包含股票池中所订阅标的的信息,可使用data[security]的方式来获取当前周期对应的标的信息;
示例
python
def initialize(context):
#g为全局变量
g.security = '600570.XSHG'
set_universe(g.security)
def handle_data(context, data):
order('600570.XSHG', 100)after_trading_end
python
after_trading_end(context, data):
pass该函数会在每天交易结束之后调用,用于处理每天收盘后的操作,如无盘后处理需求,该函数可以在策略中不做定义。
注意事项
- 该函数只会在每天盘后执行一次
- 该函数执行时间由券商配置决定,默认为 15:30(股票)/16:30(港股通)。
使用场景
❌研究 ✅回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
data
保留字段暂无数据
示例
python
def initialize(context):
#g为全局变量
g.security = '600570.XSHG'
set_universe(g.security)
def handle_data(context, data):
order('600570.XSHG',100)
def after_trading_end(context, data):
log.info(g.security)tick_data
python
tick_data(context, data):
pass该函数可以用于处理 tick 级别策略的交易逻辑,每隔 3 秒执行一次,如无 tick 处理需求,该函数可以在策略中不做定义。
注意事项
- 该函数执行时间为 9:30-14:59。
- 该函数中的
data和handle_data函数中的data是不一样的,请勿混淆。 - 参数
data中包含的逐笔委托,逐笔成交数据需开通 level2 行情才能获取到数据,否则对应数据返回 None。 - 参数
data中的 tick 数据取自get_snapshot并转换为 DataFrame 格式,如要更快速的获取快照强烈建议直接使用get_snapshot获取。 - 当调用
set_parameters并设置tick_data_no_l2="1"时,参数data中将不包含逐笔委托、逐笔成交字段,当券商有 l2 行情时配置该参数可提升 data 取速; - 当策略执行时间超过 3s 时,将会丢弃中间堵塞的 tick_data。
- 在收盘后,将会清空队列中未执行的 tick_data。
- 参数 data 中包含的逐笔委托,逐笔成交数据正常返回 DataFrame 格式,异常时返回 None。
- 该函数不支持港股通业务。
使用场景
❌研究 ❌回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
data
- 类型:
dict[str, dict]
一个字典,key 为对应的标的代码(如:'600570.XSHG'),value 为一个字典对象,包含 tick(实时行情快照)、order(最近一条逐笔委托)、transcation(最近一条逐笔成交)三项
数据示例
python
{
'600570.XSHG': {
'tick': DataFrame,
'order': DataFrame | None,
'transcation': DataFrame | None,
}
}tick(实时行情快照)
| 字段名 | 类型 | 说明 |
|---|---|---|
last_px | float | 最新成交价 |
open_px | float | 今开盘价 |
high_px | float | 最高价 |
low_px | float | 最低价 |
close_px | float | 今日收盘 |
preclose_px | float | 昨收价 |
up_px | float | 涨停价格 |
down_px | float | 跌停价格 |
avg_px | float | 均价 |
wavg_px | float | 加权平均价 |
business_amount | int | 成交数量 |
business_amount_in | int | 内盘成交量 |
business_amount_out | int | 外盘成交量 |
business_balance | float | 成交金额 |
business_count | int | 成交笔数 |
current_amount | int | 最近成交量(现手) |
pe_rate | float | 动态市盈率 |
pb_rate | float | 市净率 |
px_change_rate | float | 涨跌幅 |
turnover_ratio | float | 换手率 |
vol_ratio | float | 量比 |
entrust_diff | float | 委差 |
entrust_rate | float | 委比 |
hsTimeStamp | str | 时间戳(YYYYMMDDHHMISS格式) |
trade_mins | int | 交易时间(距开盘分钟数) |
issue_date | int | 上市日期(YYYYMMDD格式) |
start_trade_date | int | 首个交易日(YYYYMMDD格式) |
end_trade_date | int | 最后交易日(YYYYMMDD格式) |
bid_grp | dict[int, list] | 买档位数据 |
offer_grp | dict[int, list] | 卖档位数据 |
total_bidqty | int | 委买量 |
total_offerqty | int | 委卖量 |
total_bid_turnover | float | 委买金额 |
total_offer_turnover | float | 委卖金额 |
circulation_amount | flat | 流通股本 |
tick_size | float | 最小报价单位 |
amount | float | 持仓量,期货专用,股票返回0.0 |
settlement | float | 结算价,期货专用,股票返回0.0 |
prev_settlement | float | 昨结算,期货专用,股票返回0.0 |
trade_status | str | 交易状态 |
档位数据格式
{1: [42.71, 200, 0], 2: [42.74, 200, 0], ...},其中每个档位包含:[委托价格, 委托数量, 委托笔数]
order(逐笔委托)
| 字段名 | 类型 | 说明 |
|---|---|---|
business_time | int | 时间戳毫秒级 |
hq_px | float | 价格 |
business_amount | int | 委托量 |
order_no | int | 委托编号 |
business_direction | int | 成交方向 |
trans_kind | int | 委托类别 |
transcation(逐笔成交)
| 字段名 | 类型 | 说明 |
|---|---|---|
business_time | int | 时间戳毫秒级 |
hq_px | float | 价格 |
business_amount | int | 成交量 |
trade_index | int | 成交编号 |
business_direction | int | 成交方向 |
buy_no | int | 叫买方编号 |
sell_no | int | 叫卖方编号 |
trans_flag | int | 成交标记 |
trans_identify_am | int | 盘后逐笔成交序号标识 |
channel_num | int | 成交通道信息 |
示例
python
def initialize(context):
g.security = '600570.XSHG'
set_universe(g.security)
def tick_data(context,data):
# 获取买一价
security = g.security
current_price = eval(data[security]['tick']['bid_grp'][0])[1][0]
log.info(current_price)
# 获取买二价
# current_price = eval(data[security]['tick']['bid_grp'][0])[2][0]
# 获取买三量
# current_amount = eval(data[security]['tick']['bid_grp'][0])[3][1]
# 获取tick最高价
# current_high_price = data[security]['tick']['high_px'][0]
# 最近一笔逐笔成交的成交量
# transaction = data[security]["transcation"]
# business_amount = list(transaction["business_amount"])
# if len(business_amount) > 0:
# log.info("最近一笔逐笔成交的成交量:%s" % business_amount[0])
# 最近一笔逐笔委托的委托类别
# order = data[security]["order"]
# trans_kind = list(order["trans_kind"])
# if len(trans_kind) > 0:
# log.info("最近一笔逐笔委托的委托类别:%s" % trans_kind[0])
if current_price > 38.19:
# 按买一档价格下单
order_tick(security, 100, 1)
def handle_data(context, data):
passon_order_response
python
on_order_response(context, order_list):
pass该函数会在引擎收到委托主推时回调,比通过get_order和get_orders等接口更新订单委托状态的速度更快,适合对速度要求比较高的策略。
注意事项
- 目前可接收股票、可转债、ETF、LOF、期货、港股通代码的主推数据。
- 当接到策略外交易产生的主推时(需券商配置默认不推送):由于没有对应的Order对象,主推信息中order_id字段赋值为"" ;主推信息中entrust_reference字段赋值为""
- 当接到策略外交易产生的主推时(需券商配置默认不推送),由于没有对应的
Order对象,主推信息中order_id字段赋值为""。 - 当在主推里调用委托接口时,需要进行判断处理避免无限迭代循环问题。
- 当券商配置接收策略外交易产生的主推且策略调用
set_parameters并设置receive_other_response="1"时,策略中将接收非本交易产生的主推。 - 当策略调用
set_parameters并设置receive_cancel_response="1",策略接收到撤单成交主推时,主推信息中的order_id为买入或卖出委托Order对象的订单编号,entrust_no为撤单委托的委托编号。 - 撤单委托主推信息中成交数量均处理为正数。
- 主推信息中的entrust_reference可以与Order对象的entrust_reference进行匹配判断是本策略发送的委托,由于get_orders() 可以获取到开启交易后所有的Order对象,需要根据Order.dt过滤当日数据。
使用场景
❌研究 ❌回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
order_list
- 类型:
list
当委托订单状态发生变化时,返回发生变化的委托订单列表。每条订单包含的字段如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
order_id | str | 订单编号 |
entrust_no | str | 委托编号 |
order_time | str | 委托时间 |
stock_code | str | 证券代码 |
amount | int | 委托数量 |
price | float | 委托价格 |
business_amount | float | 成交数量 |
status | str | 委托状态 |
entrust_type | str | 委托类别 |
entrust_prop | str | 委托属性 |
error_info | str | 错误信息 |
entrust_reference | str | 委托引用 |
数据样例
python
[
# 本交易委托产生的主推:
{
'order_id': 'e71d1684c8a74b4ca00b3326c9eb8614',
'entrust_no': '700006',
'order_time': '2022-05-10 15:52:10.780',
'stock_code': '600570.XSHG',
'amount': 200,
'price': 36.95,
'business_amount': 0.0,
'status': '2',
'entrust_type': '0',
'entrust_prop': '0',
'error_info': '',
'entrust_reference': '10000005'
},
# 非本交易委托产生的主推:
{
'order_id': '',
'entrust_no': '700008',
'order_time': '2022-05-10 15:54:30.204',
'stock_code': '600570.XSHG',
'amount': 200,
'price': 36.95,
'business_amount': 0.0,
'status': '2',
'entrust_type': '0',
'entrust_prop': '0',
'error_info': '',
'entrust_reference': ''
},
# 本交易撤单产生的主推:
{
'order_id': '0e27467920464390aa10a7a53da4d49a',
'entrust_no': '700007',
'order_time': '2022-05-10 15:52:10.780',
'stock_code': '600570.XSHG',
'amount': 200,
'price': 36.95,
'business_amount': 0.0,
'status': '2',
'entrust_type': '2',
'entrust_prop': '0',
'error_info': '',
'entrust_reference': '10000006'
},
# 非本交易撤单产生的主推:
{
'order_id': '',
'entrust_no': '700009',
'order_time': '2022-05-10 15:54:30.204',
'stock_code': '600570.XSHG',
'amount': 200,
'price': 36.95,
'business_amount': 0.0,
'status': '2',
'entrust_type': '2',
'entrust_prop': '0',
'error_info': '',
'entrust_reference': ''
}
]示例
python
def initialize(context):
g.security = ['600570.XSHG','002416.XSHE']
set_universe(g.security)
g.flag = 0
def on_order_response(context, order_list):
log.info(order_list)
if (g.flag == 0):
order('600570.XSHG', 100)
g.flag = 1
else:
log.info("end")
def handle_data(context, data):
order('600570.XSHG', 100)on_trade_response
python
on_trade_response(context, trade_list):
pass该函数会在引擎收到委托主推时回调,比通过get_trades接口更新Order状态的速度更快,适合对速度要求比较高的策略。
注意事项
- 目前可接收股票、可转债、ETF、LOF、期货、港股通代码的主推数据。
- 当接到策略外交易产生的主推时(需券商配置默认不推送):由于没有对应的Order对象,主推信息中order_id字段赋值为"" ;主推信息中entrust_reference字段赋值为""。
- 当接到策略外交易产生的主推时(需券商配置默认不推送),由于没有对应的
Order对象,主推信息中order_id字段赋值为""。 - 当在主推里调用委托接口时,需要进行判断处理避免无限迭代循环问题。
- 当券商配置接收策略外交易产生的主推且策略调用set_parameters并设置
receive_other_response="1"时,策略中将接收非本交易产生的主推。 - 当策略调用set_parameters并设置
receive_cancel_response="1",策略接收到撤单成交主推时,主推信息中的order_id为买入或卖出委托Order对象的订单编号,entrust_no为撤单委托的委托编号。 - 撤单成交主推信息中成交数量均处理为正数。
- withdraw_no(撤单原委托号)仅在撤单成交主推信息中才有对应值,在委托成交主推中该字段赋'0'默认值。
- 撤单成交主推信息中entrust_no在异构柜台情况下与withdraw_no一致,因此策略中请勿将该字段作为撤单成交主推信息的关联字段。
- 主推信息中的entrust_reference可以与Order对象的entrust_reference进行匹配判断是本策略发送的委托,由于get_orders() 可以获取到开启交易后所有的Order对象,需要根据Order.dt过滤当日数据。
使用场景
❌研究 ❌回测 ✅交易
参数
context
- 类型:
Context
策略上下文,存放有当前的账户及持仓等信息
trade_list
- 类型:
list
当委托成交状态发生变化时,返回发生变化的成交列表。每条成交包含的字段如下:
| 字段名 | 类型 | 说明 |
|---|---|---|
order_id | str | 订单编号 |
entrust_no | str | 委托编号 |
business_time | str | 成交时间 |
stock_code | str | 证券代码 |
entrust_bs | str | 委托方向 |
business_amount | float | 成交数量 |
business_price | float | 成交价格 |
business_id | str | 成交编号 |
status | str | 委托状态 |
cancel_info | str | 废单原因 |
withdraw_no | str | 撤单原委托编号 |
real_type | str | 成交类型 |
real_status | str | 成交状态 |
entrust_reference | str | 委托引用 |
使用说明
- 当
real_type为 "0",real_status为 "0" 时,为买卖成交主推; - 当
real_type为 "2",real_status为 "0" 时,为撤单成交主推; - 当
real_type为 "0",real_status为 "2" 时,为买卖废单主推; - 当
real_type为 "2",real_status为 "2" 时,为撤单废单主推; - 当
real_type为 "0",real_status为 "4" 时,为买卖确认主推;
数据样例
python
[
# 本交易委托产生的主推:
{
'status': '8',
'business_id': '76',
'business_amount': 200,
'order_id': 'e71d1684c8a74b4ca00b3326c9eb8614',
'entrust_no': '700006',
'business_balance': 7390.0,
'business_price': 36.95,
'stock_code': '600570.XSHG',
'entrust_bs': '1',
'business_time': '2022-05-10 15:51:47',
'real_type': '0',
'real_status': '0',
'entrust_reference': '10000005'
},
# 非本交易委托产生的主推
{
'status': '8',
'business_id': 'b155235000000003',
'business_amount': 200,
'order_id': '',
'entrust_no': '700007',
'business_balance': 3000.0,
'business_price': 15.0,
'stock_code': '000001.XSHE',
'entrust_bs': '1',
'business_time': '2022-05-10 15:52:35',
'real_type': '0',
'real_status': '0',
'entrust_reference': ''
},
# 本交易撤单产生的主推:
{
'status': '8',
'business_id': '0',
'withdraw_no': '78',
'business_amount': 0,
'order_id': 'e71d1684c8a74b4ca00b3326c9eb8614',
'entrust_no': '700006',
'business_balance': 7390.0,
'business_price': 36.95,
'stock_code': '600570.XSHG',
'entrust_bs': '1',
'business_time': '2022-05-10 15:51:47',
'real_type': '2',
'real_status': '0',
'entrust_reference': '10000006'
},
# 非本交易撤单产生的主推
{
'status': '8',
'business_id': '0',
'withdraw_no': '79',
'business_amount': 0,
'order_id': '',
'entrust_no': '700007',
'business_balance': 3000.0,
'business_price': 15.0,
'stock_code': '000001.XSHE',
'entrust_bs': '1',
'business_time': '2022-05-10 15:52:35',
'real_type': '2',
'real_status': '0',
'entrust_reference': ''
}
]示例
python
def initialize(context):
g.security = ['600570.XSHG','002416.XSHE']
set_universe(g.security)
g.flag = 0
def on_trade_response(context, trade_list):
log.info(trade_list)
if(g.flag==0):
order('600570.XSHG', 100)
g.flag = 1
else:
log.info("end")
def handle_data(context, data):
order('600570.XSHG', 100)内置对象
g
python
g.security = None #股票池全局对象,用于存储用户策略自定义的全局数据,在整个策略中都可以访问
使用场景
❌研究 ✅回测 ✅交易
示例
python
def initialize(context):
g.security = "600570.XSHG"
g.count = 1
g.flag = 0
set_universe(g.security)
def handle_data(context, data):
log.info(g.security)
log.info(g.count)
log.info(g.flag)Context
业务上下文对象,存放有当前的账户及持仓等信息
注意事项
对象内的portfolio数据更新周期详见Portfolio对象对象注意事项说明。
使用场景
❌研究 ✅回测 ✅交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
capital_base | float | 起始资金 |
previous_date | datetime | 前一个交易日 |
sim_params | SimulationParameters | 模拟参数对象 |
slippage | VolumeShareSlippage | 滑点参数对象 |
commission | Commission | 佣金参数对象 |
blotter | Blotter | 订单信息组合 |
portfolio | Portfolio | 账户信息对象 |
initialized | bool | 是否执行初始化 |
recorded_vars | dict | 收益曲线值 |
数据示例
python
{
'capital_base': 100000.0,
'previous_date': datetime.date(2025, 1, 14),
'sim_params': {
'period_start': datetime.datetime(2025, 1, 2, 0, 0),
'period_end': datetime.datetime(2025, 1, 23, 0, 0),
'capital_base': 100000.0,
'data_frequency': 'daily',
'emission_rate': 'daily',
'first_open': datetime.datetime(2025, 1, 2, 9, 31),
'last_close': datetime.datetime(2025, 1, 23, 15, 0)
},
'slippage': {'volume_limit': 0.25, 'price_impact': 0.0},
'commission': {'tax': 0.001, 'cost': 0.0003, 'min_trade_cost': 5.0},
'blotter': {
'orders': [
{
'id': '23b4d6ae557041498c05f50ead7842db',
'dt': datetime.datetime(2025, 1, 9, 15, 0),
'priceGear': 0,
'limit': 26.5,
'symbol': '600570.XSHG',
'amount': 500,
'created': datetime.datetime(2025, 1, 9, 15, 0),
'filled': 500,
'status': '8',
'entrust_no': None,
'cancel_entrust_no': None
}
],
'new_orders': [],
'open_orders': [],
'current_dt': datetime.datetime(2025, 1, 15, 15, 30)
},
'portfolio': {
'cash': 728.16,
'capital_used': 99271.83,
'positions': {
'600570.XSHG': {
'sid': '600570.XSHG',
'amount': 3900,
'enable_amount': 3900,
'today_amount': 0,
'business_type': 'stock',
'last_sale_price': 26.3,
'cost_basis': 25.45,
'update_time': None
}
},
'positions_value': 102570.0,
'portfolio_value': 103298.16,
'start_date': datetime.date(2025, 1, 2),
'returns': 0.032,
'pnl': 3298.16
},
'initialized': True,
'recorded_vars': {},
}SimulationParameters
模拟参数对象,模拟回测的相关参数信息
使用场景
❌研究 ✅回测 ❌交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
period_start | datetime | 开始时间 |
period_end | datetime | 结束时间 |
capital_base | float | 起始资金 |
data_frequency | str | 数据频率 |
emission_rate | str | 执行速率 |
first_open | datetime | 开市时间,第一个交易日的 9:31 |
last_close | datetime | 停市时间,最后一个交易日的 15:00 |
数据示例
python
{
'period_start': datetime.datetime(2025, 1, 2, 0, 0),
'period_end': datetime.datetime(2025, 1, 23, 0, 0),
'capital_base': 100000.0,
'data_frequency': 'daily',
'emission_rate': 'daily',
'first_open': datetime.datetime(2025, 1, 2, 9, 31),
'last_close': datetime.datetime(2025, 1, 23, 15, 0)
}VolumeShareSlippage
滑点参数对象
使用场景
❌研究 ✅回测 ❌交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
volume_limit | float | 成交限量 |
price_impact | float | 价格影响力 |
数据示例
python
{
'volume_limit': 0.25,
'price_impact': 0.0
}Commission
佣金参数对象
使用场景
❌研究 ✅回测 ❌交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
tax | float | 印花税 |
cost | float | 佣金费率 |
min_trade_cost | float | 最小佣金 |
数据示例
python
{
'tax': 0.001,
'cost': 0.0003,
'min_trade_cost': 5.0
}Blotter
订单信息组合
使用场景
❌研究 ✅回测 ✅交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
orders | list[Order] | 全部交易订单 |
new_orders | list[Order] | 新生成的交易订单 |
open_orders | list[Order] | 未完成交易订单 |
current_dt | datetime | 当前单位时间的开始时间 |
数据示例
python
{
'orders': [{
'limit': 26.5,
'created': datetime.datetime(2025, 1, 9, 15, 0),
'priceGear': 0,
'entrust_no': None,
'cancel_entrust_no': None,
'dt': datetime.datetime(2025, 1, 9, 15, 0),
'id': '23b4d6ae557041498c05f50ead7842db',
'symbol': '600570.XSHG',
'status': '8',
'amount': 500,
'filled': 500
}],
'new_orders': [],
'open_orders': [],
'current_dt': datetime.datetime(2025, 1, 15, 15, 30)
}Portfolio
账户信息对象,包含账户当前的资金和仓位信息
注意事项
- 数据更新周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为
before_trading_start-after_trading_end之间。 - 不同业务返回的字段存在差异,需要注意区分。
使用场景
❌研究 ✅回测 ✅交易
数据结构
股票账户
| 字段名 | 类型 | 说明 |
|---|---|---|
cash | float | 当前可用资金(不包含冻结资金) |
capital_used | float | 已使用资金 |
positions | list[Position] | 当前持有的标的 |
positions_value | float | 持仓价值 |
portfolio_value | float | 当前持有的标的和现金的总价值 |
start_date | datetime | 开始时间 |
returns | float | 当前的收益比例 |
pnl | float | 浮动盈亏,即当前账户总资产-初始账户总资产 |
港股通账户
| 字段名 | 类型 | 说明 |
|---|---|---|
cash | float | 当前可用资金(不包含冻结资金) |
positions | list[Position] | 当前持有的标的 |
portfolio_value | float | 当前持有的标的和现金的总价值 |
positions_value | float | 持仓价值 |
returns | float | 当前的收益比例 |
pnl | float | 浮动盈亏,即当前账户总资产-初始账户总资产 |
start_date | datetime | 开始时间 |
期货账户
| 字段名 | 类型 | 说明 |
|---|---|---|
cash | float | 当前可用资金(不包含冻结资金) |
margin | float | 持仓保证金 |
positions | dict[str, Position] | 当前持有的标的 |
positions_value | float | 持仓价值 |
portfolio_value | float | 当前持仓保证金和现金的总价值 |
start_date | datetime | 开始时间 |
returns | float | 当前的收益比例 |
pnl | float | 浮动盈亏,即当前账户总资产-初始账户总资产 |
数据示例
python
{
'cash': 728.16,
'capital_used': 99271.83,
'positions': {
'600570.XSHG': {
'update_time': None,
'cost_basis': 25.45,
'business_type': 'stock',
'enable_amount': 3900,
'today_amount': 0,
'last_sale_price': 26.3,
'sid': '600570.XSHG',
'amount': 3900,
}
},
'positions_value': 102570.0,
'portfolio_value': 103298.16,
'start_date': datetime.date(2025, 1, 2),
'returns': 0.032,
'pnl': 3298.16,
}Order
委托订单信息
注意事项
- 回测中
entrust_no、cancel_entrust_no、entrust_reference字段值为 None。 - 交易中对象内的数据更新分为两种同时进行:
- 定时更新,周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为
before_trading_start-after_trading_end之间。 - 主推事件更新,后台接收到主推数据时会更新对象内成交数量、委托状态、持仓成本价等信息。
- 定时更新,周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为
- 交易中对原委托进行撤单时,cancel_entrust_no字段值填充撤单委托编号。
- 交易中期货(对接UFT柜台)对原委托进行撤单时,撤单委托编号等于原委托编号。
- 不同业务返回的字段存在差异,需要注意区分。
使用场景
❌研究 ✅回测 ✅交易
数据结构
股票账户
| 字段名 | 类型 | 说明 |
|---|---|---|
id | str | 订单编号 |
dt | datetime | 订单产生时间 |
priceGear | int | 盘口标识 买1卖-1 |
limit | float | 指定价格 |
symbol | str | 标的代码 |
amount | int | 下单数量,买入是正数,卖出是负数 |
created | datetime | 订单生成时间 |
filled | int | 成交数量,买入时为正数,卖出时为负数 |
status | str | 委托状态 |
entrust_no | str | 委托编号 |
cancel_entrust_no | str | 撤单委托编号 |
entrust_reference | str | 委托引用 |
港股通账户
| 字段名 | 类型 | 说明 |
|---|---|---|
id | str | 订单编号 |
dt | datetime | 订单产生时间 |
limit | float | 指定价格 |
symbol | str | 标的代码 |
amount | int | 下单数量,买入是正数,卖出是负数 |
created | datetime | 订单生成时间 |
filled | int | 成交数量,买入时为正数,卖出时为负数 |
status | str | 委托状态 |
entrust_no | str | 委托编号 |
cancel_entrust_no | str | 撤单委托编号 |
entrust_reference | str | 委托引用 |
期货账户
| 字段名 | 类型 | 说明 |
|---|---|---|
id | str | 订单编号 |
dt | datetime | 订单产生时间 |
priceGear | int | 盘口标识 买1卖-1 |
limit | float | 指定价格 |
symbol | str | 标的代码 |
amount | int | 下单数量,买入是正数,卖出是负数 |
created | datetime | 订单生成时间 |
side | str | 多空标志(long:多头,short:空头) |
action | str | 开平仓方向(open:开仓,close:平仓) |
entrust_direction | str | 买卖方向(buy:买入,sell:卖出) |
filled | int | 成交数量,买入时为正数,卖出时为负数 |
status | str | 委托状态 |
entrust_no | str | 委托编号 |
cancel_entrust_no | str | 撤单委托编号 |
entrust_reference | str | 委托引用 |
数据示例
python
{
'id': '23b4d6ae557041498c05f50ead7842db',
'dt': datetime.datetime(2025, 1, 9, 15, 0),
'priceGear': 0,
'limit': 26.5,
'symbol': '600570.XSHG',
'amount': 500,
'created': datetime.datetime(2025, 1, 9, 15, 0),
'filled': 500,
'status': '8',
'entrust_no': None,
'cancel_entrust_no': None
}Position
持有的某个标的的信息
注意事项
- 期货业务持仓把单个合约的持仓分为了多头仓(long)、空头仓(short)。
- 交易中对象内的数据更新周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为
before_trading_start-after_trading_end之间。 - 交易场景下,持仓信息是每6秒与柜台同步后更新的,update_time字段记录了最近的更新时间,格式为:"%Y-%m-%d %H:%M:%S" 。回测场景返回None。
- 不同业务返回的字段存在差异,需要注意区分。
使用场景
❌研究 ✅回测 ✅交易
数据结构
股票账户
| 字段名 | 类型 | 说明 |
|---|---|---|
sid | str | 标的代码 |
amount | int | 持仓数量 |
enable_amount | int | 可用数量 |
today_amount | int | 今日买入数量 |
business_type | str | 持仓类型 |
last_sale_price | float | 最新价格 |
cost_basis | float | 持仓成本 |
update_time | str | 更新时间 |
港股通账户
| 字段名 | 类型 | 说明 |
|---|---|---|
sid | str | 标的代码 |
amount | int | 持仓数量 |
enable_amount | int | 可用数量 |
business_type | str | 持仓类型 |
last_sale_price | float | 最新价格 |
cost_basis | float | 持仓成本 |
update_time | str | 更新时间 |
期货账户
| 字段名 | 类型 | 说明 |
|---|---|---|
sid | str | 标的代码 |
contract_multiplier | int | 合约乘数 |
delivery_date | int | 交割日期 |
amount | int | 持仓数量 |
long_amount | int | 多头持仓数量 |
short_amount | int | 空头持仓数量 |
enable_amount | int | 可用数量 |
long_enable_amount | int | 多头可用数量 |
short_enable_amount | int | 空头可用数量 |
today_long_amount | int | 多头今仓数量 |
today_short_amount | int | 空头今仓数量 |
margin | float | 持仓保证金 |
business_type | str | 持仓类型 |
last_sale_price | float | 最新价格 |
long_cost_basis | float | 多头持仓成本 |
short_cost_basis | float | 空头持仓成本 |
long_pnl | float | 多头浮动盈亏 |
short_pnl | float | 空头浮动盈亏 |
update_time | str | 更新时间 |
数据示例
python
{
'sid': '600570.XSHG',
'amount': 3900,
'enable_amount': 3900,
'today_amount': 0,
'business_type': 'stock',
'last_sale_price': 26.3,
'cost_basis': 25.45,
'update_time': None
}BarData
K线行情数据对象
注意事项
preclose、high_limit、low_limit、unlimited在分钟频率中均填充为0.0。- 当前周期内首次调用会在线获取该代码K线数据,当前周期重复调用时将会返回首次调用缓存的该代码K线数据。
使用场景
❌研究 ✅回测 ✅交易
数据结构
| 字段名 | 类型 | 说明 |
|---|---|---|
symbol | str | 标的代码 |
name | str | 代码名称 |
dt | datetime | 当前周期时间 |
is_open | int | 停牌标志,0-停牌,1-非停牌 |
open | float | 当前周期开盘价 |
close | float | 当前周期收盘价 |
price | float | 当前周期最新价 |
low | float | 当前周期最低价 |
high | float | 当前周期最高价 |
volume | float | 当前周期成交量 |
money | float | 当前周期成交额 |
preclose | float | 昨收盘价(仅日线返回) |
high_limit | flot | 涨停价(仅日线返回) |
low_limit | float | 跌停价(仅日线返回) |
unlimited | bool | 是否无涨跌停限制(仅日线返回) |
datetime | datetime | 当前周期时间 |
示例
python
def initialize(context):
g.security = "600570.XSHG"
set_universe(g.security)
def before_trading_start(context, data):
g.flag = False
def handle_data(context, data):
if not g.flag:
# 打印代码BarData对象
log.info(data[g.security])
# 打印标的代码
log.info(data[g.security].symbol)
# 打印代码名称
log.info(data[g.security].name)
# 打印当前周期时间
log.info(data[g.security].dt)
# 打印当前周期是否开盘
log.info(data[g.security].is_open)
# 打印当前周期开盘价
log.info(data[g.security].open)
# 打印当前周期收盘价
log.info(data[g.security].close)
# 打印当前周期最新价
log.info(data[g.security].price)
# 打印当前周期最低价
log.info(data[g.security].low)
# 打印当前周期最高价
log.info(data[g.security].high)
# 打印当前周期成交量
log.info(data[g.security].volume)
# 打印当前周期成交额
log.info(data[g.security].money)
# 打印昨收盘价(仅日线返回)
log.info(data[g.security].preclose)
# 打印涨停价(仅日线返回)
log.info(data[g.security].high_limit)
# 打印跌停价(仅日线返回)
log.info(data[g.security].low_limit)
# 打印是否无涨跌停限制(仅日线返回)
log.info(data[g.security].unlimited)
# 打印当前周期时间
log.info(data[g.security].datetime)
g.flag = True数据字典
委托状态
| 字典项 | 说明 |
|---|---|
| "0" | 未报 |
| "1" | 待报 |
| "2" | 已报 |
| "3" | 已报待撤 |
| "4" | 部成待撤 |
| "5" | 部撤 |
| "6" | 已撤 |
| "7" | 部成 |
| "8" | 已成 |
| "9" | 废单 |
| "+" | 已受理 |
| "-" | 已确认 |
| "C" | 正报 |
| "V" | 已确认 |
委托类别
| 字典项 | 说明 |
|---|---|
| "0" | 委托 |
| "2" | 撤单 |
| "4" | 确认 |
| "6" | 信用融资 |
| "7" | 信用融券 |
| "9" | 信用交易 |
委托属性
| 字典项 | 说明 |
|---|---|
| "0" | 买卖 |
| "1" | 配股 |
| "3" | 申购 |
| "4" | 回购 |
| "7" | 转股 |
| "9" | 股息 |
| "N" | ETF申赎 |
| "Q" | 对手方最优价格 |
| "R" | 最优五档即时成交剩余转限价 |
| "S" | 本方最优价格 |
| "T" | 即时成交剩余撤销 |
| "U" | 最优五档即时成交剩余撤销 |
| "V" | 全成交或撤销 |
| "b" | 定价委托 |
| "c" | 确认委托 |
| "d" | 限价委托 |
| "HKN" | 港股订单申报 |
| "HKO" | 零股订单申报 |
成交方向
| 字典项 | 说明 |
|---|---|
| 0 | 卖 |
| 1 | 买 |
| 2 | 借入 |
| 3 | 出借 |
委托类型
| 字典项 | 说明 |
|---|---|
| 1 | 市价委托 |
| 2 | 限价委托 |
| 3 | 本方最优 |
| 4 | 增加订单 |
| 5 | 删除订单 |
交易状态
| 字典项 | 说明 |
|---|---|
| "START" | 市场启动(初始化之后,集合竞价前) |
| "PRETR" | 盘前 |
| "OCALL" | 开始集合竞价 |
| "TRADE" | 交易(连续撮合) |
| "HALT" | 暂停交易 |
| "SUSP" | 停牌 |
| "BREAK" | 休市 |
| "POSTR" | 盘后 |
| "ENDTR" | 交易结束 |
| "STOPT" | 长期停牌,停牌n天,n>=1 |
| "DELISTED" | 退市 |
| "POSMT" | 盘后交易 |
| "PCALL" | 盘后集合竞价 |
| "INIT" | 盘后固定价格启动前 |
| "ENDPT" | 盘后固定价格闭市阶段 |
| "POSSP" | 盘后固定价格停牌 |
成交标记
| 字典项 | 说明 |
|---|---|
| 0 | 普通成交 |
| 1 | 撤单成交 |
逐笔成交序号标识
| 字典项 | 说明 |
|---|---|
| 0 | 盘中 |
| 1 | 盘后 |
委托方向
| 字典项 | 说明 |
|---|---|
| "1" | 买 |
| "2" | 卖 |
现金替代标志
| 字典项 | 说明 |
|---|---|
| "0" | 禁止替代 |
| "1" | 允许替代 |
| "2" | 必须替代 |
| "3" | 非沪市退补现金替代 |
| "4" | 非沪市必须现金替代 |
| "5" | 非沪深退补现金替代 |
| "6" | 非沪深必须现金替代 |
交易市场类别
| 字典项 | 说明 |
|---|---|
| "0" | 资金 |
| "1" | 上海 |
| "2" | 深圳 |
| "9" | 北交所 |
| "A" | 特转B |
| "D" | 沪B |
| "G" | 沪港通 |
| "H" | 深B |
| "Q" | 青岛产权 |
| "S" | 深港通 |
| "T" | 场外OTC市场 |
| "U" | 转融通 |
| "J" | 金华基金 |
| "K" | 香港市场 |
| "X" | 固定收益 |
| "F1" | 郑州交易所 |
| "F2" | 大连交易所 |
| "F3" | 上海交易所 |
| "F4" | 金融交易所 |
| "F5" | 能源交易所 |
| "Z1" | 业务受理 |
| "R" | H股全流通 |
退市标志
| 字典项 | 说明 |
|---|---|
| "0" | 正常 |
| "1" | 退市 |
投机套保类型
| 字典项 | 说明 |
|---|---|
| "0" | 投机 |
| "1" | 套保 |
| "2" | 套利 |
| "3" | 做市商 |
市价委托类型
| 字典项 | 说明 |
|---|---|
| 0 | 对手方最优价格 |
| 1 | 最优五档即时成交剩余转限价 |
| 2 | 本方最优价格 |
| 3 | 即时成交剩余撤销 |
| 4 | 最优五档即时成交剩余撤销 |
| 5 | 全额成交或撤单 |
申购代码所属市场
| 字典项 | 说明 |
|---|---|
| 0 | 上证普通代码 |
| 1 | 上证科创板代码 |
| 2 | 深证普通代码 |
| 3 | 深证创业板代码 |
| 4 | 可转债代码 |
两融头寸性质
| 字典项 | 说明 |
|---|---|
| 0 | 核心头寸 |
| 1 | 普通业务头寸 |
| 2 | 专项业务头寸 |
合约类别
| 字典项 | 说明 |
|---|---|
| "0" | 融资 |
| "1" | 融券 |
| "2" | 其它负债 |
合约类型
| 字典项 | 说明 |
|---|---|
| "0" | 开仓未归还 |
| "1" | 部分归还 |
| "2" | 合约已过期 |
| "3" | 客户自行归还 |
| "4" | 手工了结 |
| "5" | 未形成负债 |
关联类型
| 字典项 | 说明 |
|---|---|
| 0 | A股 |
| 1 | B股 |
| 2 | H股 |
| 3 | 期货 |
| 4 | 期权 |
| 5 | 港股-认购 |
| 6 | 港股-认沽 |
| 7 | 港股-牛证 |
| 8 | 港股-熊证 |
| 9 | 港股-界内证 |
| 10 | 英股关联关系 |
| 11 | 美股关联代码 |
| 12 | 股本认股权证认购证 |
| 13 | 股本认股权证认沽证 |
| 14 | 可转债关联关系正向-正股关联可转债 |
| 15 | 可转债关联关系反向-可转债关联正股 |
成交类型
| 字典项 | 说明 |
|---|---|
| "0" | 买卖 |
| "1" | 查询 |
| "2" | 撤单 |
| "6" | 融资 |
| "7" | 融券 |
| "8" | 平仓 |
| "9" | 信用 |
| "G" | 期权强制平仓 |
成交状态
| 字典项 | 说明 |
|---|---|
| "0" | 成交 |
| "2" | 废单 |
| "4" | 确认 |