跳转至

快速开始

安装与环境

直接安装:

pip install trade-learn

推荐使用虚拟环境(如 uv):

uv pip install trade-learn
# 或者克隆源码开发模式
uv sync

如果需要开发 Rust 扩展:

cd backtest-rs
maturin develop --release

Lite:最短路径

import tradelearn.lite as tl
from tradelearn.data import TradingViewProvider


class LiteSmaCross(tl.Strategy):
    fast = 10
    slow = 20

    def init(self):
        self.fast_ma = tl.tdx.MA(self.data.close, N=self.fast)
        self.slow_ma = tl.tdx.MA(self.data.close, N=self.slow)
        self.start_on_bar(self.slow + 1)

    def next(self):
        if self.fast_ma[0] > self.slow_ma[0] and not self.position():
            self.buy(size=100)
        elif self.fast_ma[0] < self.slow_ma[0] and self.position():
            self.position().close()


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

bt = tl.Backtest(bars, LiteSmaCross, cash=100_000, commission=0.0003, trade_on_close=True)
stats = bt.run()

print(stats.summary)
bt.plot()
bt.report("report.html")

Lite 返回的 stats 是用户主对象:

stats["final_value"]
stats.summary
stats.equity
stats.trades
stats.records
stats.strategy
stats.config

Engine:Backtrader 风格

import tradelearn.engine as bt
from tradelearn.data import TradingViewProvider


class SmaCross(bt.Strategy):
    params = (("fast", 10), ("slow", 20))

    def __init__(self):
        self.fast = bt.tdx.MA(self.data.close, N=self.p.fast)
        self.slow = bt.tdx.MA(self.data.close, N=self.p.slow)

    def next(self):
        if self.fast[0] != self.fast[0] or self.slow[0] != self.slow[0]:
            return
        if not self.position and self.fast[0] > self.slow[0]:
            self.buy(size=100)
        elif self.position and self.fast[0] < self.slow[0]:
            self.close()


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

cerebro = bt.Cerebro(trade_on_close=True)
cerebro.setcash(100_000)
cerebro.setcommission(0.0003)
cerebro.adddata(bars, name="AAPL")
cerebro.addstrategy(SmaCross)

[strategy] = cerebro.run()

print(strategy.stats.summary)
cerebro.plot()
cerebro.report("report.html")

Engine 侧结果挂在策略实例上:

stats = strategy.stats
stats.summary
stats.equity
stats.trades
stats.positions
stats.orders
stats.config

多标的数据

Provider 可以直接返回 MultiIndex(timestamp, symbol) 的 panel。Engine 的 adddata() 会自动按 symbol 拆分:

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

cerebro = bt.Cerebro()
cerebro.adddata(bars)  # 自动按 symbol 拆成多个 feed

Lite 同样可以直接接收 panel:

bt = tl.Backtest(bars, MyPortfolioStrategy, cash=100_000)
stats = bt.run()

指标写法

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

tl.tdx.MA(self.data.close, N=20)       # Lite
bt.tdx.MA(self.data.close, N=20)       # Engine

用户自定义指标按入口分层:

场景 推荐写法
Lite 自定义向量函数 self.I(func, self.data.close, ...)
Engine 自定义复杂指标 class MyIndicator(bt.Indicator)

下一步

目标 阅读
写更完整的 Lite 策略 Lite 指南
写 Backtrader 风格策略 Engine 指南
理解 Stats 返回对象 Stats 结果对象
做因子和机器学习研究 研究指南
查看性能和对齐结果 性能基线