Skip to content

策略运行时对象

上下文对象

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
print('上个交易日为', context.previous_date)   
# 输出: 上个交易日为2025-06-01
print('当前时间为', context.current_dt)         
# 输出:当前时间为2025-06-02 09:30:00
print('股票池为', context.universe)             
# 输出:股票池为('sz000001','sh600000')

账户对象

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)

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

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

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

运行参数对象

Run_params -运行参数对象

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

属性

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

说明

  • 实测: Run_params 对象可见字段仅包含 type/frequency/start_date/end_date
  • 若后续版本扩展了 benchmark、commission、slippage 等字段,可在此表中追加。

举例

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

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

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

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

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

持仓对象

Position -持仓对象

通过 context.portfolio.positions[security]、context.portfolio.long_positions[security] 或 context.portfolio.short_positions[security] 获取。

属性

字段名字段类型说明
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:
    print('标的:', pos.security)
    # 输出: 标的: sz000001

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

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

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

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

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

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

成交记录对象

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
trade = Trade({
    'trade_id': 'ZLT-0000000--sz000001-1',
    'order_id': 'ZLT-0000000--sz000001',
    'time': '2024-09-25 09:30:00',
    'amount': 87500,
    'price': 10.63
})
print(trade)
# 输出:
# 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
print(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']
print(bar.last_price, bar.high_limit, bar.low_limit, bar.paused)

# 输出示例:
# 10.63 11.69 9.57 False

逐笔快照

Tick-逐笔快照对象

Tick 表示 tick 事件发生时盘面的一个快照(一条 tick 所包含的信息)。

属性

字段名字段类型说明
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 对象

文档版本: 1.0.0 | 发布于 2025-01-29