跳转至

组件调用速查

本页只列当前代码中已经实现、适合作为用户入口的调用方式。规划中或兼容层内部接口不会放在这里。

Lite / Engine 总览

Lite 和 Engine 共用 tradelearn.backtest runtime、Rust broker 和 Stats,区别只在用户语法:

能力 Lite Engine
推荐导入 import tradelearn.lite as tl import tradelearn.engine as bt
策略基类 tl.Strategy bt.Strategy
运行器 tl.Backtest(data, Strategy) bt.Cerebro()
初始化 hook init() __init__()
主循环 next() next()
数据访问 self.data.close[0] self.data.close[0]
多标的数据 self.datas["AAPL"] / ticker 参数 self.datas[0] / getdatabyname()
指标入口 tl.tdx / tl.talib / tl.tv / tl.pta bt.tdx / bt.talib / bt.tv / bt.pta
自定义指标 self.I(func, ...) class MyInd(bt.Indicator)
目标权重 target_weights() / target_equal() target_weights() / order_target_percent()
Analyzer / Sizer / Signal 不暴露 Backtrader 风格扩展入口
结果对象 stats = bt.run() [strategy] = cerebro.run(); strategy.stats
绘图 / 报告 bt.plot() / bt.report() cerebro.plot() / cerebro.report()

数据输入

单标的 OHLCV

bars = provider.history_ohlc("NASDAQ:AAPL", start="2023-01-01", end="2024-01-01")

stats = tl.Backtest(bars, MyLiteStrategy).run()

cerebro = bt.Cerebro()
cerebro.adddata(bars, name="AAPL")

多标的 panel

provider.history_ohlc(["AAPL", "MSFT"], ...) 返回 MultiIndex(timestamp, symbol) panel 时,Engine 和 Lite 都会自动识别多标的数据形态。

bars = provider.history_ohlc(["NASDAQ:AAPL", "NASDAQ:MSFT"], start="2023-01-01")

# Lite: 构造时直接传 panel
stats = tl.Backtest(bars, MyPortfolio).run()

# Engine: adddata 直接传 panel,会按 symbol 自动拆 feed
cerebro = bt.Cerebro()
cerebro.adddata(bars)

规则:

  • 普通 OHLCV DataFrame:注册为单个 feed。
  • MultiIndex panel 且 index 包含 symbol / ticker 层:按 symbol 自动拆成多个 feed。
  • feed name 默认使用 symbol;也可以在单标的场景显式传 name=

Warm-up 与历史窗口

Lite:

class S(tl.Strategy):
    def init(self):
        self.start_on_bar(20)

Engine:

class S(bt.Strategy):
    def __init__(self):
        self.addminperiod(20)

history_panel(lookback) 是 tradelearn 增强接口,不是 Backtrader 原生接口。它返回当前已经可见的最近窗口:

panel = self.history_panel(20)
# index: timestamp, symbol
# columns: open, high, low, close, volume, 以及额外小写列

第一次触发 next() 时只能返回 1 根;第 20 根后才可能返回完整 20 根。需要满窗口时请配合 start_on_bar()addminperiod()

下单与持仓

目标 Lite Engine
买入 self.buy(size=100) self.buy(size=100)
卖出 self.sell(size=100) self.sell(size=100)
平仓 self.position().close() self.close()
当前持仓 self.position() self.position / self.getposition()
目标数量 self.order_target_size(target=100) self.order_target_size(target=100)
目标比例 self.order_target_percent(target=0.6) self.order_target_percent(target=0.6)
多标的目标权重 self.target_weights({"AAPL": 0.5, "MSFT": 0.4}) self.target_weights({"AAPL": 0.5, "MSFT": 0.4})

Lite 的 position() 是方法,Engine 的 position 是 Backtrader 风格属性。

指标写法

内置指标口径在 Lite 和 Engine 中保持一致:

self.ma20 = tl.tdx.MA(self.data.close, N=20)
self.rsi14 = tl.talib.RSI(self.data.close, timeperiod=14)
self.tv_rsi = tl.tv.RSI(self.data.close, length=14)

Engine 中只需要把 tl 换成 bt

self.ma20 = bt.tdx.MA(self.data.close, N=20)
self.rsi14 = bt.talib.RSI(self.data.close, timeperiod=14)

自定义指标按入口区分:

# Lite: 函数式
self.z = self.I(zscore, self.data.close, window=20)

# Engine: Backtrader 风格 class
class MidPrice(bt.Indicator):
    lines = ("mid",)

    def __init__(self):
        self.lines.mid = (self.data.high + self.data.low) / 2

Stats 结果对象

Lite:

stats = bt.run()
stats["final_value"]
stats.summary
stats.equity
stats.trades
stats.records
stats.strategy
stats.config

Engine:

[strategy] = cerebro.run()
stats = strategy.stats
stats.summary
stats.equity
stats.trades
stats.config

两边共享 Stats 字段:summaryequityreturnsfillstradespositionsordersconfig。Lite 额外提供 recordsstrategy 便捷入口。

Research 组件

import tradelearn.research as research
import tradelearn.research.preprocess as pp
import tradelearn.research.portfolio as pf

feature_set = research.FeatureSet({"alpha": lambda p: p.close.pct_change(20)})
features = feature_set.fit_transform(bars).dropna()

pipe = research.Pipeline(
    [
        pp.Winsorizer(columns=["alpha"]),
        pp.StandardScaler(columns=["alpha"]),
    ]
)
features = pipe.fit_transform(features)

weights = pf.Allocator(
    select=pf.TopK(k=50),
    weight=pf.EqualWeight(gross=0.95),
    constrain=pf.Constraints(max_weight=0.05, normalize=True),
).build(scores)

Research 组件遵循 sklearn-like 心智:需要训练集状态的组件实现 fit() / transform() / fit_transform();只做无状态排序或权重计算的组件可以保留为轻量类或函数。