CzscTrader

class czsc.traders.CzscTrader(bg: BarGenerator | None = None, positions: List[Position] | None = None, ensemble_method: AnyStr | Callable = 'mean', **kwargs)[source]

Bases: CzscSignals

缠中说禅技术分析理论之多级别联立交易决策类(支持多策略独立执行)

Attributes Summary

pos_changed

判断仓位是否发生变化

Methods Summary

get_ensemble_pos([method])

获取多个仓位的集成仓位

get_ensemble_weight([method])

获取 CzscTrader 中所有 positions 按照 method 方法集成之后的权重

get_position(name)

获取指定名称的仓位策略对象

on_bar(bar)

输入基础周期已完成K线,更新信号,更新仓位

on_sig(sig)

通过信号字典直接交易,用于快速回测场景

take_snapshot([file_html, width, height])

获取快照

update(bar)

输入基础周期已完成K线,更新信号,更新仓位

weight_backtest(**kwargs)

执行仓位集成权重的回测

Attributes Documentation

pos_changed

判断仓位是否发生变化

  1. 函数首先检查self.positions是否为空。如果为空,即没有仓位,函数直接返回False。

  2. 如果self.positions不为空,函数遍历所有的仓位,对于每一个仓位,函数检查其pos_changed属性。

    如果任何一个仓位的pos_changed属性为True,即该仓位发生了变化,函数返回True。

Returns:

True/False

Methods Documentation

get_ensemble_pos(method: AnyStr | Callable | None = None) float[source]

获取多个仓位的集成仓位

函数执行逻辑:

  1. 函数首先检查self.positions是否为空。如果为空,即没有仓位,函数直接返回0。

  2. 如果self.positions不为空,函数获取集成方法method。如果没有传入method参数,函数使用self.__ensemble_method作为集成方法。

  3. 如果method是一个字符串,函数将其转换为小写,然后获取所有仓位的仓位序列pos_seq。
    1. 如果method是”mean”,函数计算pos_seq的平均值作为集成仓位。

    2. 如果method是”vote”,函数计算pos_seq的和的符号作为集成仓位。

    3. 如果method是”max”,函数获取pos_seq的最大值作为集成仓位。

    4. 如果method不是以上任何一个值,函数抛出一个值错误。

  4. 如果method不是一个字符串,即它是一个回调函数,函数将所有仓位的名称和仓位组成的字典作为参数传入method,并将返回值作为集成仓位。

Parameters:

method

多个仓位集成一个仓位的方法,可选值 mean, vote, max;也可以传入一个回调函数

假设有三个仓位对象,当前仓位分别是 1, 1, -1 mean - 平均仓位,pos = np.mean([1, 1, -1]) = 0.33 vote - 投票表决,pos = 1 max - 取最大,pos = 1

对于传入回调函数的情况,输入是 self.positions

Returns:

pos, 集成仓位

get_ensemble_weight(method: AnyStr | Callable | None = None)[source]

获取 CzscTrader 中所有 positions 按照 method 方法集成之后的权重

函数执行逻辑:

  1. 函数首先接收一个参数method,这是集成方法,可以是字符串或者一个回调函数。

  2. 函数检查是否提供了method参数。如果没有提供,函数使用self.__ensemble_method作为集成方法;如果提供了,函数使用提供的method作为集成方法。

  3. 函数调用get_ensemble_weight函数,输入self和method,获取所有仓位按照指定方法集成之后的权重。

Parameters:
  • method

    str or callable 集成方法,可选值包括:’mean’, ‘max’, ‘min’, ‘vote’ 也可以传入自定义的函数,函数的输入为 dict,key 为 position.name,value 为 position.pos, 样例输入:

    {‘多头策略A’: 1, ‘多头策略B’: 1, ‘空头策略A’: -1}

  • kwargs

Returns:

pd.DataFrame columns = [‘dt’, ‘symbol’, ‘weight’, ‘price’]

get_position(name: str) Position | None[source]

获取指定名称的仓位策略对象

函数执行逻辑:

  1. 函数首先接收一个参数name,这是要查找的仓位名称。

  2. 函数检查self.positions是否为空。如果为空,即没有仓位,函数直接返回None。

  3. 如果self.positions不为空,函数遍历所有的仓位,对于每一个仓位,函数检查其名称是否与输入的名称相同。如果相同,函数返回该仓位。

  4. 如果遍历所有的仓位都没有找到与输入名称相同的仓位,函数返回None。

Parameters:

name – 仓位名称

Returns:

Position

on_bar(bar: RawBar) None[source]

输入基础周期已完成K线,更新信号,更新仓位

Parameters:

bar – 基础周期已完成K线

Returns:

None

on_sig(sig: dict) None[source]

通过信号字典直接交易,用于快速回测场景

函数执行逻辑:

  1. 函数首先接收一个参数sig,这是一个信号字典,赋值给self.s。

  2. 函数从sig中提取出标的代码symbol,结束时间dt,K线ID id,以及收盘价close,

    并将它们分别赋值给self.symbol,self.end_dt,self.bid,和self.latest_price。

  1. 如果self.positions不为空,即存在持仓策略,函数遍历所有position,函数调用position.update(self.s),更新该仓位的状态

Parameters:

sig – 信号字典

Returns:

None

take_snapshot(file_html=None, width: str = '1400px', height: str = '580px')[source]

获取快照

Parameters:
  • file_html – 交易快照保存的 html 文件名

  • width – 图表宽度

  • height – 图表高度

Returns:

update(bar: RawBar) None[source]

输入基础周期已完成K线,更新信号,更新仓位

函数执行逻辑:

  1. 函数首先接收一个参数bar,这是一个已完成的基础周期K线。

  2. 函数调用self.update_signals(bar),输入这个已完成的基础周期K线,更新信号。

  3. 如果self.positions不为空,即存在仓位,函数遍历所有的仓位,对于每一个仓位,函数调用position.update(self.s),更新该仓位的状态。

Parameters:

bar – 基础周期已完成K线

Returns:

None

weight_backtest(**kwargs)[source]

执行仓位集成权重的回测

Parameters:

kwargs

  • method: str or callable,集成方法,参考 get_ensemble_weight 方法

  • digits: int,权重小数点后保留的位数,例如 2 表示保留两位小数

  • fee_rate: float,手续费率,例如 0.0002 表示万二

Returns:

回测结果