Metadata-Version: 2.4
Name: vnrs
Version: 0.1.0
Classifier: Development Status :: 4 - Beta
Classifier: Environment :: Console
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Rust
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Topic :: Office/Business :: Financial :: Investment
Classifier: Natural Language :: Chinese (Simplified)
Requires-Dist: tzlocal
Requires-Dist: numpy
Requires-Dist: pandas
Requires-Dist: ta-lib
Requires-Dist: deap
Requires-Dist: plotly
Requires-Dist: pytz
Requires-Dist: tqdm
License-File: LICENSE
Summary: vnpy backtest module written in Rust and Python
Keywords: quant,quantitative,investment,trading
Author-email: Liehan Wu <vnpyrs@hotmail.com>
Requires-Python: >=3.8
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
Project-URL: Homepage, https://github.com/vnpyrs/vnpyrs
Project-URL: Documentation, https://github.com/vnpyrs/vnpyrs
Project-URL: Repository, https://github.com/vnpyrs/vnpyrs
Project-URL: Changelog, https://github.com/vnpyrs/vnpyrs/releases

# vnpyrs 和vnpy完全兼容但更快的回测框架

vnpyrs是以提升性能为目的，部分代码用Rust语言重新实现的vnpy。已实现回测和参数调优。

## 背景

众所周知，Python生态强大，编码灵活，但是有个缺点，就是慢。2024年，我实验性的用Rust重写了vnpy的回测模块，惊喜的发现，运行速度提升了近20倍。
显然，移植到Rust这件事的价值是巨大的。但还有个问题，由于它100%是用Rust编写的，包括策略也是用Rust编写的，那用户就无法使用Python的各种库了。况且，Rust是出了名的难入门的语言。上述的两点会降低它的实用性。
因此，在2025年我重新设定了目标，该项目必须完全兼容Python生态，100%兼容已经为vnpy编写的策略，同时要提升性能。
由于用户代码是用Python编写的，那性能提升就不会像第一次用纯Rust编写时那样夸张了，但省下的时间依然不少。如果用examples文件夹里面的案例测试，在不改一行策略代码的情况下，综合速度提升了一倍。（具体提升多少和策略的具体实现紧密相关）

## 环境准备

vnpyrs对python包的依赖和vnpy几乎一样，但去掉了UI相关的包。Python版本需要3.8以上，推荐3.10以上

## 安装步骤

**Windows**

```
pip install vnrs
```

**Linux**

```
pip install vnrs
```

**Macos**

需要git clone并源码编译


## 脚本运行

vnpyrs仅支持脚本运行，在任意目录下创建run.py，写入以下示例代码：

```Python
from vnrs.backtesting import BacktestingEngine, BacktestingMode
from vnrs.trader.optimize import OptimizationSetting

#double_ma_strategy模块是vnpy自带的，复制到当前目录即可。对策略的导入必须在导入vnrs之后，除非将其中的vnpy_ctastrategy替换为vnrs
from double_ma_strategy import DoubleMaStrategy

from datetime import datetime
import time

def main():
    engine=BacktestingEngine()

    engine.set_parameters(vt_symbol="300.LOCAL",
                        interval="1m",
                        start=datetime(2009,1,5),
                        end=datetime(2020,8,18),
                        rate=2.3e-5,
                        slippage=0.2,
                        size=1,
                        pricetick=0.2,
                        capital=10000000)

    start = time.perf_counter()
    engine.add_strategy(DoubleMaStrategy,{'fast_window': 10, 'slow_window': 20})
    engine.load_data()
    engine.run_backtesting()
    df=engine.calculate_result()
    print(df)
    engine.calculate_statistics()
    engine.show_chart().show()

    setting=OptimizationSetting()
    setting.set_target("sharpe_ratio")
    setting.add_parameter("fast_window",8,12,1)
    setting.add_parameter("slow_window",12,20,1)
    engine.run_bf_optimization(setting)
    engine.run_ga_optimization(setting)
    print(time.perf_counter()-start) #这里用于统计耗时，可以看到vnpyrs耗时只有vnpy的一半

if __name__ == '__main__':
    main()
```

vnpyrs使用的数据库和json配置文件和vnpy完全一样，二者是共用数据库的。标的300.LOCAL的数据在examples下，导入300_1min_vnpy.csv到vnpy即可。
在该目录下打开CMD（按住Shift->点击鼠标右键->在此处打开命令窗口/PowerShell）后运行下列命令启动vnpyrs：
    python run.py


## 开发路线图

不会完全移植vnpy。
一个原因是vnpy用到了很多动态语言的特性，以实现插件化，这部分在静态语言上实现很困难，或者需要大量的unsafe；
另一个原因是没必要，UI和网络模块即使用Rust、C++重写，体验也不会明显变好。
但是未来会支持用Rust、C、C++写策略，这样的话回测性能提升10倍也是有可能的。
