lightbt


Namelightbt JSON
Version 0.2.2 PyPI version JSON
download
home_pageNone
Summarylightweight backtester
upload_time2024-05-18 04:59:43
maintainerNone
docs_urlNone
authorNone
requires_python>=3.7
licenseBSD-3-Clause
keywords backtest
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # LightBT

轻量级回测工具

## 注意

每种工具都有其适合的应用场景。遇到需要快速评测大批量参数或因子的场景,我们只要相对准确。所以使用对数收益累加更合适

## 现状

1. 收益率乘权重的向量计算极快,但在连续做空的场景下,收益不正确,仅仅是因为每天收益率变化不大,所以误差很难察觉。
2. 大部分回测库策略与绩效统计结合过于紧密,达不到策略与平台分离的设想
3. 大部分回测库都很慢,如:`zipline`、`rqalpha`、`backtrader`
4. 回测快的库,底层一般是用`C++`、`Rust`等语言实现。跨语言部署和二次开发对量化研究员而言比较困难
5. `vectorbt`计算准确,回测也快。但不支持保证金无法直接用在期货市场,输入宽表比较占内存
6. `bt`策略树设计很好,但也不支持保证金概念

## 目标

1. 正确处理保证金和做空
2. 架构简单易扩展
3. 回测速度快

## 技术选型

1. `C++/Cython`开发,模仿`TA-Lib`的技术方案,`Cython`版库部署麻烦,开发也复杂
2. `Rust`开发,模仿`polars`的技术方案,使用`pyo3`进行跨语言调用,但`Rust`入门困难
3. `Numba`支持`JIT`,安装部署方便,易于调试和二次开发

## 三层结构

1. 开仓成交回报产生的持仓导致持仓盈亏、平仓成交回报产生平仓盈亏。将两种盈亏累计便成盈亏曲线
    - 已经可以统计盈亏、胜率、最大回撤等指标
2. 叠加初始资金即可构成资金曲线和净值曲线,可计算收益率、最大回撤率等指标
    - 没有考虑资金不足、是否能成交等情况。已经是简化回测绩效统计工具。仅能按手数进行交易
3. 初始资金和保证金率决定了可开手数
    - 关注交易细节,考虑资金不足等情况。可以按比例进行资金分配下单

## 工作原理

1. 使用对象来维护每种资产的交易信息。其中的成员变量全是最新值
2. 根据时间的推进和交易指令,更新对应对象
3. 指定时间间隔获取对象成员变量的快照,将所有快照连起来便成总体绩效
    - 月频交易,但日频取快照
    - 周频交易,周频取快照
    - 分钟交易,日频取快照

## 安装

```commandline
pip install lightbt -U
```

## 使用

以下是代码片段。完整代码请参考[stocks.py](examples/stocks.py)

```python
# %%

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`的输入是迭代类型,它处理数据是一批一批的,同一批中处理优先级如下:

1. 平仓优先。先平后开
2. 时间优先。后面订单可能资金不足而少报

所以。每天早上提供一张目标仓位清单后,内部分成两组,先下平仓单,再下开仓单。

- 本回测系统由于会立即成交,所以平仓后资金立即释放,可以立即开仓
- 但实盘中平仓要等成交释放资金后才能再开仓,如果资金非常多,一起开平也可以

`groupby`是用来分批的工具,可以使用多个参数进行多重分组,
如参数为`groupby(, by=['date'])`时就是一天一个交易清单,如果需要收盘开仓,早盘平仓 ,可以`date`中的时间`精确到小时`

部分工具的选出前10等功能,可能由于前20个值都一样,这时一定要考察更多的指标来确定顺序,比如多考察股票名。否则结果可能每次都不一样。


## 输入格式

1. date: int64
    - 时间日期。需在外部提前转成数字。可用`astype(np.int64)`或`to_records(dtype)`等方法来实现
2. size_type: int
    - 数量类型。参考`lightbt.enums.SizeType`
3. asset: int
    - 资产ID。由`LightBT.setup`执行结果所确定。可通过`LightBT.asset_str2int`和`LightBT.asset_int2str`进行相互转换
4. size: float
    - 数量。具体含义需根据`size_type`决定。`nan`是一特殊值。用来表示当前一行不交易。在只更新最新价的需求中将频繁用到。
5. fill_price: float
    - 成交价。成交价不等于最新价也不等于收盘价。可以用成交均价等一些有意义的价格进行代替。
6. last_price: float
    - 最新价。可用收盘价、结算价等代替。它影响持仓的浮动盈亏。所以在对绩效快照前一定要更新一次
7. date_diff: bool
    - 是否换日。在换日的最后时刻需要更新最新价和记录绩效

## 配置格式

通过`LightBT.setup`进行设置

1. asset: str
    - 资产名。内部将使用对应的int进行各项处理
2. mult: float
    - 合约乘数。股票的合约乘数为1.0
3. margin_ratio: float
    - 保证金率。股票的保证金率为1.0
4. commission_ratio: float
    - 手续费率参数。具体含义参考`commission_fn`
5. commission_fn:
    - 手续费处理函数

## 二次开发

```commandline
git --clone https://github.com/wukan1986/LightBT.git
cd LightBT
pip install -e .
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "lightbt",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.7",
    "maintainer_email": null,
    "keywords": "backtest",
    "author": null,
    "author_email": "wukan <wu-kan@163.com>",
    "download_url": "https://files.pythonhosted.org/packages/57/26/1e3b028da9e6225b2a2f7fc398f3a293e2ba9bd4b42ee54dd70607637335/lightbt-0.2.2.tar.gz",
    "platform": null,
    "description": "# LightBT\n\n\u8f7b\u91cf\u7ea7\u56de\u6d4b\u5de5\u5177\n\n## \u6ce8\u610f\n\n\u6bcf\u79cd\u5de5\u5177\u90fd\u6709\u5176\u9002\u5408\u7684\u5e94\u7528\u573a\u666f\u3002\u9047\u5230\u9700\u8981\u5feb\u901f\u8bc4\u6d4b\u5927\u6279\u91cf\u53c2\u6570\u6216\u56e0\u5b50\u7684\u573a\u666f\uff0c\u6211\u4eec\u53ea\u8981\u76f8\u5bf9\u51c6\u786e\u3002\u6240\u4ee5\u4f7f\u7528\u5bf9\u6570\u6536\u76ca\u7d2f\u52a0\u66f4\u5408\u9002\n\n## \u73b0\u72b6\n\n1. \u6536\u76ca\u7387\u4e58\u6743\u91cd\u7684\u5411\u91cf\u8ba1\u7b97\u6781\u5feb\uff0c\u4f46\u5728\u8fde\u7eed\u505a\u7a7a\u7684\u573a\u666f\u4e0b\uff0c\u6536\u76ca\u4e0d\u6b63\u786e\uff0c\u4ec5\u4ec5\u662f\u56e0\u4e3a\u6bcf\u5929\u6536\u76ca\u7387\u53d8\u5316\u4e0d\u5927\uff0c\u6240\u4ee5\u8bef\u5dee\u5f88\u96be\u5bdf\u89c9\u3002\n2. \u5927\u90e8\u5206\u56de\u6d4b\u5e93\u7b56\u7565\u4e0e\u7ee9\u6548\u7edf\u8ba1\u7ed3\u5408\u8fc7\u4e8e\u7d27\u5bc6\uff0c\u8fbe\u4e0d\u5230\u7b56\u7565\u4e0e\u5e73\u53f0\u5206\u79bb\u7684\u8bbe\u60f3\n3. \u5927\u90e8\u5206\u56de\u6d4b\u5e93\u90fd\u5f88\u6162\uff0c\u5982\uff1a`zipline`\u3001`rqalpha`\u3001`backtrader`\n4. \u56de\u6d4b\u5feb\u7684\u5e93\uff0c\u5e95\u5c42\u4e00\u822c\u662f\u7528`C++`\u3001`Rust`\u7b49\u8bed\u8a00\u5b9e\u73b0\u3002\u8de8\u8bed\u8a00\u90e8\u7f72\u548c\u4e8c\u6b21\u5f00\u53d1\u5bf9\u91cf\u5316\u7814\u7a76\u5458\u800c\u8a00\u6bd4\u8f83\u56f0\u96be\n5. `vectorbt`\u8ba1\u7b97\u51c6\u786e\uff0c\u56de\u6d4b\u4e5f\u5feb\u3002\u4f46\u4e0d\u652f\u6301\u4fdd\u8bc1\u91d1\u65e0\u6cd5\u76f4\u63a5\u7528\u5728\u671f\u8d27\u5e02\u573a\uff0c\u8f93\u5165\u5bbd\u8868\u6bd4\u8f83\u5360\u5185\u5b58\n6. `bt`\u7b56\u7565\u6811\u8bbe\u8ba1\u5f88\u597d\uff0c\u4f46\u4e5f\u4e0d\u652f\u6301\u4fdd\u8bc1\u91d1\u6982\u5ff5\n\n## \u76ee\u6807\n\n1. \u6b63\u786e\u5904\u7406\u4fdd\u8bc1\u91d1\u548c\u505a\u7a7a\n2. \u67b6\u6784\u7b80\u5355\u6613\u6269\u5c55\n3. \u56de\u6d4b\u901f\u5ea6\u5feb\n\n## \u6280\u672f\u9009\u578b\n\n1. `C++/Cython`\u5f00\u53d1\uff0c\u6a21\u4eff`TA-Lib`\u7684\u6280\u672f\u65b9\u6848\uff0c`Cython`\u7248\u5e93\u90e8\u7f72\u9ebb\u70e6\uff0c\u5f00\u53d1\u4e5f\u590d\u6742\n2. `Rust`\u5f00\u53d1\uff0c\u6a21\u4eff`polars`\u7684\u6280\u672f\u65b9\u6848\uff0c\u4f7f\u7528`pyo3`\u8fdb\u884c\u8de8\u8bed\u8a00\u8c03\u7528\uff0c\u4f46`Rust`\u5165\u95e8\u56f0\u96be\n3. `Numba`\u652f\u6301`JIT`\uff0c\u5b89\u88c5\u90e8\u7f72\u65b9\u4fbf\uff0c\u6613\u4e8e\u8c03\u8bd5\u548c\u4e8c\u6b21\u5f00\u53d1\n\n## \u4e09\u5c42\u7ed3\u6784\n\n1. \u5f00\u4ed3\u6210\u4ea4\u56de\u62a5\u4ea7\u751f\u7684\u6301\u4ed3\u5bfc\u81f4\u6301\u4ed3\u76c8\u4e8f\u3001\u5e73\u4ed3\u6210\u4ea4\u56de\u62a5\u4ea7\u751f\u5e73\u4ed3\u76c8\u4e8f\u3002\u5c06\u4e24\u79cd\u76c8\u4e8f\u7d2f\u8ba1\u4fbf\u6210\u76c8\u4e8f\u66f2\u7ebf\n    - \u5df2\u7ecf\u53ef\u4ee5\u7edf\u8ba1\u76c8\u4e8f\u3001\u80dc\u7387\u3001\u6700\u5927\u56de\u64a4\u7b49\u6307\u6807\n2. \u53e0\u52a0\u521d\u59cb\u8d44\u91d1\u5373\u53ef\u6784\u6210\u8d44\u91d1\u66f2\u7ebf\u548c\u51c0\u503c\u66f2\u7ebf\uff0c\u53ef\u8ba1\u7b97\u6536\u76ca\u7387\u3001\u6700\u5927\u56de\u64a4\u7387\u7b49\u6307\u6807\n    - \u6ca1\u6709\u8003\u8651\u8d44\u91d1\u4e0d\u8db3\u3001\u662f\u5426\u80fd\u6210\u4ea4\u7b49\u60c5\u51b5\u3002\u5df2\u7ecf\u662f\u7b80\u5316\u56de\u6d4b\u7ee9\u6548\u7edf\u8ba1\u5de5\u5177\u3002\u4ec5\u80fd\u6309\u624b\u6570\u8fdb\u884c\u4ea4\u6613\n3. \u521d\u59cb\u8d44\u91d1\u548c\u4fdd\u8bc1\u91d1\u7387\u51b3\u5b9a\u4e86\u53ef\u5f00\u624b\u6570\n    - \u5173\u6ce8\u4ea4\u6613\u7ec6\u8282\uff0c\u8003\u8651\u8d44\u91d1\u4e0d\u8db3\u7b49\u60c5\u51b5\u3002\u53ef\u4ee5\u6309\u6bd4\u4f8b\u8fdb\u884c\u8d44\u91d1\u5206\u914d\u4e0b\u5355\n\n## \u5de5\u4f5c\u539f\u7406\n\n1. \u4f7f\u7528\u5bf9\u8c61\u6765\u7ef4\u62a4\u6bcf\u79cd\u8d44\u4ea7\u7684\u4ea4\u6613\u4fe1\u606f\u3002\u5176\u4e2d\u7684\u6210\u5458\u53d8\u91cf\u5168\u662f\u6700\u65b0\u503c\n2. \u6839\u636e\u65f6\u95f4\u7684\u63a8\u8fdb\u548c\u4ea4\u6613\u6307\u4ee4\uff0c\u66f4\u65b0\u5bf9\u5e94\u5bf9\u8c61\n3. \u6307\u5b9a\u65f6\u95f4\u95f4\u9694\u83b7\u53d6\u5bf9\u8c61\u6210\u5458\u53d8\u91cf\u7684\u5feb\u7167\uff0c\u5c06\u6240\u6709\u5feb\u7167\u8fde\u8d77\u6765\u4fbf\u6210\u603b\u4f53\u7ee9\u6548\n    - \u6708\u9891\u4ea4\u6613\uff0c\u4f46\u65e5\u9891\u53d6\u5feb\u7167\n    - \u5468\u9891\u4ea4\u6613\uff0c\u5468\u9891\u53d6\u5feb\u7167\n    - \u5206\u949f\u4ea4\u6613\uff0c\u65e5\u9891\u53d6\u5feb\u7167\n\n## \u5b89\u88c5\n\n```commandline\npip install lightbt -U\n```\n\n## \u4f7f\u7528\n\n\u4ee5\u4e0b\u662f\u4ee3\u7801\u7247\u6bb5\u3002\u5b8c\u6574\u4ee3\u7801\u8bf7\u53c2\u8003[stocks.py](examples/stocks.py)\n\n```python\n# %%\n\nfrom lightbt import LightBT, warmup\nfrom lightbt.stats import total_equity\nfrom lightbt.utils import Timer\n\n# \u7701\u7565\u4ee3\u7801......\n\n# %% \u70ed\u8eab\nwith Timer():\n   print('warmup:', warmup())\n\n# %% \u521d\u59cb\u5316\nbt = LightBT(init_cash=0.0,\n             positions_precision=1.0,\n             max_trades=_N * _K * 2 // 1,  # \u53cd\u624b\u5360\u4e24\u6761\u8bb0\u5f55\uff0c\u6240\u4ee5\u9884\u75592\u500d\u7a7a\u95f4\u6bd4\u8f83\u5b89\u5168\n             max_performances=_N * _K)\n# \u5165\u91d1\u3002\u5fc5\u9700\u5148\u5165\u91d1\uff0c\u5426\u5219\u8d44\u91d1\u4e3a0\u65e0\u6cd5\u4ea4\u6613\nbt.deposit(10000 * 100)\n\n# %% \u914d\u7f6e\u8d44\u4ea7\u4fe1\u606f\nwith Timer():\n   bt.setup(config)\n\n# %% \u8d44\u4ea7\u8f6c\u6362\uff0c\u53ea\u505a\u4e00\u6b21\u5373\u53ef\ndf['asset'] = df['asset'].map(bt.mapping_asset_int)\n\n# %% \u4ea4\u6613\nwith Timer():\n   bt.run_bars(groupby(orders_daily(df, sort=True), by='date', dtype=order_outside_dt))\n\n# %% \u67e5\u770b\u6700\u7ec8\u6301\u4ed3\npositions = bt.positions()\nprint(positions)\n# %% \u67e5\u770b\u6240\u6709\u4ea4\u6613\u8bb0\u5f55\ntrades = bt.trades(return_all=True)\nprint(trades)\ntrades_stats = bt.trades_stats()\nprint(trades_stats)\nroundtrips = bt.roundtrips()\nprint(roundtrips)\nroundtrips_stats = bt.roundtrips_stats()\nprint(roundtrips_stats)\n\n# %% \u67e5\u770b\u7ee9\u6548\nperf = bt.performances(return_all=True)\nprint(perf)\n# %% \u603b\u4f53\u7ee9\u6548\nequity = total_equity(perf)\nprint(equity)\nequity.plot()\n\n```\n\n## \u6ce8\u610f\n\n`run_bars`\u7684\u8f93\u5165\u662f\u8fed\u4ee3\u7c7b\u578b\uff0c\u5b83\u5904\u7406\u6570\u636e\u662f\u4e00\u6279\u4e00\u6279\u7684\uff0c\u540c\u4e00\u6279\u4e2d\u5904\u7406\u4f18\u5148\u7ea7\u5982\u4e0b\uff1a\n\n1. \u5e73\u4ed3\u4f18\u5148\u3002\u5148\u5e73\u540e\u5f00\n2. \u65f6\u95f4\u4f18\u5148\u3002\u540e\u9762\u8ba2\u5355\u53ef\u80fd\u8d44\u91d1\u4e0d\u8db3\u800c\u5c11\u62a5\n\n\u6240\u4ee5\u3002\u6bcf\u5929\u65e9\u4e0a\u63d0\u4f9b\u4e00\u5f20\u76ee\u6807\u4ed3\u4f4d\u6e05\u5355\u540e\uff0c\u5185\u90e8\u5206\u6210\u4e24\u7ec4\uff0c\u5148\u4e0b\u5e73\u4ed3\u5355\uff0c\u518d\u4e0b\u5f00\u4ed3\u5355\u3002\n\n- \u672c\u56de\u6d4b\u7cfb\u7edf\u7531\u4e8e\u4f1a\u7acb\u5373\u6210\u4ea4\uff0c\u6240\u4ee5\u5e73\u4ed3\u540e\u8d44\u91d1\u7acb\u5373\u91ca\u653e\uff0c\u53ef\u4ee5\u7acb\u5373\u5f00\u4ed3\n- \u4f46\u5b9e\u76d8\u4e2d\u5e73\u4ed3\u8981\u7b49\u6210\u4ea4\u91ca\u653e\u8d44\u91d1\u540e\u624d\u80fd\u518d\u5f00\u4ed3\uff0c\u5982\u679c\u8d44\u91d1\u975e\u5e38\u591a\uff0c\u4e00\u8d77\u5f00\u5e73\u4e5f\u53ef\u4ee5\n\n`groupby`\u662f\u7528\u6765\u5206\u6279\u7684\u5de5\u5177\uff0c\u53ef\u4ee5\u4f7f\u7528\u591a\u4e2a\u53c2\u6570\u8fdb\u884c\u591a\u91cd\u5206\u7ec4\uff0c\n\u5982\u53c2\u6570\u4e3a`groupby(, by=['date'])`\u65f6\u5c31\u662f\u4e00\u5929\u4e00\u4e2a\u4ea4\u6613\u6e05\u5355\uff0c\u5982\u679c\u9700\u8981\u6536\u76d8\u5f00\u4ed3\uff0c\u65e9\u76d8\u5e73\u4ed3 \uff0c\u53ef\u4ee5`date`\u4e2d\u7684\u65f6\u95f4`\u7cbe\u786e\u5230\u5c0f\u65f6`\n\n\u90e8\u5206\u5de5\u5177\u7684\u9009\u51fa\u524d10\u7b49\u529f\u80fd\uff0c\u53ef\u80fd\u7531\u4e8e\u524d20\u4e2a\u503c\u90fd\u4e00\u6837\uff0c\u8fd9\u65f6\u4e00\u5b9a\u8981\u8003\u5bdf\u66f4\u591a\u7684\u6307\u6807\u6765\u786e\u5b9a\u987a\u5e8f\uff0c\u6bd4\u5982\u591a\u8003\u5bdf\u80a1\u7968\u540d\u3002\u5426\u5219\u7ed3\u679c\u53ef\u80fd\u6bcf\u6b21\u90fd\u4e0d\u4e00\u6837\u3002\n\n\n## \u8f93\u5165\u683c\u5f0f\n\n1. date: int64\n    - \u65f6\u95f4\u65e5\u671f\u3002\u9700\u5728\u5916\u90e8\u63d0\u524d\u8f6c\u6210\u6570\u5b57\u3002\u53ef\u7528`astype(np.int64)`\u6216`to_records(dtype)`\u7b49\u65b9\u6cd5\u6765\u5b9e\u73b0\n2. size_type: int\n    - \u6570\u91cf\u7c7b\u578b\u3002\u53c2\u8003`lightbt.enums.SizeType`\n3. asset: int\n    - \u8d44\u4ea7ID\u3002\u7531`LightBT.setup`\u6267\u884c\u7ed3\u679c\u6240\u786e\u5b9a\u3002\u53ef\u901a\u8fc7`LightBT.asset_str2int`\u548c`LightBT.asset_int2str`\u8fdb\u884c\u76f8\u4e92\u8f6c\u6362\n4. size: float\n    - \u6570\u91cf\u3002\u5177\u4f53\u542b\u4e49\u9700\u6839\u636e`size_type`\u51b3\u5b9a\u3002`nan`\u662f\u4e00\u7279\u6b8a\u503c\u3002\u7528\u6765\u8868\u793a\u5f53\u524d\u4e00\u884c\u4e0d\u4ea4\u6613\u3002\u5728\u53ea\u66f4\u65b0\u6700\u65b0\u4ef7\u7684\u9700\u6c42\u4e2d\u5c06\u9891\u7e41\u7528\u5230\u3002\n5. fill_price: float\n    - \u6210\u4ea4\u4ef7\u3002\u6210\u4ea4\u4ef7\u4e0d\u7b49\u4e8e\u6700\u65b0\u4ef7\u4e5f\u4e0d\u7b49\u4e8e\u6536\u76d8\u4ef7\u3002\u53ef\u4ee5\u7528\u6210\u4ea4\u5747\u4ef7\u7b49\u4e00\u4e9b\u6709\u610f\u4e49\u7684\u4ef7\u683c\u8fdb\u884c\u4ee3\u66ff\u3002\n6. last_price: float\n    - \u6700\u65b0\u4ef7\u3002\u53ef\u7528\u6536\u76d8\u4ef7\u3001\u7ed3\u7b97\u4ef7\u7b49\u4ee3\u66ff\u3002\u5b83\u5f71\u54cd\u6301\u4ed3\u7684\u6d6e\u52a8\u76c8\u4e8f\u3002\u6240\u4ee5\u5728\u5bf9\u7ee9\u6548\u5feb\u7167\u524d\u4e00\u5b9a\u8981\u66f4\u65b0\u4e00\u6b21\n7. date_diff: bool\n    - \u662f\u5426\u6362\u65e5\u3002\u5728\u6362\u65e5\u7684\u6700\u540e\u65f6\u523b\u9700\u8981\u66f4\u65b0\u6700\u65b0\u4ef7\u548c\u8bb0\u5f55\u7ee9\u6548\n\n## \u914d\u7f6e\u683c\u5f0f\n\n\u901a\u8fc7`LightBT.setup`\u8fdb\u884c\u8bbe\u7f6e\n\n1. asset: str\n    - \u8d44\u4ea7\u540d\u3002\u5185\u90e8\u5c06\u4f7f\u7528\u5bf9\u5e94\u7684int\u8fdb\u884c\u5404\u9879\u5904\u7406\n2. mult: float\n    - \u5408\u7ea6\u4e58\u6570\u3002\u80a1\u7968\u7684\u5408\u7ea6\u4e58\u6570\u4e3a1.0\n3. margin_ratio: float\n    - \u4fdd\u8bc1\u91d1\u7387\u3002\u80a1\u7968\u7684\u4fdd\u8bc1\u91d1\u7387\u4e3a1.0\n4. commission_ratio: float\n    - \u624b\u7eed\u8d39\u7387\u53c2\u6570\u3002\u5177\u4f53\u542b\u4e49\u53c2\u8003`commission_fn`\n5. commission_fn:\n    - \u624b\u7eed\u8d39\u5904\u7406\u51fd\u6570\n\n## \u4e8c\u6b21\u5f00\u53d1\n\n```commandline\ngit --clone https://github.com/wukan1986/LightBT.git\ncd LightBT\npip install -e .\n```\n",
    "bugtrack_url": null,
    "license": "BSD-3-Clause",
    "summary": "lightweight backtester",
    "version": "0.2.2",
    "project_urls": null,
    "split_keywords": [
        "backtest"
    ],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "d094cb657f74764a911b80d0ad21f6a102e4e12b3e03912af777d0d9a331212f",
                "md5": "6cf8514fc7a9b5857288a14b2c00c3bf",
                "sha256": "b1ba2ff1a1b48335f41dffe31ed263c17c56ca247233c1bc65d8fdfbb05c4f6e"
            },
            "downloads": -1,
            "filename": "lightbt-0.2.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "6cf8514fc7a9b5857288a14b2c00c3bf",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.7",
            "size": 25797,
            "upload_time": "2024-05-18T04:59:41",
            "upload_time_iso_8601": "2024-05-18T04:59:41.786240Z",
            "url": "https://files.pythonhosted.org/packages/d0/94/cb657f74764a911b80d0ad21f6a102e4e12b3e03912af777d0d9a331212f/lightbt-0.2.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "57261e3b028da9e6225b2a2f7fc398f3a293e2ba9bd4b42ee54dd70607637335",
                "md5": "02b2892af2f5fc6a382af24d772d7b97",
                "sha256": "1bcfba939857b2859170e78f0fea28bdc9fe50373351a027496a29fba2bf61f0"
            },
            "downloads": -1,
            "filename": "lightbt-0.2.2.tar.gz",
            "has_sig": false,
            "md5_digest": "02b2892af2f5fc6a382af24d772d7b97",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.7",
            "size": 24441,
            "upload_time": "2024-05-18T04:59:43",
            "upload_time_iso_8601": "2024-05-18T04:59:43.349102Z",
            "url": "https://files.pythonhosted.org/packages/57/26/1e3b028da9e6225b2a2f7fc398f3a293e2ba9bd4b42ee54dd70607637335/lightbt-0.2.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2024-05-18 04:59:43",
    "github": false,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "lcname": "lightbt"
}
        
Elapsed time: 9.72624s