pybroker.slippage 模块
实现滑点模型。
- class FixedSlippageModel(bps: float = 5)[源代码]
-
对成交价格施加确定性的固定基点滑点。
买入成交价会向上调整(变差);卖出成交价会向下调整(变差)。适用于多头入场、空头入场、多头离场和空头回补。
- 参数:
bps -- 以基点表示的不利滑点。
0表示不产生任何效果。必须小于10000(100%),否则会使卖出成交价变为非正数。
- adjust_fill_price(side: Literal['buy', 'sell'], fill_price: Decimal) Decimal[源代码]
返回根据
side调整后的fill_price,不使用额外的上下文信息。
- apply_slippage(ctx: SlippageContext) tuple[Decimal, Decimal][源代码]
使用成交 K 线的数据施加滑点。
返回的股数可以减少以模拟部分成交,但不能增加:如果返回值超过
ctx.shares(或为负数),会在成交时引发ValueError。- 返回:
滑点调整后的
(shares, fill_price)元组。
- property is_fill_noop: bool
对于该模型,
apply_slippage()是否不产生任何效果。
- class SlippageContext(side: Literal['buy', 'sell'], symbol: str, shares: Decimal, fill_price: Decimal, col_scope: ColumnScope | None, ind_scope: IndicatorScope | None, sym_end_index: Mapping[str, int] | None, enable_fractional_shares: bool = True)[源代码]
基类:
object传递给滑点调整逻辑的上下文。
- side
订单方向,为
buy或sell。- 类型:
Literal['buy', 'sell']
滑点调整前待成交的股数。
- 类型:
- fill_price
在成交 K 线上确定的基础成交价格。
- 类型:
- col_scope
覆盖整个测试窗口的列作用域(column scope)—— 未 预先切片到成交 K 线。因果读取时,每次获取都必须使用成交 K 线的索引进行限定,例如
ctx.col_scope.fetch(ctx.symbol, "close", end_index=ctx.sym_end_index[ctx.symbol]);不带end_index的获取会返回整个窗口,包括成交之后的 K 线。当 K 线数据不可用时为None,此时基于成交量和波动率的模型将不对成交进行调整。- 类型:
pybroker.scope.ColumnScope | None
- ind_scope
覆盖整个测试窗口的指标作用域(indicator scope)—— 与
col_scope相同,同样需要使用end_index进行限定。当指标数据不可用时为None,此时基于指标的模型将不对成交进行调整。- 类型:
是否启用碎股(fractional shares)。为
False时,调用方会将返回的股数截断为整数;该标志使模型能够根据实际将要成交的数量来计算与价格相关的值(例如成交量参与度)。- 类型:
- class SlippageModel[源代码]
基类:
ABC用于实现滑点模型的基类。
滑点模型可以在
apply_slippage()中使用成交 K 线的数据,调整成交价格、股数,或两者同时调整。apply_slippage()会在以下情况下被调用:已排定的买入和卖出订单、止损离场(止损、止盈、移动止损和 K 线止损),以及pybroker.portfolio.Portfolio.exit_position()成交。止损和离场成交仅应用返回的 成交价格;返回的股数会被忽略,因为这些路径会全部平掉一笔入场。- adjust_fill(side: Literal['buy', 'sell'], symbol: str, shares: Decimal, fill_price: Decimal, col_scope: ColumnScope | None = None, ind_scope: IndicatorScope | None = None, sym_end_index: Mapping[str, int] | None = None, enable_fractional_shares: bool = True) tuple[Decimal, Decimal][源代码]
构建一个
SlippageContext,并对其应用apply_slippage()。提供此方法是为了让无法导入
pybroker.slippage的调用方(例如pybroker.portfolio)仍然能够对成交施加滑点。- 返回:
滑点调整后的
(shares, fill_price)元组。
- apply_slippage(ctx: SlippageContext) tuple[Decimal, Decimal][源代码]
使用成交 K 线的数据施加滑点。
返回的股数可以减少以模拟部分成交,但不能增加:如果返回值超过
ctx.shares(或为负数),会在成交时引发ValueError。- 返回:
滑点调整后的
(shares, fill_price)元组。
- property is_fill_noop: bool
对于该模型,
apply_slippage()是否不产生任何效果。
- class VolatilitySlippageModel(atr_period: int = 14, scale: float = 0.1)[源代码]
-
基于 ATR 缩放的成交价格滑点。
不利价格调整等于成交 K 线上的
scale * ATR,其中平均真实波幅(Average True Range)是基于截至成交 K 线为止的atr_period根 K 线计算的(参见pybroker.vect.atr())。在预热期内(即没有完整 ATR 窗口的前atr_period根 K 线)成交,或 ATR 为NaN的 K 线上成交,均不会被调整。- 参数:
atr_period -- ATR 的回溯 K 线数量。默认为
14。scale -- 施加于 ATR 值的乘数。
- apply_slippage(ctx: SlippageContext) tuple[Decimal, Decimal][源代码]
使用成交 K 线的数据施加滑点。
返回的股数可以减少以模拟部分成交,但不能增加:如果返回值超过
ctx.shares(或为负数),会在成交时引发ValueError。- 返回:
滑点调整后的
(shares, fill_price)元组。
- property is_fill_noop: bool
对于该模型,
apply_slippage()是否不产生任何效果。
- class VolumeSlippageModel(price_impact: float = 0.1, volume_limit: float | None = 0.025)[源代码]
-
基于成交量的参与度上限与平方律价格冲击。
股数可能会被限制在
volume_limit * bar_volume以内。价格冲击为price_impact * (filled_shares / bar_volume) ** 2。传入0或None可禁用其中任一效应。需要一个
volume数据列,该列在 PyBroker 中是可选的。成交量缺失或为NaN的 K 线不会被调整。- 参数:
price_impact -- 平方律冲击系数。
0表示禁用冲击。volume_limit -- 作为 K 线成交量比例的最大参与度。
None或0表示禁用该上限。
- apply_slippage(ctx: SlippageContext) tuple[Decimal, Decimal][源代码]
使用成交 K 线的数据施加滑点。
返回的股数可以减少以模拟部分成交,但不能增加:如果返回值超过
ctx.shares(或为负数),会在成交时引发ValueError。- 返回:
滑点调整后的
(shares, fill_price)元组。
- property is_fill_noop: bool
对于该模型,
apply_slippage()是否不产生任何效果。