跳转到内容

策略引擎简介

业务流程框架

  • PTrade量化引擎以事件触发为基础,通过初始化事件initialize、盘前事件before_trading_start、盘中事件handle_data、盘后事件after_trading_end来完成每个交易日的策略任务。
  • initializehandle_data是一个允许运行策略的最基础结构,也就是必选项,before_trading_startafter_trading_end是可以按需运行的。
  • handle_data仅满足日线和分钟级别的盘中处理,tick级别的盘中处理则需要通过tick_data或者run_interval来实现。
  • PTrade还支持委托主推事件on_order_response、交易主推事件on_trade_response,可以通过委托和成交的信息来处理策略逻辑,是tick级的一个补充。
  • 除了以上的一些事件以外,PTrade支持通过定时任务来运行策略逻辑,通过run_daily接口实现。

initialize

python
initialize(context):
    pass

该函数用于初始化一些全局变量,是策略运行的唯二必须定义的函数之一

注意事项

该函数只会在每次回测或交易启动的时候运行一次

使用场景

❌研究 ✅回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

示例

python
def initialize(context):
    #g为全局对象
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    order('600570.SS', 100)

before_trading_start

python
before_trading_start(context, data):
    pass

该函数用于添加每天盘前的处理逻辑,如无盘前初始化需求,该函数可以在策略中不做定义。

注意事项

  1. 在回测中,该函数在每个回测交易日 8:30 分执行。
  2. 在交易中,该函数在开启交易时立即执行,从隔日开始每天 9:10 分(默认)执行。
  3. 当在 9:10 前开启交易时,受行情未更新原因在该函数内调用实时行情接口会导致数据有误。可通过在该函数内 sleep 至 9:10 分或调用实时行情接口改为run_daily执行等方式进行避免。

使用场景

❌研究 ✅回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

data

保留字段暂无数据

示例

python
def initialize(context):
    #g为全局变量
    g.security = '600570.SS'
    set_universe(g.security)

def before_trading_start(context, data):
    log.info(g.security)

def handle_data(context, data):
    order('600570.SS',100)

handle_data

python
handle_data(context, data):
    pass

该函数在交易时间内按指定的周期频率运行,是用于处理策略交易的主要模块,根据策略保存时的周期参数分为每分钟运行和每天运行,是策略运行唯二必须定义的函数之一。

注意事项

  1. 该函数每个单位周期执行一次
  2. 如果是日线级别策略,每天执行一次。股票回测场景下,在 15:00 执行;股票交易场景下,执行时间为券商实际配置时间。
  3. 如果是分钟级别策略,每分钟执行一次,股票回测场景下,执行时间为 9:31-15:00,股票交易场景下,执行时间为 9:30-14:59。
  4. 回测与交易中,handle_data 函数不会在非交易日触发(如回测或交易起始日期为2015年12月21日,则策略在2016年1月1日-3日时,handle_data不会运行,4日继续运行)。

使用场景

❌研究 ✅回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

data

  • 类型: dict[str, BarData]

一个字典,key是标的代码,value是当时的BarData对象,存放当前周期(日线策略,则是当天;分钟策略,则是这一分钟)的行情数据;

说明

为了加速,data中的数据只包含股票池中所订阅标的的信息,可使用data[security]的方式来获取当前周期对应的标的信息;

示例

python
def initialize(context):
    #g为全局变量
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    order('600570.SS', 100)

after_trading_end

python
after_trading_end(context, data):
    pass

该函数会在每天交易结束之后调用,用于处理每天收盘后的操作,如无盘后处理需求,该函数可以在策略中不做定义。

注意事项

  1. 该函数只会在每天盘后执行一次
  2. 该函数执行时间为由券商配置决定,一般为 15:30。

使用场景

❌研究 ✅回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

data

保留字段暂无数据

示例

python
def initialize(context):
    #g为全局变量
    g.security = '600570.SS'
    set_universe(g.security)

def handle_data(context, data):
    order('600570.SS',100)

def after_trading_end(context, data):
    log.info(g.security)

tick_data

python
tick_data(context, data):
    pass

该函数可以用于处理 tick 级别策略的交易逻辑,每隔 3 秒执行一次,如无 tick 处理需求,该函数可以在策略中不做定义。

注意事项

  1. 该函数执行时间为 9:30-14:59。
  2. 该函数中的datahandle_data函数中的data是不一样的,请勿混淆。
  3. 参数data中包含的逐笔委托,逐笔成交数据需开通 level2 行情才能获取到数据,否则对应数据返回 None。
  4. 参数data中的 tick 数据取自get_snapshot并转换为 DataFrame 格式,如要更快速的获取快照强烈建议直接使用get_snapshot获取。
  5. 当调用set_parameters并设置tick_data_no_l2="1"时,参数data中将不包含逐笔委托、逐笔成交字段,当券商有 l2 行情时配置该参数可提升 data 取速;
  6. 当策略执行时间超过 3s 时,将会丢弃中间堵塞的 tick_data。
  7. 在收盘后,将会清空队列中未执行的 tick_data。
  8. 参数 data 中包含的逐笔委托,逐笔成交数据正常返回 DataFrame 格式,异常时返回 None。

使用场景

❌研究 ❌回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

data

  • 类型:dict[str, dict]

一个字典,key 为对应的标的代码(如:'600570.SS'),value 为一个字典对象,包含 tick(实时行情快照)、order(最近一条逐笔委托)、transcation(最近一条逐笔成交)三项

数据示例

python
{
    '600570.SS': {
        'tick': DataFrame,
        'order': DataFrame | None,
        'transcation': DataFrame | None,
    }
}

tick(实时行情快照)

字段名类型说明
last_pxfloat最新成交价
open_pxfloat今开盘价
high_pxfloat最高价
low_pxfloat最低价
close_pxfloat今日收盘
preclose_pxfloat昨收价
up_pxfloat涨停价格
down_pxfloat跌停价格
avg_pxfloat均价
wavg_pxfloat加权平均价
business_amountint成交数量
business_amount_inint内盘成交量
business_amount_outint外盘成交量
business_balancefloat成交金额
business_countint成交笔数
current_amountint最近成交量(现手)
pe_ratefloat动态市盈率
pb_ratefloat市净率
px_change_ratefloat涨跌幅
turnover_ratiofloat换手率
vol_ratiofloat量比
entrust_difffloat委差
entrust_ratefloat委比
hsTimeStampstr时间戳(YYYYMMDDHHMISS格式)
trade_minsint交易时间(距开盘分钟数)
issue_dateint上市日期(YYYYMMDD格式)
start_trade_dateint首个交易日(YYYYMMDD格式)
end_trade_dateint最后交易日(YYYYMMDD格式)
bid_grpdict[int, list]买档位数据
offer_grpdict[int, list]卖档位数据
total_bidqtyint委买量
total_offerqtyint委卖量
total_bid_turnoverfloat委买金额
total_offer_turnoverfloat委卖金额
circulation_amountflat流通股本
tick_sizefloat最小报价单位
amountfloat持仓量,期货专用,股票返回0.0
settlementfloat结算价,期货专用,股票返回0.0
prev_settlementfloat昨结算,期货专用,股票返回0.0
trade_statusstr交易状态

档位数据格式

{1: [42.71, 200, 0], 2: [42.74, 200, 0], ...},其中每个档位包含:[委托价格, 委托数量, 委托笔数]

order(逐笔委托)

字段名类型说明
business_timeint时间戳毫秒级
hq_pxfloat价格
business_amountint委托量
order_nostr委托编号
business_directionint成交方向
trans_kindint委托类别

transcation(逐笔成交)

字段名类型说明
business_timeint时间戳毫秒级
hq_pxfloat价格
business_amountint成交量
trade_indexstr成交编号
business_directionint成交方向
buy_nostr叫买方编号
sell_nostr叫卖方编号
trans_flagint成交标记
trans_identify_amint盘后逐笔成交序号标识
channel_numint成交通道信息

示例

python
def initialize(context):
    g.security = '600570.SS'
    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):
    pass

on_order_response

python
on_order_response(context, order_list):
    pass

该函数会在引擎收到委托主推时回调,比通过get_orderget_orders等接口更新订单委托状态的速度更快,适合对速度要求比较高的策略。

注意事项

  1. 目前可接收股票、可转债、ETF、LOF、期货代码的主推数据。
  2. 当接到策略外交易产生的主推时(需券商配置默认不推送):由于没有对应的Order对象,主推信息中order_id字段赋值为"";主推信息中entrust_reference字段赋值为""
  3. 当接到策略外交易产生的主推时(需券商配置默认不推送),由于没有对应的Order对象,主推信息中order_id字段赋值为""。
  4. 当在主推里调用委托接口时,需要进行判断处理避免无限迭代循环问题。
  5. 当券商配置接收策略外交易产生的主推且策略调用set_parameters并设置receive_other_response="1"时,策略中将接收非本交易产生的主推。
  6. 当策略调用set_parameters并设置receive_cancel_response="1",策略接收到撤单成交主推时,主推信息中的order_id为买入或卖出委托Order对象的订单编号,entrust_no为撤单委托的委托编号。
  7. 撤单委托主推信息中成交数量均处理为正数。

使用场景

❌研究 ❌回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

order_list

  • 类型:list

当委托订单状态发生变化时,返回发生变化的委托订单列表。每条订单包含的字段如下:

字段名类型说明
order_idstr订单编号
entrust_nostr委托编号
order_timestr委托时间
stock_codestr证券代码
amountint委托数量
pricefloat委托价格
business_amountfloat成交数量
statusstr委托状态
entrust_typestr委托类别
entrust_propstr委托属性
error_infostr错误信息

数据样例

python
[
    # 本交易委托产生的主推:
    {
        'order_id': 'e71d1684c8a74b4ca00b3326c9eb8614',
        'entrust_no': '700006',
        'order_time': '2022-05-10 15:52:10.780',
        'stock_code': '600570.SS',
        'amount': 200,
        'price': 36.95,
        'business_amount': 0.0,
        'status': '2',
        'entrust_type': '0',
        'entrust_prop': '0',
        'error_info': ''
    },
    # 非本交易委托产生的主推:
    {
        'order_id': '',
        'entrust_no': '700008',
        'order_time': '2022-05-10 15:54:30.204',
        'stock_code': '600570.SS',
        'amount': 200,
        'price': 36.95,
        'business_amount': 0.0,
        'status': '2',
        'entrust_type': '0',
        'entrust_prop': '0',
        'error_info': ''
    },
    # 本交易撤单产生的主推:
    {
        'order_id': '0e27467920464390aa10a7a53da4d49a',
        'entrust_no': '700007',
        'order_time': '2022-05-10 15:52:10.780',
        'stock_code': '600570.SS',
        'amount': 200,
        'price': 36.95,
        'business_amount': 0.0,
        'status': '2',
        'entrust_type': '2',
        'entrust_prop': '0',
        'error_info': ''
    },
    # 非本交易撤单产生的主推:
    {
        'order_id': '',
        'entrust_no': '700009',
        'order_time': '2022-05-10 15:54:30.204',
        'stock_code': '600570.SS',
        'amount': 200,
        'price': 36.95,
        'business_amount': 0.0,
        'status': '2',
        'entrust_type': '2',
        'entrust_prop': '0',
        'error_info': ''
    }
]

示例

python
def initialize(context):
    g.security = ['600570.SS','002416.SZ']
    set_universe(g.security)
    g.flag = 0

def on_order_response(context, order_list):
    log.info(order_list)
    if (g.flag == 0):
        order('600570.SS', 100)
        g.flag = 1
    else:
        log.info("end")

def handle_data(context, data):
    order('600570.SS', 100)

on_trade_response

python
on_trade_response(context, trade_list):
    pass

该函数会在引擎收到委托主推时回调,比通过get_trades接口更新Order状态的速度更快,适合对速度要求比较高的策略。

注意事项

  1. 目前可接收股票、可转债、ETF、LOF、期货代码的主推数据。
  2. 当接到策略外交易产生的主推时(需券商配置默认不推送):由于没有对应的Order对象,主推信息中order_id字段赋值为"";主推信息中entrust_reference字段赋值为""。
  3. 当接到策略外交易产生的主推时(需券商配置默认不推送),由于没有对应的Order对象,主推信息中order_id字段赋值为""。
  4. 当在主推里调用委托接口时,需要进行判断处理避免无限迭代循环问题。
  5. 当券商配置接收策略外交易产生的主推且策略调用set_parameters并设置receive_other_response="1"时,策略中将接收非本交易产生的主推。
  6. 当策略调用set_parameters并设置receive_cancel_response="1",策略接收到撤单成交主推时,主推信息中的order_id为买入或卖出委托Order对象的订单编号,entrust_no为撤单委托的委托编号。
  7. 撤单成交主推信息中成交数量均处理为正数。
  8. withdraw_no(撤单原委托号)仅在撤单成交主推信息中才有对应值,在委托成交主推中该字段赋'0'默认值。
  9. 撤单成交主推信息中entrust_no在异构柜台情况下与withdraw_no一致,因此策略中请勿将该字段作为撤单成交主推信息的关联字段。

使用场景

❌研究 ❌回测 ✅交易

参数

context

策略上下文,存放有当前的账户及持仓等信息

trade_list

  • 类型: list

当委托成交状态发生变化时,返回发生变化的成交列表。每条成交包含的字段如下:

字段名类型说明
order_idstr订单编号
entrust_nostr委托编号
business_timestr成交时间
stock_codestr证券代码
entrust_bsstr委托方向
business_amountfloat成交数量
business_pricefloat成交价格
business_idstr成交编号
statusstr委托状态
cancel_infostr废单原因
withdraw_nostr撤单原委托编号
real_typestr成交类型
real_statusstr成交状态

使用说明

  • 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.SS',
        'entrust_bs': '1',
        'business_time': '2022-05-10 15:51:47',
        'real_type': '0',
        'real_status': '0'
    },
    # 非本交易委托产生的主推
    {
        'status': '8',
        'business_id': 'b155235000000003',
        'business_amount': 200,
        'order_id': '',
        'entrust_no': '700007',
        'business_balance': 3000.0,
        'business_price': 15.0,
        'stock_code': '000001.SZ',
        'entrust_bs': '1',
        'business_time': '2022-05-10 15:52:35',
        'real_type': '0',
        'real_status': '0'
    },
    # 本交易撤单产生的主推:
    {
        '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.SS',
        'entrust_bs': '1',
        'business_time': '2022-05-10 15:51:47',
        'real_type': '2',
        'real_status': '0'
    },
    # 非本交易撤单产生的主推
    {
        '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.SZ',
        'entrust_bs': '1',
        'business_time': '2022-05-10 15:52:35',
        'real_type': '2',
        'real_status': '0'
    }
]

示例

python
def initialize(context):
    g.security = ['600570.SS','002416.SZ']
    set_universe(g.security)
    g.flag = 0

def on_trade_response(context, trade_list):
    log.info(trade_list)
    if(g.flag==0):
        order('600570.SS', 100)
        g.flag = 1
    else:
        log.info("end")

def handle_data(context, data):
    order('600570.SS', 100)

内置对象

g

python
g.security = None #股票池

全局对象,用于存储用户策略自定义的全局数据,在整个策略中都可以访问

使用场景

❌研究 ✅回测 ✅交易

示例

python
def initialize(context):
    g.security = "600570.SS"
    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_basefloat起始资金
previous_datedatetime前一个交易日
sim_paramsSimulationParameters模拟参数对象
slippageVolumeShareSlippage滑点参数对象
commissionCommission佣金参数对象
blotterBlotter订单信息组合
portfolioPortfolio账户信息对象
initializedbool是否执行初始化
recorded_varsdict收益曲线值

数据示例

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.SS': {
                'sid': '600570.SS',
                '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_startdatetime开始时间
period_enddatetime结束时间
capital_basefloat起始资金
data_frequencystr数据频率
emission_ratestr执行速率
first_opendatetime开市时间,第一个交易日的 9:31
last_closedatetime停市时间,最后一个交易日的 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_limitfloat成交限量
price_impactfloat价格影响力

数据示例

python
{
    'volume_limit': 0.25,
    'price_impact': 0.0
}

Commission

佣金参数对象

使用场景

❌研究 ✅回测 ❌交易

数据结构

字段名类型说明
taxfloat印花税
costfloat佣金费率
min_trade_costfloat最小佣金

数据示例

python
{
    'tax': 0.001,
    'cost': 0.0003,
    'min_trade_cost': 5.0
}

Blotter

订单信息组合

使用场景

❌研究 ✅回测 ✅交易

数据结构

字段名类型说明
orderslist[Order]全部交易订单
new_orderslist[Order]新生成的交易订单
open_orderslist[Order]未完成交易订单
current_dtdatetime当前单位时间的开始时间

数据示例

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

账户信息对象,包含账户当前的资金和仓位信息

注意事项

  1. 数据更新周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为before_trading_start-after_trading_end之间。
  2. 不同业务返回的字段存在差异,需要注意区分。

使用场景

❌研究 ✅回测 ✅交易

数据结构

股票账户

字段名类型说明
cashfloat当前可用资金(不包含冻结资金)
capital_usedfloat已使用资金
positionslist[Position]当前持有的标的
positions_valuefloat持仓价值
portfolio_valuefloat当前持有的标的和现金的总价值
start_datedatetime开始时间
returnsfloat当前的收益比例
pnlfloat浮动盈亏,即当前账户总资产-初始账户总资产

港股通账户

字段名类型说明
cashfloat当前可用资金(不包含冻结资金)
positionslist[Position]当前持有的标的
positions_valuefloat持仓价值
hks_positions_valuefloat港股通持仓价值
portfolio_valuefloat当前持有的标的和现金的总价值
start_datedatetime开始时间
returnsfloat当前的收益比例
pnlfloat浮动盈亏,即当前账户总资产-初始账户总资产

期货账户

字段名类型说明
cashfloat当前可用资金(不包含冻结资金)
marginfloat持仓保证金
positionsdict[str, Position]当前持有的标的
positions_valuefloat持仓价值
portfolio_valuefloat当前持仓保证金和现金的总价值
start_datedatetime开始时间
returnsfloat当前的收益比例
pnlfloat浮动盈亏,即当前账户总资产-初始账户总资产

数据示例

python
{
    'cash': 728.16,
    'capital_used': 99271.83,
    'positions': {
        '600570.SS': {
            'update_time': None,
            'cost_basis': 25.45,
            'business_type': 'stock',
            'enable_amount': 3900,
            'today_amount': 0,
            'last_sale_price': 26.3,
            'sid': '600570.SS',
            'amount': 3900,
        }
    },
    'positions_value': 102570.0,
    'portfolio_value': 103298.16,
    'start_date': datetime.date(2025, 1, 2),
    'returns': 0.032,
    'pnl': 3298.16,
}

Order

委托订单信息

注意事项

  1. 回测中entrust_nocancel_entrust_no字段值为 None。
  2. 交易中对象内的数据更新分为两种同时进行:
    • 定时更新,周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为before_trading_start-after_trading_end之间。
    • 主推事件更新,后台接收到主推数据时会更新对象内成交数量、委托状态、持仓成本价等信息。
  3. 交易中对原委托进行撤单时,cancel_entrust_no字段值填充撤单委托编号。
  4. 交易中期货(对接UFT柜台)对原委托进行撤单时,撤单委托编号等于原委托编号。
  5. 不同业务返回的字段存在差异,需要注意区分。

使用场景

❌研究 ✅回测 ✅交易

数据结构

股票账户

字段名类型说明
idstr订单编号
dtdatetime订单产生时间
priceGearint盘口标识 买1卖-1
limitfloat指定价格
symbolstr标的代码
amountint下单数量,买入是正数,卖出是负数
createddatetime订单生成时间
filledint成交数量,买入时为正数,卖出时为负数
statusstr委托状态
entrust_nostr委托编号
cancel_entrust_nostr撤单委托编号

期货账户

字段名类型说明
idstr订单编号
dtdatetime订单产生时间
priceGearint盘口标识 买1卖-1
limitfloat指定价格
symbolstr标的代码
amountint下单数量,买入是正数,卖出是负数
createddatetime订单生成时间
sidestr多空标志(long:多头,short:空头)
actionstr开平仓方向(open:开仓,close:平仓)
entrust_directionstr买卖方向(buy:买入,sell:卖出)
filledint成交数量,买入时为正数,卖出时为负数
statusstr委托状态
entrust_nostr委托编号
cancel_entrust_nostr撤单委托编号

数据示例

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

持有的某个标的的信息

注意事项

  1. 期货业务持仓把单个合约的持仓分为了多头仓(long)、空头仓(short)。
  2. 交易中对象内的数据更新周期默认为6s(具体配置需咨询所在券商),即上一次账户资金、委托、持仓查询并更新到对象中后,间隔6s发起下一次查询。数据更新时间范围为before_trading_start-after_trading_end之间。
  3. 交易场景下,持仓信息是每6秒与柜台同步后更新的,update_time字段记录了最近的更新时间,格式为:"%Y-%m-%d %H:%M:%S"。回测场景返回None。
  4. 不同业务返回的字段存在差异,需要注意区分。

使用场景

❌研究 ✅回测 ✅交易

数据结构

股票账户

字段名类型说明
sidstr标的代码
amountint持仓数量
enable_amountint可用数量
today_amountint今日买入数量
business_typestr持仓类型
last_sale_pricefloat最新价格
cost_basisfloat持仓成本
update_timestr更新时间

期货账户

字段名类型说明
sidstr标的代码
contract_multiplierint合约乘数
delivery_dateint交割日期
amountint持仓数量
long_amountint多头持仓数量
short_amountint空头持仓数量
enable_amountint可用数量
long_enable_amountint多头可用数量
short_enable_amountint空头可用数量
today_long_amountint多头今仓数量
today_short_amountint空头今仓数量
marginfloat持仓保证金
business_typestr持仓类型
last_sale_pricefloat最新价格
long_cost_basisfloat多头持仓成本
short_cost_basisfloat空头持仓成本
long_pnlfloat多头浮动盈亏
short_pnlfloat空头浮动盈亏
update_timestr更新时间

数据示例

python
{
    'sid': '600570.SS',
    '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线行情数据对象

注意事项

  1. preclosehigh_limitlow_limitunlimited在分钟频率中均填充为0.0。
  2. 当前周期内首次调用会在线获取该代码K线数据,当前周期重复调用时将会返回首次调用缓存的该代码K线数据。

使用场景

❌研究 ✅回测 ✅交易

数据结构

字段名类型说明
symbolstr标的代码
namestr代码名称
dtdatetime当前周期时间
is_openint停牌标志,0-停牌,1-非停牌
openfloat当前周期开盘价
closefloat当前周期收盘价
pricefloat当前周期最新价
lowfloat当前周期最低价
highfloat当前周期最高价
volume float当前周期成交量
money float当前周期成交额
preclose float昨收盘价(仅日线返回)
high_limit flot涨停价(仅日线返回)
low_limit float跌停价(仅日线返回)
unlimited bool是否无涨跌停限制(仅日线返回)
datetime datetime当前周期时间

示例

python
def initialize(context):
    g.security = "600570.SS"
    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"未形成负债

关联类型

字典项说明
0A股
1B股
2H股
3期货
4期权
5港股-认购
6港股-认沽
7港股-牛证
8港股-熊证
9港股-界内证
10英股关联关系
11美股关联代码
12股本认股权证认购证
13股本认股权证认沽证
14可转债关联关系正向-正股关联可转债
15可转债关联关系反向-可转债关联正股

成交类型

字典项说明
"0"买卖
"1"查询
"2"撤单
"6"融资
"7"融券
"8"平仓
"9"信用
"G"期权强制平仓

成交状态

字典项说明
"0"成交
"2"废单
"4"确认