lightweight backtester
Project description
LightBT
轻量级回测工具
注意
每种工具都有其适合的应用场景。遇到需要快速评测大批量参数或因子的场景,我们只要相对准确。所以使用对数收益累加更合适
现状
- 收益率乘权重的向量计算极快,但在连续做空的场景下,收益不正确,仅仅是因为每天收益率变化不大,所以误差很难察觉。
- 大部分回测库策略与绩效统计结合过于紧密,达不到策略与平台分离的设想
- 大部分回测库都很慢,如:
zipline
、rqalpha
、backtrader
- 回测快的库,底层一般是用
C++
、Rust
等语言实现。跨语言部署和二次开发对量化研究员而言比较困难 vectorbt
计算准确,回测也快。但不支持保证金无法直接用在期货市场,输入宽表比较占内存bt
策略树设计很好,但也不支持保证金概念
目标
- 正确处理保证金和做空
- 架构简单易扩展
- 回测速度快
技术选型
C++/Cython
开发,模仿TA-Lib
的技术方案,Cython
版库部署麻烦,开发也复杂Rust
开发,模仿polars
的技术方案,使用pyo3
进行跨语言调用,但Rust
入门困难Numba
支持JIT
,安装部署方便,易于调试和二次开发
三层结构
- 开仓成交回报产生的持仓导致持仓盈亏、平仓成交回报产生平仓盈亏。将两种盈亏累计便成盈亏曲线
- 已经可以统计盈亏、胜率、最大回撤等指标
- 叠加初始资金即可构成资金曲线和净值曲线,可计算收益率、最大回撤率等指标
- 没有考虑资金不足、是否能成交等情况。已经是简化回测绩效统计工具。仅能按手数进行交易
- 初始资金和保证金率决定了可开手数
- 关注交易细节,考虑资金不足等情况。可以按比例进行资金分配下单
工作原理
- 使用对象来维护每种资产的交易信息。其中的成员变量全是最新值
- 根据时间的推进和交易指令,更新对应对象
- 指定时间间隔获取对象成员变量的快照,将所有快照连起来便成总体绩效
- 月频交易,但日频取快照
- 周频交易,周频取快照
- 分钟交易,日频取快照
安装
pip install lightbt -U
使用
以下是代码片段。完整代码请参考stocks.py
# %%
from lightbt import LightBT, warmup
from lightbt.stats import total_equity
from lightbt.utils import Timer
# 省略代码......
# %% 热身
with Timer():
print('warmup:', warmup())
# %% 初始化
bt = LightBT(init_cash=0.0,
positions_precision=1.0,
max_trades=_N * _K * 2 // 1, # 反手占两条记录,所以预留2倍空间比较安全
max_performances=_N * _K)
# 入金。必需先入金,否则资金为0无法交易
bt.deposit(10000 * 100)
# %% 配置资产信息
with Timer():
bt.setup(config)
# %% 资产转换,只做一次即可
df['asset'] = df['asset'].map(bt.mapping_asset_int)
# %% 交易
with Timer():
bt.run_bars(groupby(orders_daily(df, sort=True), by='date', dtype=order_outside_dt))
# %% 查看最终持仓
positions = bt.positions()
print(positions)
# %% 查看所有交易记录
trades = bt.trades(return_all=True)
print(trades)
trades_stats = bt.trades_stats()
print(trades_stats)
roundtrips = bt.roundtrips()
print(roundtrips)
roundtrips_stats = bt.roundtrips_stats()
print(roundtrips_stats)
# %% 查看绩效
perf = bt.performances(return_all=True)
print(perf)
# %% 总体绩效
equity = total_equity(perf)
print(equity)
equity.plot()
注意
run_bars
的输入是迭代类型,它处理数据是一批一批的,同一批中处理优先级如下:
- 平仓优先。先平后开
- 时间优先。后面订单可能资金不足而少报
所以。每天早上提供一张目标仓位清单后,内部分成两组,先下平仓单,再下开仓单。
- 本回测系统由于会立即成交,所以平仓后资金立即释放,可以立即开仓
- 但实盘中平仓要等成交释放资金后才能再开仓,如果资金非常多,一起开平也可以
groupby
是用来分批的工具,可以使用多个参数进行多重分组,
如参数为groupby(, by=['date'])
时就是一天一个交易清单,如果需要收盘开仓,早盘平仓 ,可以date
中的时间精确到小时
部分工具的选出前10等功能,可能由于前20个值都一样,这时一定要考察更多的指标来确定顺序,比如多考察股票名。否则结果可能每次都不一样。
输入格式
- date: int64
- 时间日期。需在外部提前转成数字。可用
astype(np.int64)
或to_records(dtype)
等方法来实现
- 时间日期。需在外部提前转成数字。可用
- size_type: int
- 数量类型。参考
lightbt.enums.SizeType
- 数量类型。参考
- asset: int
- 资产ID。由
LightBT.setup
执行结果所确定。可通过LightBT.asset_str2int
和LightBT.asset_int2str
进行相互转换
- 资产ID。由
- size: float
- 数量。具体含义需根据
size_type
决定。nan
是一特殊值。用来表示当前一行不交易。在只更新最新价的需求中将频繁用到。
- 数量。具体含义需根据
- fill_price: float
- 成交价。成交价不等于最新价也不等于收盘价。可以用成交均价等一些有意义的价格进行代替。
- last_price: float
- 最新价。可用收盘价、结算价等代替。它影响持仓的浮动盈亏。所以在对绩效快照前一定要更新一次
- date_diff: bool
- 是否换日。在换日的最后时刻需要更新最新价和记录绩效
配置格式
通过LightBT.setup
进行设置
- asset: str
- 资产名。内部将使用对应的int进行各项处理
- mult: float
- 合约乘数。股票的合约乘数为1.0
- margin_ratio: float
- 保证金率。股票的保证金率为1.0
- commission_ratio: float
- 手续费率参数。具体含义参考
commission_fn
- 手续费率参数。具体含义参考
- commission_fn:
- 手续费处理函数
二次开发
git --clone https://github.com/wukan1986/LightBT.git
cd LightBT
pip install -e .
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
lightbt-0.2.2.tar.gz
(24.4 kB
view details)
Built Distribution
lightbt-0.2.2-py3-none-any.whl
(25.8 kB
view details)
File details
Details for the file lightbt-0.2.2.tar.gz
.
File metadata
- Download URL: lightbt-0.2.2.tar.gz
- Upload date:
- Size: 24.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1bcfba939857b2859170e78f0fea28bdc9fe50373351a027496a29fba2bf61f0 |
|
MD5 | 02b2892af2f5fc6a382af24d772d7b97 |
|
BLAKE2b-256 | 57261e3b028da9e6225b2a2f7fc398f3a293e2ba9bd4b42ee54dd70607637335 |
File details
Details for the file lightbt-0.2.2-py3-none-any.whl
.
File metadata
- Download URL: lightbt-0.2.2-py3-none-any.whl
- Upload date:
- Size: 25.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.0 CPython/3.9.19
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b1ba2ff1a1b48335f41dffe31ed263c17c56ca247233c1bc65d8fdfbb05c4f6e |
|
MD5 | 6cf8514fc7a9b5857288a14b2c00c3bf |
|
BLAKE2b-256 | d094cb657f74764a911b80d0ad21f6a102e4e12b3e03912af777d0d9a331212f |