Skip to content

策略运行时对象

全局对象

g-全局对象

g 是策略运行时的全局对象。

举例

python
g.security = 'sz000001'

上下文对象

context-上下文对象

context 是策略运行时的上下文对象,用于在回测、仿真、实盘过程中,向策略函数提供当前时间、上一交易日、账号信息、运行参数、股票池等核心状态信息。

属性

字段名字段类型说明适用范围
portfolioPortfolio总账号(Portfolio 对象)。包含资金、持仓、收益等信息。回测、仿真、实盘
run_paramsRun_params运行参数对象(Run_params)。包含回测起止日期、运行频率、回测类型等信息。回测、仿真、实盘
universetuple[str]股票池,由 set_universe 设置。类型为 tuple(如:('sz000001','sh600000'))。回测、仿真、实盘、扩展指标、因子均可使用。
previous_datedatetime.date上一个交易日(datetime.date 对象)。用于避免未来数据,适合读取上一交易日行情。回测、仿真、实盘、扩展指标、因子均可使用。
current_dtdatetime.datetime策略运行时的当前时间(datetime.datetime 对象)。日频回测中,handle_data 阶段通常为当日 09:30。回测、仿真、实盘、扩展指标、因子均可使用。

举例

python
log.info('上个交易日为', context.previous_date)   
# 输出: 上个交易日为2025-06-01
log.info('当前时间为', context.current_dt)         
# 输出:当前时间为2025-06-02 09:30:00
log.info('股票池为', context.universe)             
# 输出:股票池为('sz000001','sh600000')

账号对象

Portfolio -账号对象(总账号)

Portfolio 是策略运行时的账号对象,向策略函数提供可用资金、持仓明细、资产总值及累计收益等核心财务状态信息。可在回测、仿真、实盘中通过 context.portfolio 获取。

属性

字段名字段类型说明
inout_cashfloat出入金(累计资金注入/抽取)。
available_cashfloat可用资金。
locked_cashfloat冻结资金。
调试示例:0.0
marginfloat保证金(若启用融资融券/期货等可能使用)。
positionsdict[str, Position]持仓字典:{security: Position对象}。
long_positionsdict[str, Position]持多仓字典:{security: Position对象}。
short_positionsdict[str, Position]持空仓字典:{security: Position对象}。
total_valuefloat总资产(资金余额 + 当前持仓市值)。
positions_valuefloat持仓市值(所有持仓 value 之和)。
returnsfloat总权益的累计收益,(当前总资产 + 今日出入金 - 昨日总资产) / 昨日总资产。
starting_cashfloat初始资金。

举例

python
def handle_data(context, data):
    stock = 'sz000001'
    amount = 100

    # 买入:正数
    order(stock, amount)

    # 卖出:负数(示例:卖出 100 股)
    # order(stock, -amount)

    log.info('最新可用资金为', context.portfolio.available_cash)
    # 输出: 最新可用资金为 998957.0

    log.info('当前总资产为', context.portfolio.total_value)
    # 输出: 当前总资产为 999995.0

    log.info('当前持仓市值为', context.portfolio.positions_value)
    # 输出: 当前持仓市值为 1038.0

运行参数对象

Run_params -运行参数对象

可在回测、仿真、实盘中通过 context.run_params 获取。

属性

字段名字段类型说明
typestr运行类型。
frequencystr运行频率。
start_datedatetime.date开始日期。
end_datedatetime.date结束日期。

举例

python
def initialize(context):
    rp = context.run_params

    log.info('回测类型:', rp.type)
    # 输出: 回测类型: backtest

    log.info('运行频率:', rp.frequency)
    # 输出: 运行频率: minute

    log.info('开始日期:', rp.start_date)
    # 输出: 开始日期: 2025-01-02

    log.info('结束日期:', rp.end_date)
    # 输出: 结束日期: 2025-01-03

持仓对象

Position -持仓对象

Position用于在交易过程中向策略函数提供特定证券的成本价格、持仓规模、可平仓份额及头寸方向等底层明细信息,通过 context.portfolio.positions[security]、context.portfolio.long_positions[security] 或 context.portfolio.short_positions[security] 获取。

⚠️ 必须使用文档指定的方式访问 Position

  • 获取方式:必须通过 context.portfolio.positions[security]context.portfolio.long_positions[security]context.portfolio.short_positions[security] 获取
  • 属性访问:只能使用文档列出的属性字段(如 security, price, avg_cost, total_amount, closeable_amount 等),不要访问未定义的字段
  • 判空处理:建议先用 .get(security) 判断是否存在,避免 KeyError

属性

字段名字段类型说明
securitystr标的代码,如:sz000001
pricefloat最新行情价格(用于计算持仓市值、浮动盈亏等)。
acc_avg_costfloat累计持仓成本(清仓/减仓时也会更新)。
该持仓累积收益都会用于计算成本(初始 acc_avg_cost=0 且 amount=0)。

加仓更新:
new_acc_avg_cost = (acc_avg_cost * amount + trade_value + commission) / (amount + trade_amount)
减仓更新:
new_acc_avg_cost = (acc_avg_cost * amount - trade_value + commission) / (amount - trade_amount)
说明:commission 为本次买入/卖出的手续费;trade_value = trade_price * trade_amount。
avg_costfloat当前持仓成本(仅开仓/加仓时更新;卖出时 avg_cost 不变)。
该值通常用于计算浮动盈亏。

开仓/加仓更新:
new_avg_cost = (position_value + trade_value + commission) / (position_amount + trade_amount)
hold_costfloat当日持仓成本(用于日内成本口径)。

当日无收益: 清算后 hold_cost = 前收价
加仓:
hold_cost = (hold_cost * amount + trade_value) / (amount + trade_amount)
减仓:
hold_cost = (hold_cost * amount - trade_value) / (amount - trade_amount)
其中 trade_value = trade_price * trade_amount。
locked_amountfloat / int挂单冻结仓位(下单未成交冻结的数量)。
total_amountfloat / int总仓位(不包含挂单冻结仓位)。
如需获取"当前占用仓位",通常应:total_amount + locked_amount。
closeable_amountfloat / int可卖出的仓位(可用数量)。
today_amountfloat / int今天开的仓位数量。
valuefloat标的价值(持仓市值)。
计算方法:value = price * total_amount * multiplier
其中:股票/基金 multiplier=1;期货 multiplier=合约乘数。
sidestr多/空方向:'long' 或 'short'。

举例

python
pos = context.portfolio.positions.get('sz000001')
if pos:
    log.info('标的:', pos.security)
    # 输出: 标的: sz000001

    log.info('最新价:', pos.price)
    # 输出: 最新价: 10.38

    log.info('当前成本:', pos.avg_cost)
    # 输出: 当前成本: 10.38

    log.info('总仓位:', pos.total_amount)
    # 输出: 总仓位: 100

    log.info('可卖数量:', pos.closeable_amount)
    # 输出: 可卖数量: 0

    log.info('持仓市值:', pos.value)
    # 输出: 持仓市值: 1038.0

    log.info('方向:', pos.side)
    # 输出: 方向: long

订单对象

Order - 订单对象

Order 表示一次下单请求及其状态信息。包含订单ID、下单标的、数量、状态、成交情况、交易费用等信息。通常由下单函数(order/order_target等)返回,或通过 get_orders() 查询获取。

属性

字段名字段类型说明
order_idstr订单ID,唯一标识符
statusint订单状态,一个 OrderStatus 值(见 OrderStatus 枚举)
add_timedatetime.datetime订单添加时间
securitystr标的代码
amountint下单数量,不管是买还是卖,都是正数
filledint已经成交的股票数量,正数
sidestr多/空方向,'long' / 'short'
actionstr开/平,'open' / 'close'
pricefloat平均成交价格,已经成交的股票的平均成交价格(一个订单可能分多次成交)
commissionfloat交易费用(佣金、税费等)
styleOrderStyle订单类型对象(LimitOrderStyle 或 MarketOrderStyle)
profitfloat平仓盈亏

举例

python
oid = order('sz000001', 87500)
log.info(get_orders(oid))
# 输出:
# UserOrder({'order_id':'ZLT-0000000--sz000001','status':9,'add_time':'2024-09-25 09:30:00',
#        'security':'sz000001','amount':87500,'filled':87500,'side':'long','action':'open',
#        'price':10.63,'commission':279.04,'style':MarketOrderStyle:_limit_price=0.0,'profit':0.0})

成交记录对象

Trade-成交记录对象

Trade 表示订单的一次成交记录;一个订单可能会发生多次成交(部分成交/分笔成交),因此一个 order 可能对应多个 Trade。

属性

字段名字段类型说明
timedatetime.datetime交易时间(datetime.datetime 对象)
securitystr标的代码
amountint | float交易数量
pricefloat交易价格
trade_idstr交易记录 id
order_idstr对应的 order_id

返回值

返回值类型说明
Trade成交记录对象(Trade)。通常由订单成交回报、查询接口等返回。
dict[str, Trade]多笔成交记录时,可能以字典形式返回:key 为标识(如交易/订单键),value 为 Trade 对象。

举例

python
oid = order('sz000001', 87500)
log.info(get_trades())
# 输出:
# Trade({'trade_id': 'ZLT-0000000--sz000001-1', 'order_id': 'ZLT-0000000--sz000001',
#        'time': '2024-09-25 09:30:00', 'amount': 87500, 'price': 10.63})

订单状态

OrderStatus-订单状态枚举

OrderStatus 用于表示订单当前所处的状态(如:待申报、已申报、撤单、成交等)。通常在订单对象(Order)或订单查询接口的返回结果中出现,用于判断订单生命周期阶段并做相应处理。

取值

python
class OrderStatus():
    # 待申报
    prepare = 1
    # 已申报
    already = 2
    # 废单
    cancel = 3
    # 送转股
    share = 4
    # 未成交
    unfilled = 5
    # 部分成交
    partially_filled = 6
    # 部成部撤
    partially_cancelled = 7
    # 全部撤单
    cancelled = 8
    # 全部成交
    filled = 9

返回值

返回值类型说明
int订单状态码,对应 OrderStatus 中的取值(1~9)。

状态码

状态码状态字段中文含义
1prepare待申报
2already已申报
3cancel废单
4share送转股
5unfilled未成交
6partially_filled部分成交
7partially_cancelled部成部撤
8cancelled全部撤单
9filled全部成交

举例

python
status = order.status
log.info(status)
# 输出:6
# (示例:当订单状态为“部分成交”时)

订单类型

OrderStyle-订单类型对象

OrderStyle 用于描述下单方式(如:限价单、市价单)。通常作为下单函数(如 order / order_target 等)的参数传入,用于控制成交价格的约束方式。

类型

python
# 限价单
class LimitOrderStyle(OrderStyle):
    def __init__(self, limit_price):
        self.limit_price = limit_price

# 市价单:交易科创板时,limit_price 为保护限价
class MarketOrderStyle(OrderStyle):
    def __init__(self, limit_price):
        self.limit_price = limit_price

参数

类型构造参数参数类型说明
LimitOrderStylelimit_pricefloat限价单价格(以该价格或更优价格成交)
MarketOrderStylelimit_pricefloat市价单保护限价(普通标的可理解为保护价;交易科创板时该值为保护限价)

返回值

返回值类型说明
OrderStyle下单方式对象(通常传入下单接口,不单独作为结果返回)

行情切片对象

Bar-行情切片对象

Bar 表示当前单位时间(如:当日/当前分钟)的行情信息,用于读取最新价、涨跌停价、是否停牌、昨收、今开等。

属性

字段名字段类型说明
last_pricefloat最新价
high_limitfloat涨停价
low_limitfloat跌停价
pausedbool是否停牌或暂停交易;当停牌、未上市或退市后返回 True
is_stbool是否 ST(包含 st、*st);是返回 True,否则 False
pre_closefloat昨收
day_openfloat当天开盘价
namestr股票当前名称;可用于判断当天是否 ST/*ST,是否快要退市等
iopvfloat基金份额参考净值(仅适用于基金)

返回值

返回值类型说明
Bar行情切片对象(通常由行情接口返回,如 get_current_data 等)
dict[str, Bar]多标的返回字典:key 为证券代码(str),value 为 Bar 对象

举例

python
bar = get_current_data()['sz000001']
log.info(bar.last_price, bar.high_limit, bar.low_limit, bar.paused)

# 输出示例:
# 10.63 11.69 9.57 False

逐笔快照

Tick-逐笔快照对象

Tick 表示 tick 事件发生时盘面的一个快照(一条 tick 所包含的信息)。 注:tick对象在回测的时候没有数据,返回类型是bar,只有仿真才有推送。

属性

字段名字段类型说明
securitystr标的代码
datetimedatetime.datetimetick 发生的时间
currentfloat最新价
openfloat当日开盘价
highfloat截至当前时刻的最高价
lowfloat截至当前时刻的最低价
volumefloat截至当前时刻的成交量
moneyfloat截至当前时刻的成交额
a1_v ~ a5_vfloat卖一量 ~ 卖五量(期货一般仅有卖一量)
a1_p ~ a5_pfloat卖一价 ~ 卖五价(期货一般仅有卖一价)
b1_v ~ b5_vfloat买一量 ~ 买五量(期货一般仅有买一量)
b1_p ~ b5_pfloat买一价 ~ 买五价(期货一般仅有买一价)

返回值

返回值类型说明
Tick逐笔快照对象(Tick)
dict[str, Tick]多标的返回字典:key 为证券代码(str),value 为 Tick 对象