史上最详细的VNpy入门教程,从图文安装教程到手搓策略一步到位

史上最详细的VNpy入门教程,从图文安装教程到手搓策略一步到位

前几天发了一篇《想做量化?强烈推荐这8款顶级开源项目,干货拉满!》文章,结果好多人跑过来让写一篇关于VNpy的教程,作为最宠粉的花姐必须安排!😎

本教程是VNpy4.0最新版本的教程


VNpy到底是个啥?

简单点说,VNpy 就是中国量化圈里“量化交易框架界的天花板”之一。

它开源、全套中文文档、支持股票、期货、期权,还能搞高频、CTA、事件驱动、甚至量化投研模型——关键!最强的是它可以和券商打通,做到真正的交易,而不是纸上谈兵!


如何安装VNpy

VNpy官方很贴心,已经给出了详细的安装教程可以参考以下链接:
https://www.vnpy.com/docs/cn/index.html

不过说句实话,安装文档坑很多,估计是老早以前写的一直没更新。

这里强调几个比较关键的点:

以下教程适用于Windows电脑,Linux和Mac仅供参考(因为花姐用的就是Windows)

1. Python环境
这里就要吐槽几句了,官方建议一定要用Python 3.10 64位环境(注意必须是64位版本)
花姐就按照官方建议被坑了,装了半天,各种捣鼓,也没搞定。后来用了官方的一键安装包,发现官方用的是Python3.13.2版本。于是我回过头来用Python3.13.2的虚拟环境重新通过源码方式安装了下,分分钟搞定!!!

2. 安装方式

官方给了2种安装方式

路线1:懒人安装包——用官方打包的安装器(推荐)

VNpy团队直接提供了一整套打包好的安装程序,下载完了动动鼠标就搞定,一套带界面、带策略编辑器、带回测引擎的全家桶,图形界面都有了,你再不会,那真不是技术的问题……

✅ 路线2:手动打造——源码安装
这里花姐会多说几句,下载源码时记得从Gitee下载,GitHub国内经常访问不了。当然有条件的还是从GitHub下载最好

老手可以直接:

git clone https://github.com/vnpy/vnpy.git
cd vnpy

新手推荐下载源码然后解压,进入到vnpy目录然后执行以下操作。

在安装时最好创建个Python的虚拟环境,不然我怕VNpy安装好了,你的其它程序反而挂了
激活你的Python虚拟环境,然后运行

install.bat

这部分可以忽略 begin
如果你是用的官方推荐Python 3.10等了一会以后,相信99%的朋友会遇到这个错误,这是ta-lib没有安装成功。

如果你电脑上已经安装了C++编译环境是不会出现这个错误的。一种方法是安装C++编译环境,直接上网搜索下教程很多花姐就不写了。第二种方法是直接下载ta_lib-0.6.3-cp310-cp310-win_amd64.whl这个编译好的ta-lib,然后通过

pip install ta_lib-0.6.3-cp310-cp310-win_amd64.whl

来安装,安装ta-lib以后,接下来继续执行install.bat就可以了
不知道怎么安装ta-lib的可以参考花姐的这篇文章

《史上最强量化工具库 Ta-Lib 从入门到精通,一篇文章就够了》
这部分可以忽略 end

接下来找到 ***vnpyexamplesveighna_trader 执行python run.py 会打开这个页面,但是一般会报错 ModuleNotFoundError: No module named 'vnpy_ctp'
直接通过pip install 对应的module name 即可
如果你是Python3.10到这里安装 vnpy_ctp估计大多数也会报错,主要原因还是电脑里没有安装c++编译器,所以想自己折腾的C++编译环境一定要装好。Python3.13.2不会出现这些问题。

要想执行python run.py先安装以下模块:

pip install vnpy_ctp vnpy_ctastrategy vnpy_ctabacktester vnpy_datamanager importlib_metadata vnpy_sqlite

运行成功以后如下图

这里给出一份VNpy需要安装的其它模块,可以根据需要自行安装:

vnpy_rest
vnpy_websocket
vnpy_ctp
vnpy_ctptest
vnpy_xtp
vnpy_tts
vnpy_rohon
vnpy_mini
vnpy_sopt
vnpy_uft
vnpy_esunny
vnpy_comstar
vnpy_ib
vnpy_tap
vnpy_da
vnpy_femas
vnpy_ost
vnpy_tora
vnpy_hft
vnpy_sec
vnpy_hts

vnpy_ctastrategy
vnpy_ctabacktester
vnpy_riskmanager
vnpy_datamanager
vnpy_webtrader
vnpy_spreadtrading
vnpy_datarecorder
vnpy_chartwizard
vnpy_optionmaster
vnpy_algotrading
vnpy_scripttrader
vnpy_portfoliomanager
vnpy_portfoliostrategy
vnpy_paperaccount
vnpy_excelrtd
vnpy_rpcservice

vnpy_sqlite
vnpy_mysql
vnpy_postgresql
vnpy_mongodb
vnpy_influxdb
vnpy_dolphindb
vnpy_leveldb

vnpy_rqdata
vnpy_tushare
vnpy_tqsdk
vnpy_udata
vnpy_tinysoft
vnpy_ifind
vnpy_wind

自己安装真的很麻烦,会劝退很多人,VNpy本身学习路线就比较陡峭,所以:
推荐还是直接安装官方提供的一键安装包最省心。


写个策略走遍流程

接下来带大家走一遍如何自己写一个双均线策略的流程,估计大部分人会选择官方出的一键安装包,所以以下教程均基于一键安装包来完成。

顺便说一句,一键安装包本质上是官方把python环境和需要用到的大部分包给你打包起来了,就不需要我们pip install了,有点像Anaconda,会给你的环境默认安装许多有用的包。本质上就是一个装了Vnpy包的python环境。

双均线大家都很熟,这里就不赘述了。

1. 运行环境
在电脑桌面找到VeighNa Station

双击运行
第一次打开需要登录,有帐号的直接登录,没有的注册一个

2. 配置行情数据源
这里以tushare为例,官方安装包里没有默认安装对应获取tushare数据的包,需要安装下
如果你把官方安装包的python已经配置到环境变量了,那么直接运行

pip install vnpy-tushare

有时候你不想改系统设置,又想短时间用一下,你可以临时加个环境变量用:

set PATH=C:你的Python路径;%PATH%
# 比如我的vnpy安装到了H:programvnpy 就执行
set PATH=H:programvnpy;%PATH%
# 然后执行
pip install vnpy-tushare

vnpy-tushare安装好以后,在VeighNa Station找到交易按钮然后点击,然后勾选CtaBacktester,修改运行目录,比如:H:huajie_pythonvnpy_demo,最后点击启动即可

在打开的页面点击配置

红框中的datafeed.namedatafeed.username 按照花姐填的来填,datafeed.password改成你在tushare平台里的token,配置好重启下软件就可以了

3. 写个策略
我们在运行目录(比如H:huajie_pythonvnpy_demo)新建一个strategies文件夹,然后把自己写的策略放进去就可以被VeighNa Station读到了

进入到CTA回测页面

点击重载策略

就可以在交易策略下拉框看到我们刚刚写的策略了


这是官方给的双均线策略示例代码,可以在这个基础上修改

from vnpy_ctastrategy import (
    CtaTemplate,
    StopOrder,
    TickData,
    BarData,
    TradeData,
    OrderData,
    BarGenerator,
    ArrayManager,
)


class ADemo(CtaTemplate):
    """"""
    author = "官方"

    fast_window = 10
    slow_window = 20

    fast_ma0 = 0.0
    fast_ma1 = 0.0

    slow_ma0 = 0.0
    slow_ma1 = 0.0

    parameters = ["fast_window", "slow_window"]
    variables = ["fast_ma0", "fast_ma1", "slow_ma0", "slow_ma1"]

    def __init__(self, cta_engine, strategy_name, vt_symbol, setting):
        """"""
        super().__init__(cta_engine, strategy_name, vt_symbol, setting)

        self.bg = BarGenerator(self.on_bar)
        self.am = ArrayManager()

    def on_init(self):
        """
        Callback when strategy is inited.
        """
        self.write_log("策略初始化")
        self.load_bar(10)

    def on_start(self):
        """
        Callback when strategy is started.
        """
        self.write_log("策略启动")
        self.put_event()

    def on_stop(self):
        """
        Callback when strategy is stopped.
        """
        self.write_log("策略停止")

        self.put_event()

    def on_tick(self, tick: TickData):
        """
        Callback of new tick data update.
        """
        self.bg.update_tick(tick)

    def on_bar(self, bar: BarData):
        """
        Callback of new bar data update.
        """
        self.cancel_all()

        am = self.am
        am.update_bar(bar)
        if not am.inited:
            return

        fast_ma = am.sma(self.fast_window, array=True)
        self.fast_ma0 = fast_ma[-1]
        self.fast_ma1 = fast_ma[-2]

        slow_ma = am.sma(self.slow_window, array=True)
        self.slow_ma0 = slow_ma[-1]
        self.slow_ma1 = slow_ma[-2]

        cross_over = self.fast_ma0 > self.slow_ma0 and self.fast_ma1 < self.slow_ma1
        cross_below = self.fast_ma0 < self.slow_ma0 and self.fast_ma1 > self.slow_ma1

        if cross_over:
            if self.pos == 0:
                self.buy(bar.close_price, 1)
            elif self.pos < 0:
                self.cover(bar.close_price, 1)
                self.buy(bar.close_price, 1)

        elif cross_below:
            if self.pos == 0:
                self.short(bar.close_price, 1)
            elif self.pos > 0:
                self.sell(bar.close_price, 1)
                self.short(bar.close_price, 1)

        self.put_event()

    def on_order(self, order: OrderData):
        """
        Callback of new order data update.
        """
        pass

    def on_trade(self, trade: TradeData):
        """
        Callback of new trade data update.
        """
        self.put_event()

    def on_stop_order(self, stop_order: StopOrder):
        """
        Callback of stop order update.
        """
        pass

4. 回测

点击回测,然后把这些参数配置下
在这里插入图片描述

很快回测结果就出来了

图片[1] - 史上最详细的VNpy入门教程,从图文安装教程到手搓策略一步到位 - 宋马
图片[2] - 史上最详细的VNpy入门教程,从图文安装教程到手搓策略一步到位 - 宋马

从安装到实现你的一个vnpy策略花姐已经带大家走通了。如果喜欢记得点个推荐

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容