Appearance
策略运行时对象
上下文对象
context-上下文对象
context 是策略运行时的上下文对象,用于在回测、仿真、实盘过程中,向策略函数提供当前时间、上一交易日、账户信息、运行参数、股票池等核心状态信息。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| portfolio | Portfolio | 总账户(Portfolio 对象)。包含资金、持仓、收益等信息。回测、仿真、实盘均可使用。 |
| run_params | Run_params | 运行参数对象(Run_params)。包含回测起止日期、运行频率、回测类型等信息。回测、仿真、实盘均可使用。 |
| universe | tuple[str] | 股票池,由 set_universe 设置。实际类型为 tuple(如:('sz000001','sh600000'))。回测、仿真、实盘、扩展指标、因子均可使用。 |
| previous_date | datetime.date | 上一个交易日(datetime.date 对象)。用于避免未来数据,适合读取上一交易日行情。回测、仿真、实盘、扩展指标、因子均可使用。 |
| current_dt | datetime.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_cash | float | 出入金(累计资金注入/抽取)。 |
| available_cash | float | 可用资金。 |
| locked_cash | float | 冻结资金。 调试示例:0.0 |
| margin | float | 保证金(若启用融资融券/期货等可能使用)。 |
| positions | dict[str, Position] | 持仓字典:{security: Position对象}。 |
| long_positions | dict[str, Position] | 持多仓字典:{security: Position对象}。 |
| short_positions | dict[str, Position] | 持空仓字典:{security: Position对象}。 |
| total_value | float | 总资产(资金余额 + 当前持仓市值)。 |
| positions_value | float | 持仓市值(所有持仓 value 之和)。 |
| returns | float | 总权益的累计收益,(当前总资产 + 今日出入金 - 昨日总资产) / 昨日总资产。 |
| starting_cash | float | 初始资金。 |
举例
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 获取。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| type | str | 运行类型。 |
| frequency | str | 运行频率。 |
| start_date | datetime.date | 开始日期。 |
| end_date | datetime.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] 获取。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| security | str | 标的代码,如:sz000001 |
| price | float | 最新行情价格(用于计算持仓市值、浮动盈亏等)。 |
| acc_avg_cost | float | 累计持仓成本(清仓/减仓时也会更新)。 该持仓累积收益都会用于计算成本(初始 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_cost | float | 当前持仓成本(仅开仓/加仓时更新;卖出时 avg_cost 不变)。 该值通常用于计算浮动盈亏。 开仓/加仓更新: new_avg_cost = (position_value + trade_value + commission) / (position_amount + trade_amount) |
| hold_cost | float | 当日持仓成本(用于日内成本口径)。 当日无收益: 清算后 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_amount | float / int | 挂单冻结仓位(下单未成交冻结的数量)。 |
| total_amount | float / int | 总仓位(不包含挂单冻结仓位)。 如需获取"当前占用仓位",通常应:total_amount + locked_amount。 |
| closeable_amount | float / int | 可卖出的仓位(可用数量)。 |
| today_amount | float / int | 今天开的仓位数量。 |
| value | float | 标的价值(持仓市值)。 计算方法:value = price * total_amount * multiplier 其中:股票/基金 multiplier=1;期货 multiplier=合约乘数。 |
| side | str | 多/空方向:'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。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| time | datetime.datetime | 交易时间(datetime.datetime 对象) |
| security | str | 标的代码 |
| amount | int | float | 交易数量 |
| price | float | 交易价格 |
| trade_id | str | 交易记录 id |
| order_id | str | 对应的 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)。 |
状态码
| 状态码 | 状态字段 | 中文含义 |
|---|---|---|
| 1 | prepare | 待申报 |
| 2 | already | 已申报 |
| 3 | cancel | 废单 |
| 4 | share | 送转股 |
| 5 | unfilled | 未成交 |
| 6 | partially_filled | 部分成交 |
| 7 | partially_cancelled | 部成部撤 |
| 8 | cancelled | 全部撤单 |
| 9 | filled | 全部成交 |
举例
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参数
| 类型 | 构造参数 | 参数类型 | 说明 |
|---|---|---|---|
| LimitOrderStyle | limit_price | float | 限价单价格(以该价格或更优价格成交) |
| MarketOrderStyle | limit_price | float | 市价单保护限价(普通标的可理解为保护价;交易科创板时该值为保护限价) |
返回值
| 返回值类型 | 说明 |
|---|---|
| OrderStyle | 下单方式对象(通常传入下单接口,不单独作为结果返回) |
行情切片对象
Bar-行情切片对象
Bar 表示当前单位时间(如:当日/当前分钟)的行情信息,用于读取最新价、涨跌停价、是否停牌、昨收、今开等。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| last_price | float | 最新价 |
| high_limit | float | 涨停价 |
| low_limit | float | 跌停价 |
| paused | bool | 是否停牌或暂停交易;当停牌、未上市或退市后返回 True |
| is_st | bool | 是否 ST(包含 st、*st);是返回 True,否则 False |
| pre_close | float | 昨收 |
| day_open | float | 当天开盘价 |
| name | str | 股票当前名称;可用于判断当天是否 ST/*ST,是否快要退市等 |
| iopv | float | 基金份额参考净值(仅适用于基金) |
返回值
| 返回值类型 | 说明 |
|---|---|
| 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 所包含的信息)。
属性
| 字段名 | 字段类型 | 说明 |
|---|---|---|
| security | str | 标的代码 |
| datetime | datetime.datetime | tick 发生的时间 |
| current | float | 最新价 |
| open | float | 当日开盘价 |
| high | float | 截至当前时刻的最高价 |
| low | float | 截至当前时刻的最低价 |
| volume | float | 截至当前时刻的成交量 |
| money | float | 截至当前时刻的成交额 |
| a1_v ~ a5_v | float | 卖一量 ~ 卖五量(期货一般仅有卖一量) |
| a1_p ~ a5_p | float | 卖一价 ~ 卖五价(期货一般仅有卖一价) |
| b1_v ~ b5_v | float | 买一量 ~ 买五量(期货一般仅有买一量) |
| b1_p ~ b5_p | float | 买一价 ~ 买五价(期货一般仅有买一价) |
返回值
| 返回值类型 | 说明 |
|---|---|
| Tick | 逐笔快照对象(Tick) |
| dict[str, Tick] | 多标的返回字典:key 为证券代码(str),value 为 Tick 对象 |