你好!很高兴为你讲解 czsc/py/objects.py 中的 cal_break_even_point 函数与 Position 类。这两个组件主要用于策略回测 和交易信号分析。
1. cal_break_even_point 函数
这是一个用于计算盈亏平衡点的辅助统计函数。
- 功能 :在一个交易收益序列中,计算为了达到盈亏平衡(累计收益 ≥\ge≥ 0),需要剔除多少比例的最差交易。
- 输入 :
seq(List[float]),代表每一笔交易的收益率序列。 - 输出 :
float(0.0 ~ 1.0),表示需要剔除的交易比例(或者说是覆盖了多少比例的交易后才能回本)。
代码逻辑解析:
python
def cal_break_even_point(seq: List[float]) -> float:
# 边界检查:如果没有交易或总收益本身就是亏损的,认为盈亏平衡点为 1.0(即无法平衡或全亏)
if len(seq) <= 0 or sum(seq) < 0:
return 1.0
# 1. 对收益从小到大排序(最差的亏损排在前面)
seq = sorted(seq)
sub_ = 0
sub_i = 0
# 2. 累加收益
for i, s_ in enumerate(seq):
sub_ += s_
sub_i = i + 1
# 3. 一旦累计收益转正,说明前面的亏损已经被覆盖
if sub_ >= 0:
break
# 4. 返回比例:(达到平衡时的交易笔数) / 总交易笔数
return sub_i / len(seq)
业务含义:如果这个值很大(接近 1.0),说明你的策略大部分时候都在填补之前的亏损坑;如果值很小,说明只需很少的盈利交易就能覆盖所有亏损。
2. Position 类
这是一个轻量级的持仓管理与回测引擎 。它维护了一个标的的持仓状态,并根据传入的信号流 (update 方法) 自动执行开仓、平仓、止损和超时强平。
核心属性
pos: 当前仓位状态。1(多头),-1(空头),0(空仓)。opens/exits: 定义了策略的交易规则 。它们是Event对象列表,分别对应"开仓条件"和"平仓条件"。stop_loss: 硬止损设置,单位 BP(万分之一)。timeout: 时间止损,持仓超过多少根 K 线后强制平仓。interval: 冷却时间,同向开仓的最小时间间隔(秒)。operates: 记录每一次操作的流水(开多、平多、开空、平空)。pairs: (计算属性) 将流水匹配成完整的"开仓-平仓"对,用于统计胜率、盈亏比。
核心方法:update(s: dict)
这是该类的灵魂方法,用于驱动状态机流转。你每传入一个 K 线的信号字典 s,它就更新一次状态。
逻辑流程图解:
- 信号匹配 :遍历
opens和exits事件,看当前的信号s是否触发了某个交易事件(如LO开多,LE平多等)。 - 开仓逻辑 :
- 如果触发
LO(Long Open):- 若当前无仓位且满足
interval间隔 -> 开多仓 (pos=1)。 - 若当前持有空头 -> 平空仓 (
pos=0)(反手逻辑的一部分)。
- 若当前无仓位且满足
- 如果触发
SO(Short Open):- 若当前无仓位且满足
interval间隔 -> 开空仓 (pos=-1)。 - 若当前持有多头 -> 平多仓 (
pos=0)。
- 若当前无仓位且满足
- 如果触发
- 出场逻辑 (优先级从高到低) :
- 信号平仓 :如果触发了
LE(Long Exit) 或SE(Short Exit),直接平仓。 - 止损平仓 :计算当前价格相对于开仓价的亏损是否超过
stop_loss。 - 超时平仓 :检查持仓时间(K线数量)是否超过
timeout。
- 信号平仓 :如果触发了
核心方法:evaluate 与 pairs
pairs:将operates列表中的流水转化为成对的交易记录。- 例如:
[{'开仓时间':..., '平仓时间':..., '盈亏比例': 150BP}, ...]
- 例如:
evaluate(trade_dir):基于pairs和持仓序列计算策略的绩效指标:- 夏普比率 (Sharp)
- 最大回撤 (MaxDrawdown)
- 年化收益
- 胜率
- 卡玛比率 (Calmar)
总结
cal_break_even_point是一个用来评估策略"填坑能力"的小工具。Position是一个事件驱动 的微型回测器。你定义好何时开(opens)、何时平(exits)、何时止损(stop_loss),然后不断喂给它最新的 K 线数据(update),它就会告诉你最终的资金曲线和策略表现。