pybroker.eval 模块

包含评估指标的实现。

class BootConfIntervals(low_2p5: float, high_2p5: float, low_5: float, high_5: float, low_10: float, high_10: float)[源代码]

基类:NamedTuple

保存自助法检验的置信区间。

low_2p5

97.5% 置信区间的下界。

类型:

float

high_2p5

97.5% 置信区间的上界。

类型:

float

low_5

95% 置信区间的下界。

类型:

float

high_5

95% 置信区间的上界。

类型:

float

low_10

90% 置信区间的下界。

类型:

float

high_10

90% 置信区间的上界。

类型:

float

class BootstrapResult(conf_intervals: DataFrame, drawdown_conf: DataFrame, profit_factor: BootConfIntervals, sharpe: BootConfIntervals, drawdown: DrawdownMetrics)[源代码]

基类:NamedTuple

包含自助法检验的结果。

conf_intervals

包含 log_profit_factor()sharpe_ratio() 置信区间的 pandas.DataFrame

类型:

pandas.DataFrame

drawdown_conf

包含最大回撤置信区间上界的 pandas.DataFrame

类型:

pandas.DataFrame

profit_factor

包含盈利因子(profit factor)的置信区间。

类型:

pybroker.eval.BootConfIntervals

sharpe

包含夏普比率的置信区间。

类型:

pybroker.eval.BootConfIntervals

drawdown

包含回撤置信区间。

类型:

pybroker.eval.DrawdownMetrics

to_json() dict[str, Any][源代码]

返回可 JSON 序列化的自助法评估指标。

class ConfInterval(name: str, conf: str, lower: float, upper: float)[源代码]

基类:NamedTuple

置信区间的上界和下界。

name

参数名称。

类型:

str

conf

str 表示的置信区间百分比。

类型:

str

lower

下界。

类型:

float

upper

上界。

类型:

float

class DrawdownConfs(q_001: float, q_01: float, q_05: float, q_10: float)[源代码]

基类:NamedTuple

包含最大回撤置信区间的上界。

q_001

99.9% 置信上界。

类型:

float

q_01

99% 置信上界。

类型:

float

q_05

95% 置信上界。

类型:

float

q_10

90% 置信上界。

类型:

float

class DrawdownMetrics(confs: DrawdownConfs, pct_confs: DrawdownConfs)[源代码]

基类:NamedTuple

包含回撤指标。

confs

以现金衡量的最大回撤置信区间上界。

类型:

pybroker.eval.DrawdownConfs

pct_confs

以百分比衡量的最大回撤置信区间上界。

类型:

pybroker.eval.DrawdownConfs

class EvalMetrics(trade_count: int = 0, initial_market_value: float = 0, end_market_value: float = 0, total_pnl: float = 0, unrealized_pnl: float = 0, total_return_pct: float = 0, annual_return_pct: float | None = None, total_profit: float = 0, total_loss: float = 0, total_fees: float = 0, max_drawdown: float = 0, max_drawdown_pct: float = 0, max_drawdown_date: datetime | None = None, win_rate: float = 0, loss_rate: float = 0, winning_trades: int = 0, losing_trades: int = 0, avg_pnl: float = 0, avg_return_pct: float = 0, avg_trade_bars: float = 0, avg_profit: float = 0, avg_profit_pct: float = 0, avg_winning_trade_bars: float = 0, avg_loss: float = 0, avg_loss_pct: float = 0, avg_losing_trade_bars: float = 0, largest_win: float = 0, largest_win_pct: float = 0, largest_win_bars: int = 0, largest_loss: float = 0, largest_loss_pct: float = 0, largest_loss_bars: int = 0, max_wins: int = 0, max_losses: int = 0, sharpe: float = 0, sortino: float = 0, calmar: float | None = None, profit_factor: float = 0, ulcer_index: float = 0, upi: float = 0, equity_r2: float = 0, std_error: float = 0, annual_std_error: float | None = None, annual_volatility_pct: float | None = None)[源代码]

基类:object

包含用于评估 pybroker.strategy.Strategy 的指标。

trade_count

已成交的交易笔数。

类型:

int

initial_market_value

pybroker.portfolio.Portfolio 的初始市值。

类型:

float

end_market_value

pybroker.portfolio.Portfolio 的期末市值。

类型:

float

total_pnl

已实现盈亏(PnL)总额,未扣除手续费。

类型:

float

unrealized_pnl

未实现盈亏(PnL)总额。

类型:

float

total_return_pct

以百分比衡量的已实现收益率总额,未扣除手续费。手续费单独体现在 total_fees 中。

类型:

float

annual_return_pct

以百分比衡量的年化已实现收益率总额,未扣除手续费。

类型:

float | None

total_profit

已实现盈利总额。

类型:

float

total_loss

已实现亏损总额。

类型:

float

total_fees

经纪商手续费总额。更多信息参见 pybroker.config.StrategyConfig.fee_mode

类型:

float

max_drawdown

以现金衡量的最大回撤。

类型:

float

max_drawdown_pct

以百分比衡量的最大回撤。

类型:

float

max_drawdown_date

最大回撤发生的日期。

类型:

datetime.datetime | None

win_rate

交易胜率。

类型:

float

loss_rate

交易败率。

类型:

float

winning_trades

盈利交易笔数。

类型:

int

losing_trades

亏损交易笔数。

类型:

int

avg_pnl

以现金衡量的每笔交易平均盈亏(PnL)。

类型:

float

avg_return_pct

以百分比衡量的每笔交易平均收益率。

类型:

float

avg_trade_bars

每笔交易的平均持仓 K 线数。

类型:

float

avg_profit

以现金衡量的每笔交易平均盈利。

类型:

float

avg_profit_pct

以百分比衡量的每笔交易平均盈利。

类型:

float

avg_winning_trade_bars

每笔盈利交易的平均持仓 K 线数。

类型:

float

avg_loss

以现金衡量的每笔交易平均亏损。

类型:

float

avg_loss_pct

以百分比衡量的每笔交易平均亏损。

类型:

float

avg_losing_trade_bars

每笔亏损交易的平均持仓 K 线数。

类型:

float

largest_win

以现金衡量的单笔交易最大盈利。

类型:

float

largest_win_pct

以百分比衡量的单笔交易最大盈利

类型:

float

largest_win_bars

最大盈利交易的持仓 K 线数。

类型:

int

largest_loss

以现金衡量的单笔交易最大亏损。

类型:

float

largest_loss_pct

以百分比衡量的单笔交易最大亏损。

类型:

float

largest_loss_bars

最大亏损交易的持仓 K 线数。

类型:

int

max_wins

最大连续盈利交易笔数。

类型:

int

max_losses

最大连续亏损交易笔数。

类型:

int

sharpe

按每根 K 线计算的 夏普比率(Sharpe Ratio)

类型:

float

sortino

按每根 K 线计算的 索提诺比率(Sortino Ratio)。当没有亏损 K 线且平均收益率为正时为 inf

类型:

float

calmar

卡玛比率(Calmar Ratio):权益曲线的复合年增长率(CAGR)除以其最大回撤百分比。由于该比率需要年化,未设置 pybroker.config.StrategyConfig.bars_per_year 时为 None;没有回撤且权益曲线上涨时为 inf

类型:

float | None

profit_factor

按每根 K 线计算的总盈利与总亏损之比。

类型:

float

ulcer_index

溃疡指数(Ulcer Index):权益曲线相对其滚动最高点的百分比回撤的均方根值。

类型:

float

upi

溃疡表现指数(Ulcer Performance Index):收益除以溃疡指数(Ulcer Index)。设置 pybroker.config.StrategyConfig.bars_per_year 时,收益按复合年增长率(CAGR)计算;否则为每根 K 线的平均收益率。对于真正无回撤的收益为 inf

类型:

float

equity_r2

按每根 K 线基于投资组合市值计算的权益曲线 R^2。

类型:

float

std_error

投资组合市值在所有 K 线上的标准差。用于衡量权益曲线水平的离散程度;而非回归标准误差。

类型:

float

annual_std_error

std_error 乘以 pybroker.config.StrategyConfig.bars_per_year 的平方根。

类型:

float | None

annual_volatility_pct

按每根 K 线基于投资组合市值计算的年化波动率百分比。

类型:

float | None

to_json() dict[str, Any][源代码]

返回可 JSON 序列化的评估指标。

class EvalResult(metrics: EvalMetrics, bootstrap: BootstrapResult | None)[源代码]

基类:NamedTuple

包含评估结果。

metrics

评估指标。

类型:

pybroker.eval.EvalMetrics

bootstrap

随机自助法指标。

类型:

pybroker.eval.BootstrapResult | None

class EvaluateMixin[源代码]

基类:object

用于计算评估指标的 Mixin。

evaluate(portfolio_df: DataFrame, trades_df: DataFrame, calc_bootstrap: bool, bootstrap_samples: int, bars_per_year: int | None, seed: int | None = 42) EvalResult[源代码]

计算评估指标。

参数:
  • portfolio_df -- 每根 K 线投资组合市值的 pandas.DataFrame

  • trades_df -- 交易记录的 pandas.DataFrame

  • calc_bootstrap -- 为 True 时计算随机自助法指标。

  • bootstrap_samples -- 使用的随机自助法样本数量。

  • bars_per_year -- 用于将评估指标年化的每年观测数量。例如,日线收益率使用 252 来年化夏普比率。

  • seed -- 用于结果可复现的随机种子。默认为 42。

返回:

包含评估指标的 EvalResult

class TradeStats(trade_count: int, win_rate: float, loss_rate: float, winning_trades: int, losing_trades: int, total_profit: float, total_loss: float, avg_profit: float, avg_loss: float, avg_profit_pct: float, avg_loss_pct: float, largest_win: float, largest_loss: float, largest_win_pct: float, largest_loss_pct: float, largest_win_bars: int, largest_loss_bars: int, max_wins: int, max_losses: int, avg_pnl: float, avg_return_pct: float, avg_trade_bars: float, avg_winning_trade_bars: float, avg_losing_trade_bars: float, total_pnl: float)[源代码]

基类:NamedTuple

单次遍历中计算出的交易统计信息。

annual_total_return_percent(initial_value: float, pnl: float, bars_per_year: int, total_bars: int) float[源代码]

计算以百分比表示的年化总收益率。

参数:
  • initial_value -- 初始值。

  • pnl -- 总盈亏(PnL)。

  • bars_per_year -- 每年的 K 线数量。

  • total_bars -- 该收益率对应的 K 线总数。

avg_profit_loss(pnls: NDArray[float64]) tuple[float, float][源代码]

计算每笔交易的平均盈利和平均亏损。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

平均盈利和平均亏损组成的 tuple[float, float]

bca_boot_conf(x: NDArray[float64], n_boot: int, fn: Callable[[NDArray[float64]], float]) BootConfIntervals[源代码]

使用 偏差校正加速(BCa)自助法 计算用户定义参数的置信区间。

参数:
  • x -- 用于随机自助法抽样的数据 numpy.ndarray

  • n_boot -- 使用的随机自助法样本数量。

  • fn -- 用于计算置信区间所需参数的 Callable

返回:

包含计算出的置信区间的 BootConfIntervals

bootstrap_eval_all(changes: NDArray[float64], returns: NDArray[float64], n_boot: int, bars_per_year: int) tuple[BootConfIntervals, BootConfIntervals, DrawdownMetrics][源代码]

在一次共享的重采样过程中计算所有自助法指标。

calmar_ratio(returns: NDArray[float64], bars_per_year: int) float[源代码]

计算卡玛比率(Calmar Ratio),即 returns 复利累积序列的复合年增长率(CAGR)除以该序列的最大回撤百分比。

参数:
  • returns -- 以 0 为中心的收益率数组。

  • bars_per_year -- 每年的 K 线数量。

conf_profit_factor(x: NDArray[float64], n_boot: int) BootConfIntervals[源代码]

计算 profit_factor 的置信区间。

conf_sharpe_ratio(x: NDArray[float64], n_boot: int, obs: int | None = None) BootConfIntervals[源代码]

计算 sharpe_ratio() 的置信区间。

downside_deviation(returns: NDArray[float64]) float[源代码]

计算下行标准差,即 索提诺比率(Sortino Ratio) 的分母。

负收益率相对于零取平方,并对 所有 观测值求平均,而不仅仅是负收益率的观测值。

参数:

returns -- 以 0 为中心的收益率数组。

iqr(values: NDArray[float64]) float[源代码]

计算 values四分位距(IQR)

largest_win_loss(pnls: NDArray[float64]) tuple[float, float][源代码]

计算所有交易中的最大盈利和最大亏损。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

最大盈利和最大亏损组成的 tuple[float, float]

log_profit_factor(changes: NDArray[float64]) float[源代码]

计算对数变换后的盈利因子,即总盈利与总亏损之比。

参数:

changes -- 每根 K 线与前一根 K 线之差组成的数组。

max_drawdown_percent(returns: NDArray[float64]) tuple[float, int | None][源代码]

计算以百分比亏损衡量的最大回撤。

参数:

returns -- 以 0 为中心的收益率数组。

返回:

  • 以百分比亏损衡量的最大回撤。

  • 最大回撤发生处的索引。

max_wins_losses(pnls: NDArray[float64]) tuple[int, int][源代码]

计算最大连续盈利次数和最大连续亏损次数。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

最大连续盈利次数和最大连续亏损次数组成的 tuple[int, int]

r_squared(values: NDArray[float64]) float[源代码]

计算 values 的 R 平方。

relative_entropy(values: NDArray[float64]) float[源代码]

计算相对

sharpe_ratio(returns: NDArray[float64], obs: int | None = None) float[源代码]

计算 夏普比率(Sharpe Ratio),使用 returns 的总体标准差。

参数:
  • returns -- 以 0 为中心的收益率数组。

  • obs -- 用于年化夏普比率的观测数量。例如,日线收益率使用 252

sortino_ratio(returns: NDArray[float64], obs: int | None = None) float[源代码]

计算 索提诺比率(Sortino Ratio)

当没有下行波动可作除数时,该比率是无界的,因此平均收益率为正时返回 inf —— 这确实是最佳得分,Optuna 也能接受 —— 而平均收益率非正时返回 0NaN 则保留给完全无法计算的情况,因为 NaN 得分会将一次 Optuna 试验标记为 失败,从而丢弃该次运行,而不是对其排名。

参数:
  • returns -- 以 0 为中心的收益率数组。

  • obs -- 用于年化索提诺比率的观测数量。例如,日线收益率使用 252

total_profit_loss(pnls: NDArray[float64]) tuple[float, float][源代码]

计算总盈亏。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

总盈利和总亏损组成的 tuple[float, float]

total_return_percent(initial_value: float, pnl: float) float[源代码]

计算以百分比表示的总收益率。

参数:
  • initial_value -- 初始值。

  • pnl -- 总盈亏(PnL)。

win_loss_rate(pnls: NDArray[float64]) tuple[float, float][源代码]

计算以百分比表示的胜率和败率。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

胜率和败率组成的 tuple[float, float]

winning_losing_trades(pnls: NDArray[float64]) tuple[int, int][源代码]

返回盈利和亏损的交易笔数。

参数:

pnls -- 每笔交易盈亏(PnL)组成的数组。

返回:

包含盈利和亏损交易笔数的 tuple[int, int]