pybroker.context 模块
包含与上下文相关的类。上下文在 pybroker.strategy.Strategy 的执行过程中提供数据。
- class ExecContext(symbol: str, config: StrategyConfig, portfolio: Portfolio, col_scope: ColumnScope, ind_scope: IndicatorScope, interval_scope: IntervalScope, declared_intervals: frozenset[int | Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly'] | str], input_scope: ModelInputScope, pred_scope: PredictionScope, pending_order_scope: PendingOrderScope, models: Mapping[ModelSymbol, TrainedModel], sym_end_index: Mapping[str, int], session: MutableMapping, run_hyperparams: Mapping[str, Any] | None = None, allowed_hyperparam_names: frozenset[str] = frozenset({}), rotation_enabled: bool = False)[源代码]
基类:
object包含
pybroker.strategy.Strategy执行过程中的上下文数据。包括当前 K 线、投资组合头寸以及其他相关上下文的数据。该类也用于设置买入和卖出信号以下单。该类中包含的数据是已完成的最新一根 K 线的数据。下单会在由
pybroker.config.StrategyConfig.buy_delay和pybroker.config.StrategyConfig.sell_delay指定的未来某根 K 线上执行。- config
- symbol
该执行函数当前的股票代码。
- buy_fill_price
symbol买入(做多)订单使用的成交价格。
symbol要买入的股数。
- buy_limit_price
symbol买入(做多)订单使用的限价。
- buy_timeout_bars
未成交的买入限价单在首次尝试后重试的 K 线数量。
None表示仅尝试一次,-1表示无限期保留,正整数表示有限的重试 K 线数量。
- sell_fill_price
symbol卖出(做空)订单使用的成交价格。
symbol要卖出的股数。
- sell_limit_price
symbol卖出(做空)订单使用的限价。
- sell_timeout_bars
未成交的卖出限价单在首次尝试后重试的 K 线数量。
None表示仅尝试一次,-1表示无限期保留,正整数表示有限的重试 K 线数量。
- hold_bars
持有多头或空头仓位的 K 线数量,超过后该仓位会自动平仓。
- long_score
在对买入和回补信号进行排序时用于给
symbol打分。订单会为long_score值最高的品种下达,pybroker.portfolio.Portfolio中任一时刻持有的多头仓位数量由pybroker.strategy.Strategy.set_max_long_positions()指定。当通过pybroker.strategy.Strategy.enable_rotation()启用了轮动时,long_score会驱动多头轮动,而pybroker.strategy.Execution中设置的订单会被忽略。
- short_score
在对卖出信号进行排序时用于给
symbol打分。订单会为short_score值最高的品种下达,pybroker.portfolio.Portfolio中任一时刻持有的空头仓位数量由pybroker.strategy.Strategy.set_max_short_positions()指定。当通过pybroker.strategy.Strategy.enable_rotation()启用了轮动时,short_score会驱动空头轮动,而pybroker.strategy.Execution中设置的订单会被忽略。
- session
用于存储自定义数据的
dict,在pybroker.strategy.Strategy的执行过程中按每根 K 线持久化。
- stop_loss
在新的
pybroker.portfolio.Entry上设置止损,其值以距入场价格的点数衡量。
- stop_loss_pct
在新的
pybroker.portfolio.Entry上设置止损,其值以距入场价格的百分比衡量。
- stop_loss_limit
该止损使用的限价。
- stop_loss_exit_price
止损离场时使用的离场
pybroker.common.PriceType。如果设置了该值,止损会依据exit_price进行判定,并在触发时以exit_price离场。
- stop_profit
在新的
pybroker.portfolio.Entry上设置止盈,其值以距入场价格的点数衡量。
- stop_profit_pct
在新的
pybroker.portfolio.Entry上设置止盈,其值以距入场价格的百分比衡量。
- stop_profit_limit
该止盈使用的限价。
- stop_profit_exit_price
止盈离场时使用的离场
pybroker.common.PriceType。如果设置了该值,止盈会依据exit_price进行判定,并在触发时以exit_price离场。
- stop_trailing
在新的
pybroker.portfolio.Entry上设置移动止损,其值以距入场价格的点数衡量。
- stop_trailing_pct
在新的
pybroker.portfolio.Entry上设置移动止损,其值以距入场价格的百分比衡量。
- stop_trailing_limit
该移动止损使用的限价。
- stop_trailing_exit_price
移动止损离场时使用的离场
pybroker.common.PriceType。如果设置了该值,止损会依据exit_price进行判定,并在触发时以exit_price离场。
- property buying_power: Decimal
在给定
pybroker.config.StrategyConfig.leverage的情况下,可用于多头和空头订单的购买力。这正是
pybroker.portfolio.Portfolio在成交时用来限定订单的依据。而calc_target_shares()则是按可部署资本(权益乘以杠杆)来确定规模的,因此一旦有仓位开仓,两者可能会出现差异。
根据
target_size分配比例和股票price,计算股数。- 参数:
target_size -- 用于计算股数的可部署资本比例,其中
target_size的最大值为1。例如,target_size为0.1表示可部署资本的 10%。price -- 用于计算股数的股价。如果为
None,则使用ExecContext的symbol的股价。cash -- 用于计算股数的资本。如果为
None,则使用可部署资本,定义为投资组合权益乘以pybroker.config.StrategyConfig.leverage。生成的订单在下达时仍会受到buying_power的限制。
- 返回:
根据
target_size和股票price计算出的股数。如果pybroker.config.StrategyConfig.enable_fractional_shares为True,则返回一个 Decimal。
- cancel_all_pending_orders(symbol: str | None = None)[源代码]
取消
symbol的所有pybroker.scope.PendingOrder。当symbol为None时,取消所有待处理订单。
- cancel_pending_order(order_id: int) bool[源代码]
取消 ID 为
order_id的pybroker.scope.PendingOrder。
- cancel_stop(stop_id: int) bool[源代码]
取消 ID 为
stop_id的pybroker.portfolio.Stop。
- cancel_stops(val: str | Position | Entry, stop_type: StopType | None = None)[源代码]
-
- 参数:
val -- 要取消止损的股票代码、
pybroker.portfolio.Position或pybroker.portfolio.Entry。stop_type --
pybroker.common.StopType。
- property cash: Decimal
pybroker.portfolio.Portfolio中当前持有的现金总额。
回补
ExecContext.symbol的全部空头股份。
- property cover_fill_price: int | float | floating | Decimal | PriceType | Callable[[str, BarData], int | float | Decimal] | None
buy_fill_price的别名。设置后,会使买入订单在任何卖出订单之前下达。
- property cover_limit_price: int | float | Decimal | None
buy_limit_price的别名。设置后,会使买入订单在任何卖出订单之前下达。
buy_shares的别名。设置后,会使买入订单在任何卖出订单之前下达。
- foreign(symbol: str, col: str | None = None) BarData | NDArray | None[源代码]
获取另一个股票代码的 K 线数据。
- 参数:
symbol -- 该 K 线数据的股票代码。
col -- 要获取的数据列名称。如果为
None,则以pybroker.common.BarData形式返回所有数据列。
- 返回:
如果
col为None,则返回一个pybroker.common.BarData实例,其中包含截至当前 K 线为止所有 K 线的数据。否则,返回一个包含col列值的numpy.ndarray。
- hyperparam(name: str) Any[源代码]
返回该执行函数的一个超参数值。
该名称必须已通过
pybroker.strategy.Strategy.add_execution()上的hyperparams=[...]附加。
- indicator(name: str, symbol: str | None = None) NDArray[float64][源代码]
返回指标数据。
- 参数:
name -- 用于标识该指标的名称,通过
pybroker.indicator.indicator()注册。symbol -- 用于生成该指标数据的股票代码。如果为
None,则使用ExecContext的symbol。
- 返回:
截至当前 K 线为止所有 K 线的指标值
numpy.ndarray,按时间先后升序排列。
- input(model_name: str, symbol: str | None = None) DataFrame[源代码]
返回用于进行预测的模型输入数据。
- 参数:
model_name -- 该输入数据对应模型的名称。
symbol -- 该输入数据对应模型的股票代码。如果为
None,则使用ExecContext的symbol。
- 返回:
包含输入数据的
pandas.DataFrame,每一行代表截至当前 K 线为止序列中的一根 K 线。各行按时间先后升序排列。
- interval(interval: int | Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly'] | str) IntervalContext[源代码]
返回
interval压缩 K 线数据的只读视图。interval必须与该执行函数在pybroker.strategy.Strategy.add_execution()中通过intervals声明的值匹配,或者与通过pybroker.model.ModelSource.intervals()/pybroker.indicator.Indicator.intervals()绑定到其某个模型或指标的区间匹配。区间的作用域限定在各自的执行函数内:读取另一个执行函数声明的区间会引发ValueError,这与hyperparam()受该执行函数的hyperparams限定的方式相同。支持相同的TimeframeInterval形式:每 n 根 K 线 (
int):例如ctx.interval(5)表示由每 5 根基础 K 线形成的 K 线。时长 (
str):例如ctx.interval("5m")表示固定时长的分箱(数字加单位字母)。日历 (
str):例如ctx.interval("weekly")表示日历周线 K 线。周从周一开始,月从每月 1 日开始,季度从 1、4、7、10 月开始,年从 1 月 1 日开始。
例如:
strategy.add_execution( exec_fn, "SPY", indicators=[sma20.intervals("weekly")], intervals=["5m"], ) strategy.walkforward(windows=1, timeframe="1m") def exec_fn(ctx): weekly = ctx.interval("weekly") five_min = ctx.interval("5m") if len(weekly.close) > 0: wk_sma = weekly.indicator("sma20")
- 参数:
interval -- 该执行函数通过
pybroker.strategy.Strategy.add_execution()声明的压缩区间,或绑定到其某个模型或指标的区间。- 返回:
公开压缩 K 线上只读 OHLCV、指标和模型输出的
pybroker.context.IntervalContext。
- long_pos(symbol: str | None = None) Position | None[源代码]
获取
symbol当前的多头pybroker.portfolio.Position。- 参数:
symbol -- 要返回的头寸的股票代码。如果为
None,则使用ExecContext的symbol。默认为None。- 返回:
如果存在则为
pybroker.portfolio.Position,否则为None。
- long_positions(symbol: str | None = None) Iterator[Position][源代码]
获取所有当前的多头头寸。
- 参数:
symbol -- 用于过滤头寸的股票代码。如果为
None,则返回所有品种的多头头寸。默认为None。- 返回:
当前持有的多头
pybroker.portfolio.Position的Iterator。
- model(name: str, symbol: str | None = None) Any[源代码]
返回一个已训练的模型。
- 参数:
name -- 用于标识该模型的名称,通过
pybroker.model.model()注册。symbol -- 用于训练该模型的数据所对应的股票代码。如果为
None,则使用ExecContext的symbol。
- 返回:
已训练模型的实例。
- orders() Iterator[Order][源代码]
所有已下达并成交的
pybroker.portfolio.Order的Iterator。
- pos(symbol: str, pos_type: Literal['long', 'short']) Position | None[源代码]
获取
symbol当前的多头或空头pybroker.portfolio.Position。- 参数:
symbol -- 要返回的头寸的股票代码。
pos_type -- 指定要返回
long还是short头寸。
- 返回:
如果存在则为
pybroker.portfolio.Position,否则为None。
- positions(symbol: str | None = None, pos_type: Literal['long', 'short'] | None = None) Iterator[Position][源代码]
获取所有当前的头寸。
- 参数:
symbol -- 用于过滤头寸的股票代码。如果为
None,则返回所有品种的头寸。默认为None。pos_type -- 要返回的头寸类型。如果为
None,则同时返回long和short头寸。
- 返回:
当前持有的
pybroker.portfolio.Position的Iterator。
- preds(model_name: str, symbol: str | None = None) NDArray[源代码]
返回模型预测结果。
- 参数:
model_name -- 做出该预测的模型名称。
symbol -- 做出该预测的模型所对应的股票代码。如果为
None,则使用ExecContext的symbol。
- 返回:
包含截至当前 K 线为止模型预测结果序列的
numpy.ndarray。按时间先后升序排列。
卖出
ExecContext.symbol的全部多头股份。
设置订单以达到多头或空头敞口的目标配置。
使用
calc_target_shares()计算达到target所需的股数。- 参数:
target -- 目标配置,以可部署资本的比例表示,定义为投资组合权益乘以
pybroker.config.StrategyConfig.leverage。target的最大值为1。dir -- 要再平衡的敞口方向。
"long"会设置buy_shares或sell_shares。"short"会设置sell_shares以增加空头敞口,或设置cover_shares以减少空头敞口。
- short_pos(symbol: str | None = None) Position | None[源代码]
获取
symbol当前的空头pybroker.portfolio.Position。- 参数:
symbol -- 要返回的头寸的股票代码。如果为
None,则使用ExecContext的symbol。默认为None。- 返回:
如果存在则为
pybroker.portfolio.Position,否则为None。
- short_positions(symbol: str | None = None) Iterator[Position][源代码]
获取所有当前的空头头寸。
- 参数:
symbol -- 用于过滤头寸的股票代码。如果为
None,则返回所有品种的空头头寸。默认为None。- 返回:
当前持有的空头
pybroker.portfolio.Position的Iterator。
- to_result() ExecResult | None[源代码]
根据设置在
ExecContext上的数据创建一个ExecResult。
- property total_equity: Decimal
pybroker.portfolio.Portfolio中当前持有的权益总额。
- property total_margin: Decimal
pybroker.portfolio.Portfolio中当前持有的保证金总额。
- property total_market_value: Decimal
pybroker.portfolio.Portfolio中当前持有的总市值。市值定义为以现金和多头头寸形式持有的权益金额,加上所有未平仓空头头寸的未实现盈亏。
- trades() Iterator[Trade][源代码]
所有已完成的
pybroker.portfolio.Trade的Iterator。
- class ExecResult(symbol: str, date: datetime64, buy_fill_price: int | float | floating | Decimal | PriceType | Callable[[str, BarData], int | float | Decimal], sell_fill_price: int | float | floating | Decimal | PriceType | Callable[[str, BarData], int | float | Decimal], score: float | None, long_score: float | None, short_score: float | None, hold_bars: int | None, buy_shares: Decimal | None, buy_limit_price: Decimal | None, buy_timeout_bars: int | None, sell_shares: Decimal | None, sell_limit_price: Decimal | None, sell_timeout_bars: int | None, long_stops: frozenset[Stop] | None, short_stops: frozenset[Stop] | None, cover: bool = False, pending_order_id: int | None = None, exit_pos_type: Literal['long', 'short'] | None = None)[源代码]
基类:
object保存
pybroker.strategy.Strategy执行过程中设置的数据。- date
该执行函数所使用 K 线的时间戳。
- 类型:
- buy_fill_price
symbol买入(做多)订单使用的成交价格。- 类型:
int | float | numpy.floating | decimal.Decimal | pybroker.common.PriceType | Callable[[str, pybroker.common.BarData], int | float | decimal.Decimal]
- sell_fill_price
symbol卖出(做空)订单使用的成交价格。- 类型:
int | float | numpy.floating | decimal.Decimal | pybroker.common.PriceType | Callable[[str, pybroker.common.BarData], int | float | decimal.Decimal]
- long_score
在对买入和回补信号进行排序时用于给
symbol打分。订单会为long_score值最高的品种下达,pybroker.portfolio.Portfolio中任一时刻持有的多头仓位数量由pybroker.strategy.Strategy.set_max_long_positions()指定。当通过pybroker.strategy.Strategy.enable_rotation()启用了轮动时,long_score会驱动多头轮动,而pybroker.strategy.Execution中设置的订单会被忽略。- 类型:
float | None
- short_score
在对卖出信号进行排序时用于给
symbol打分。订单会为short_score值最高的品种下达,pybroker.portfolio.Portfolio中任一时刻持有的空头仓位数量由pybroker.strategy.Strategy.set_max_short_positions()指定。当通过pybroker.strategy.Strategy.enable_rotation()启用了轮动时,short_score会驱动空头轮动,而pybroker.strategy.Execution中设置的订单会被忽略。- 类型:
float | None
symbol要买入的股数。- 类型:
decimal.Decimal | None
- buy_limit_price
symbol买入(做多)订单使用的限价。- 类型:
decimal.Decimal | None
- buy_timeout_bars
未成交的买入限价单在首次尝试后重试的 K 线数量。
None表示仅尝试一次,-1表示无限期保留,正整数表示有限的重试 K 线数量。- 类型:
int | None
symbol要卖出的股数。- 类型:
decimal.Decimal | None
- sell_limit_price
symbol卖出(做空)订单使用的限价。- 类型:
decimal.Decimal | None
- sell_timeout_bars
未成交的卖出限价单在首次尝试后重试的 K 线数量。
None表示仅尝试一次,-1表示无限期保留,正整数表示有限的重试 K 线数量。- 类型:
int | None
- long_stops
多头
pybroker.portfolio.Entry的止损。- 类型:
frozenset[pybroker.portfolio.Stop] | None
- short_stops
空头
pybroker.portfolio.Entry的止损。- 类型:
frozenset[pybroker.portfolio.Stop] | None
- pending_order_id
已创建的
pybroker.scope.PendingOrder的 ID。- 类型:
int | None
- exit_pos_type
该订单所平掉的
pybroker.portfolio.Position类型,为long或short;当该订单不是离场订单时为None。由ExecContext.sell_all_shares()、ExecContext.cover_all_shares(),以及目标为零的ExecContext.set_target_shares()设置。携带该值的订单在成交时会被限定在仍持有的股数以内,因此只能平仓,永远不会将仓位翻转。- 类型:
Literal['long', 'short'] | None
- class IntervalContext(symbol: str, interval: int | Literal['daily', 'weekly', 'monthly', 'quarterly', 'yearly'] | str, interval_scope: IntervalScope, sym_end_index: Mapping[str, int], models: Mapping[ModelSymbol, TrainedModel])[源代码]
基类:
object更粗粒度区间的压缩 K 线数据的只读视图。
- property dates: NDArray[datetime64]
- class RotationContext(ctxs: Mapping[str, ExecContext], portfolio: Portfolio, long_ranks: Mapping[str, int], short_ranks: Mapping[str, int], config: StrategyConfig)[源代码]
基类:
object传递给通过
pybroker.strategy.Strategy.enable_rotation()设置的轮动规模函数(rotation sizer)的上下文。- ctxs
将所有股票代码映射到
ExecContext的Mapping。- 类型:
Mapping[str, pybroker.context.ExecContext]
- portfolio
- long_ranks
根据可排序的
ExecContext.long_score值计算出的排名,1为最高分。
- short_ranks
根据可排序的
ExecContext.short_score值计算出的排名,1为最高分。
- set_exec_ctx_data(ctx: ExecContext, date: datetime64)[源代码]
在一个
ExecContext实例上设置数据。- 参数:
ctx --
ExecContext。date -- 当前 K 线的日期。