vn.py量化社区
By Traders, For Traders.

置顶主题

ubuntu 18.04 安装 vnpy2.0.9 总结

有些图片不好弄,可以去这里找原文看,排版好一点
1.更新源
刚刚安装好的Ubuntu18.04没有vim,为了后面修改文件,先安装vim
sudo apt-get install vim
在ubuntu 18.04中,按照之前的博文《linux常用命令》修改成源阿里云的源。我们把代码粘贴在这里:

备份配置文件

sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

打开文件

sudo vim /etc/apt/sources.list

重开终端,查看版本代号

lsb_release -c

#Ubuntu 12.04 (LTS)代号为precise
#Ubuntu 14.04 (LTS)代号为trusty
#Ubuntu 15.04 代号为vivid
#Ubuntu 15.10 代号为wily
#Ubuntu 16.04 (LTS)代号为xenial
#Ubuntu 18.04 代号为bionic

更新文件如下

deb http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse

更新文件列表

sudo apt-get update

2.安装Miniconda3

build-essential不能少,apt-get安装之。
sudo apt-get install build-essential
之后安装Python运行环境,Miniconda是轻量化的python包管理器。
安装Miniconda,获得Python 3.7运行环境(为vnpy2.0.9匹配)。具体方法是去官网下载Miniconda3-latest-Linux-x86_64.sh,在终端直接bash即可。
bash Miniconda3-latest-Linux-x86_64.sh
最后一步记得选yes

3.安装postgresql包

安装过程vnpy之前,需要一个叫postgresql的包,少不了,网上有用源码安装或者用yum安装的,都不好。源码太麻烦,yum容易跟apt抢戏。

最好的是下面的方法:
sudo vim /etc/apt/sources.list.d/pgdg.list

加入如下内容

deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

最后

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
还要增加一个包libpq-dev
sudo apt-get install libpq-dev
sudo vim /etc/apt/sources.list.d/pgdg.list

加入如下内容

deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main

最后

wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
还要增加一个包libpq-dev
sudo apt-get install libpq-dev

4.安装vnpy2.0.9
下载vnpy2.0.9,解压。切换到vnpy2.0.9目录下,bash文件install.sh安装。sudo执行时会重置环境变量,导致miniconda在普通用户的.bashrc的设置失效。具体地可以从/etc/sudoers文件里的env_reset中得到佐证。要解决bash与sudo命令的冲突,可以进行如下命令进行安装:
sudo PATH=/home/han/miniconda3/bin:$PATH bash install.sh

*可选操作
即使如此,还是会有个warning:WARNING: The directory '/home/zhex/.cache/pip/http' or its parent directory is not owned by the curr
WARNING: The directory '/home/zhex/.cache/pip/http' or its parent directory is not owned by the curr
很容易理解,root并不拥有普通用户的所有文件,所以一些事情就没做,解决办法:
sudo chown -R root /home/han/.cache/pip/
sudo chown -R root /home/han/.cache/pip/http/
解决了warning。

5.VNPY运行
切换到vnpy-2.0.9的examples/vn_trader目录下,修改run.py注释掉四行,

from vnpy.gateway.femas import FemasGateway
from vnpy.app.option_master import OptionMasterApp
main_engine.add_gateway(FemasGateway)
main_engine.add_app(OptionMasterApp)
最后下在该目录下
python run.py



《vn.py 2.0.7源代码深入分析》

继续分享vn.py的学习文档。这个文档上个月叫《vn.py 2.0.7代码分析入门》,只包含本文档的第一部分。当时正在全面调研各类量化交易平台,对vn.py只做初步了解。现在准备进一步学习vn.py,也就有了本文档的第二部分。说到调研,我没资格评价哪个好哪个稍差,此处只是汇报我个人的一个情况:在调研了一圈之后,现在又回过头来研究vn.py了。
文档没有完成。本想完成后再发出来,但不想继续写了,就把现在已经写的部分发出来吧。不完整,各位老师勿怪。

文档链接:https://pan.baidu.com/s/1KUxTcMD8hY6eIqEBoNk3Tg



Mac下vnpy安装运行交易的图文教程

尽管使用vn.py的用户使用windows或者linux服务器居多,但是社区内也有不少用户希望能在mac下运行vn.py进行数字货币的交易,本篇教程就针对如何在Mac系列的机器上成功运行vn.py连接coinbase数字货币交易所进行讲解。本文主要分以下几个部分:

  • python环境的安装
  • vn.py及依赖项的安装
  • 运行vn.py
  • 使用vn.py

 
python环境的安装
在mac下使用miniconda可以省去很多不必要的麻烦。
打开Minconda官网:https://docs.conda.io/en/latest/miniconda.html, 选择MacOSX Installer下的Python3.7,选择64位的pkg安装包进行下载并解压:
description
安装完毕后,在terminal输入python,会发现terminal自动将miniconda附带的python作为系统默认python了。
description
 
安装vn.py
因为mac自带git神器,因此直接在terminal里下载vnpy即可:打开terminal,使用cd切换到想要下载的路径,然后输入以下命令:
description
上图我将vnpy整个文件夹clone至Desktop。当clone完毕后,在cd进入vnpy文件夹,输入如下命令:
description
(注,cd的是一个命令,例如我要切换到/Users/limingfang/Desktop/,则只需要在terminal输入

cd /Users/limingfang/Desktop

安装的时间比较久,需要耐心等待。
在安装完成后,vn.py以及依赖项就被安装至Miniconda的python库中了。
注意:如果启动VN Trader时报错说缺少了pyqtgraph和zmq等库,即出现如图一的报错,直接用pip工具安装即可,在terminal中运行图二中的命令即可(笔者在解压完vnpy包后,发现还需要安装pyqtgraph和zmq)。
description
description

 

启动vn.py
在上述安装全部完成后,即可开始运行vn.py。
在terminal中将路径切换至clone的vnpy路径,比如vn.py被我cloned在/Users/limingfang/Documents/Github/cloned,那么输入以下命令即可切换到vn.py中的vn_trader目录并启动vn.py图形化界面:
description
其中红框内的路径每个用户都不一样。紧接着会跳出一个比较精致的VN Trader图形化界面。
description
 

使用vn.py
该部分主要说两点:简要说明图形化界面的使用,vn.py在mac上可使用的接口。
在图形化界面上方,“系统”栏提供了连接接口的选项,“功能”栏提供了vn.py开放给用户的一些App例如CTA回测等,“帮助”栏提供了查询合约的功能,用于提供交易所合约代码与vn.py内部合约代码映射的信息。注意,在mac下没有“配置”栏,如果想要修改全局配置,可以直接修改源文件。VN Trader界面启动后默认会在当前用户主目录下创建一些隐藏文件夹以存放一些配置信息,在mac下用户目录是在 “/Users/limingfang/”(limingfang是我的mac用户名)。
description
上图是最初.vntrader文件夹内的内容,其中connect_bitmex.json等connect_xxx.json类文件存放接口配置信息,database是默认的sqlite数据库的文件,vt_setting.json用于配置图形化界面字体,rqdata,数据库等,rpc_service_setting.json一般不需要修改。
如果需要修改某个文件,按下图操作即可打开相应文件。
description
 
目前2.x版本的vn.py,在windows下所有交易接口都可以使用,而在OSX系统下只能使用一部分:
纯Python类接口:IB、TIGER、FUTU
IB(盈透证券)、TIGER(老虎证券)、FUTU(证券)这三个接口,使用的是其官方提供的纯Python SDK,直接进行接口函数的对接开发。得益于Python本身的跨平台解析性语言特点,这类接口在OSX系统下也能直接使用。
REST/WebSocket协议类接口:所有数字货币、Alpaca
当今几乎所有的数字货币交易所,都提供了基于REST协议(下单、查询)和WebSocket协议(行情、推送)的API,部分外盘的股票期货经纪商也开始提供这块的支持(如美股0佣金券商Alpaca)。

此外,对于在mac电脑上使用vn.py的用户,交易一些数字货币的时候,可能会碰到需要交易某些标的(例如某些数字货币合约)而网络不通的问题,因此接下来介绍如何利用shadowsocks在mac上进行翻墙从而交易国外的一些合约。
最近比较敏感,本来笔者有详细的介绍如何安装及使用,现在只简单说说如何在vnpy连接接口的时候使用shadowsocks。

使用Shadowsocks
下载配置Shadowsocks后,在vn.py中连接一些大陆外的接口(例如Coinbase)时,需要提供:
- proxy_host
- proxy_port  
一般如下图所示进行配置即可:
description



看完这篇,彻底搞定期货穿透式CTP API接入

操作流程

不多废话先上结论(操作流程图):

description

下面是步骤说明,只要照着做100%可以搞定!!!

 

第一步:申请穿透式接入

电话联系你的客户经理,向期货公司申请进行穿透式接入测试。如果期货公司服务质量较好,可能已经主动联系你邀请测试了。

 

第二步:填表提交AppID

填写申请表,每家期货公司有所区别,但整体上需要提供的信息可能包括:

  • CPU序列号
  • 硬盘序列号
  • 硬盘主分区盘符和大小
  • 网卡MAC地址
  • 内网IP和外网IP
  • 交易程序的AppID

以上多条信息的获取,就需要用到cmd中的系统命令工具了。

输入以下命令获取CPU序列号:

wmic cpu get processorid

逐条输入以下命令,获取硬盘序列号、主分区盘符和大小:

diskpart
select disk 0
detail disk

输入以下命令,“以太网适配器”下的“物理地址”就是MAC地址,“IPv4地址”就是内网IP:

ipconfig /all

访问www.ip138.com获取你的外网IP,或者直接百度搜索“IP”也行。

最后的AppID,是一个由用户提供的交易程序代码,以个人身份申请时,格式为:

client_xxxx_yyyy

其中xxxx是你的软件名称,yyyy是版本号,这两个字段都是客户自己填的信息(没有固定规则),以vn.py的v2.0版本为例,AppID可能为:

client_vnpy888_2.0

其中888的部分,是自定义的一个字符串,主要为了避免你的AppID和其他人重复,你可以选择随意选择:姓名拼音缩写、某个数字、幸运词......

 

第三步:拿到AuthCode

提交申请表后,一般当天或者第二天就能拿到期货公司针对你的这个AppID提供的测试账号信息,包括:

  • 用户名、密码
  • 经纪商代码、仿真测试服务器地址(交易、行情)
  • 产品名称(你填的AppID)、授权编码(AuthCode)

 

第四步:仿真测试

我们这里测试环节以最新版的VN Studio为例,如果没有的话请点击下载:VNStudio-2.0.3。同样你也可以选择使用任何其他的软件程序来操作,如果不幸掉坑后爬不出来的话再回到VN Station好了。

双击桌面的VN Station图标,启动后会弹出登录框。如果是第一次使用,请点击“微信登录”按钮,扫描二维码后注册VN Station账号(同样也是vn.py官方社区论坛www.vnpy.com的登录账号),如果已经有账号了可以直接输入后点击“登录”。

description

登录完成后会看到VN Station主界面,此时请点击底部的“VN Trader Pro”,并在弹出的目录选择对话框中直接点“选择文件夹”按钮(即在默认的Windows用户目录下启动VN Station):

description

随后会弹出配置VN Treader的对话框,注意此时请一定只勾选加载CTPTEST接口,千万不要同时勾选加载CTP接口,会因为dll冲突导致后续测试失败!!!!

description

在VN Trader主界面上,点击左上角的“系统”->“连接CTPTEST”,在弹出的登录配置对话框中输入期货公司提供的测试账号信息(产品名称就是AppID),点击连接按钮后登录CTP穿透式测试用服务器:

description

当VN Trader左下角的日志监控组件中,刷新出熟悉的日志信息,看到“合约信息获取成功”的时候,就意味着我们已经完成测试了!

 

第五步:期货公司校验

搞定上面的测试服务器连接登录后,就可以联系期货公司进行校验工作了,通常可以一次性直接通过,如果遇到不通过的情况请查看本文最后的常见问题来解决。

 

第六步:实盘接入

期货公司校验通过后,会将客户申请的AppID和AuthCode添加到实盘CTP的服务器上,此时只要把启动VN Trader Pro时,加载的接口由CTPTEST改为CTP,就可以连接上实盘交易环境,和以往一样进行量化交易了。

description

 
 

名词解释

穿透式监管

新的监管模式主要是明确了期货公司对于其客户交易行为的管理责任,因此需要对所有接入交易柜台系统的交易终端软件进行认证管理,防止坏人耍流氓后一走了之,难以追查。

穿透式API

穿透式监管的主要实现工具,支持对交易终端机器的信息采集功能(即采集之前提到的CPU序列号、MAC地址等信息),并在加密后直接上传期货市场监控中心。除了本文中用到的CTP穿透式API外,其他的柜台也都提供了对应的穿透式API版本:恒生、易盛、飞创等,操作方法基本类似。

执行日期

在6月14日当天,所有期货公司的柜台系统全部强制升级为穿透式监管版本,老的非穿透式柜台会全部下线,没有所谓的“过渡期”,现在就已经是“过渡期”了!!!还有不到两周的时间,所有通过API接入交易的用户请赶紧吧,不要到了那天没法交易才着急,而且普遍的拖拉习惯,目前在申请接入测试的客户与日俱增,也对期货公司每天繁忙的后台IT部门表示感谢。

6.3.13

CTP穿透式柜台的仿真测试版本,也是CTPTEST接口中使用的API版本,所有客户的仿真接入认证测试都必须使用该版本!主要因为该版API采集客户的信息是没有加密的,期货公司可以在后台查看来进行认证工作。

6.3.15

CTP穿透式柜台的实盘交易版本,也是CTP接口中使用的API版本,完成仿真接入测试后,必须使用该版本才能连接实盘交易的CTP柜台。该版本的采集信息是安全加密的,期货公司的IT用后台系统也看不到。

直连模式

指的是所有用交易程序直接使用CTP的API连接CTP柜台,进行行情获取和委托交易的情况,几乎所有自主开发或者使用开源框架的量化交易客户都属于这种情况,直接使用穿透式监管版本的API进行开发就行(带_se后缀的)。

中继模式

指的是:交易客户端->中继服务器->CTP柜台,采用这种连接模式主要包括商业量化交易软件(比如文华财经)以及机构量化资管系统(比如O32),只有中继模式才需要用到那个DataCollect.dll文件。

 
 

API内部工作流程

同样以CTP为例:

  1. 调用Init,开始连接
  2. 收到OnFrontConnected,确认连接成功
  3. 调用ReqAuthenticate,这一步填入AppID和AuthCode,进行认证
  4. 收到OnRspAuthenticate,确认认证成功
  5. 调用ReqUserLogin,这一步同样需要填入AppID,进行登录
  6. 收到OnRspUserLogin,确认登录成功

只有交易接口TD需要进行认证,MD直接登录就行。每一步出错的话都会有相应的报错输出提示,查看错误信息内容后照着修改就行。

 
 

常见问题

哪个版本的vn.py目前支持穿透式API?

最新的v2.0.3发布版本(Py3 64位),和v1.9.2-LTS版本(Py2 32位),都支持了穿透式API,推荐使用Windows进行相关测试工作(Linux上需要自己调整链接库做编译)。

更新后SimNow环境连不上了!

截止目前的2019年6月1日,SimNow上的交易测试环境(包括第一套和第二套)依旧为非穿透式的老版本,因此用穿透式版本的API都是连不上的。

SimNow的终端厂商测试环境连上后没有行情!

SimNow所提供的6.3.13测试环境,目前仅仅为了满足用户的穿透式版本测试需求(也就是能成功登录上来查询一下合约信息等),尚未提供第一套或者第二套环境中的仿真行情以及仿真交易功能,所以:就是没有行情的~

报错4097,cmd有输出Decrypt handshake data failed

这是因为你的API版本和服务器的版本不一致导致的,请按照以下流程排查:

  1. 是否同时import了CTP(CtpGateway)和CTPTEST(CtptestGateway)接口,如有请移除另一个(两个同时加载会冲突)
  2. 确保使用CtptestGateway来连接6.3.13穿透式测试环境,用CtpGateway来连接6.3.15穿透式实盘环境
  3. v2.0.3以及v1.9.2-LTS(最新Github代码)都已升级到穿透式API,因此无法用于连接SimNow的老版本环境

UserProductInfo字段是用来干嘛的?

该字段是之前非穿透式API时,用来进行客户认证的产品名称字段(配合AuthCode一起)。穿透式版本接入的方案文档并没有对该字段的强制要求,目前我们这边已经对接了的5家期货公司也均未要求使用,但听说某些公司需要:如中信建投等,如果有了解其他公司情况的请在评论中分享。

能否使用云服务器或者虚拟机进行测试认证?

虚拟机和云服务器,对于本文开头部分提到的CPU序列号、硬盘序列号等信息,有可能获取不全或者部分字段不符合规定。目前有些期货公司要求严格,必须全部能正确获取到,且和第二部申请表中填写的内容一致,才能算认证测试成功;另一些公司则是十分宽松,表也不用填,采集信息也不看,只要登录上来就算测试通过。

所以,能否使用云服务器和虚拟机,完全取决于你开户的这家期货公司了。

如果使用v1.9.2之前老版本的vn.py怎么办?

请将v1.9.2的以下内容复制到你的老版本对应的目录下:

  • vnpy/api/ctp
  • vnpy/trader/gateway/ctpGateway
  • vnpy/trader/gateway/ctptestGateway

并采用上文提到的方式去做认证。

6.3.15的穿透式实盘API,想进行下测试怎么办?

目前只发现中信期货提供了6.3.15的仿真测试环境(忍不住竖起大拇指,不愧是中信),但最近估计申请人数过多,新的申请处理非常缓慢,如果大家发现别家提供6.3.15的测试环境也欢迎在评论里告知。

为什么期货公司一定要用6.3.13和6.3.15两个版本,接下来是否会合并都使用6.3.15?

为了满足穿透式监管认证要求,期货公司认证时要看到客户机器采集的信息,就只能通过6.3.13版本的CTP API。而实盘交易的环境中,期货监控中心要求直接上报采集信息,禁止期货公司查看和修改,就必须通过6.3.15版本。

所以目前来看仿真和实盘使用两个版本的API,是监管中心比较放心得过的方案吧,也就意味着交易客户端必须要两套API都对接准备好了。



在BarData中加入当前成交总金额+MySQL中增加此字段的一些注意事项

最近策略研究方向中要使用到成交总金额(turnover),在这里中已经讲解了在实时的tickdata中加入成交总金额的方法。我沿着这个思路,增加修改的几个地方,实现在bardata中加入成交总金额。

注意一点是要先确保在tickdata中已成功加入成交总金额,再修改下面几个地方才能实现BarData中加入成交总金额。

1、object.py (为了上下文统一,所有的turnover改为小写,tickdata中也是)

class BarData(BaseData):
    ******省略
    interval: Interval = None
    volume: float = 0
    turnover: float = 0  ##增加,turnover小写
    open_interest: float = 0
    open_price: float = 0
    ******省略

2、database_sql.py(database_sql.py主要用于保存与读取数据库,也作修改,保证整个VNPY都能使用turnover)

def init_models(db: Database, driver: Driver):
    class DbBarData(ModelBase):
       ******省略
        volume: float = DoubleField()
        turnover: float = DoubleField()  ##增加,volume、turnover、open_interest改了Field类型,后面会说明原因
        open_interest: float = DoubleField()
        open_price: float = FloatField()
        high_price: float = FloatField()
        low_price: float = FloatField()
        close_price: float = FloatField()

        def from_bar(bar: BarData):
           ******省略
            db_bar.volume = bar.volume
            db_bar.turnover = bar.turnover  ##增加
            db_bar.open_interest = bar.open_interest
            db_bar.open_price = bar.open_price
            db_bar.high_price = bar.high_price
            db_bar.low_price = bar.low_price
            db_bar.close_price = bar.close_price

            return db_bar

        def to_bar(self):
            ******省略
                volume=self.volume,
                turnover=self.turnover,  ##增加
                open_price=self.open_price,
                high_price=self.high_price,
                open_interest=self.open_interest,
                low_price=self.low_price,
                close_price=self.close_price,
                gateway_name="DB",
            )
            return bar

3、utility.py(修改了合成1分钟Bar的update_tick(),update_bar()中window_bar.volume不知道为什么要对bar.volume整型处理,也先统一吧)

    def update_tick(self, tick: TickData):
        ******省略
        if self.last_tick:
            volume_change = tick.volume - self.last_tick.volume
            turnover_change = tick.turnover - self.last_tick.turnover  ##增加,对照volume
            self.bar.volume += max(volume_change, 0)
            self.bar.turnover += max(turnover_change, 0)   ##增加,对照volume
            # print(self.bar.turnover)
        self.last_tick = tick

    def update_bar(self, bar: BarData):
       ******省略
        # Update close price/volume into window bar
        self.window_bar.close_price = bar.close_price
        self.window_bar.volume += int(bar.volume)
        self.window_bar.turnover += int(bar.turnover)      ## 增加,对照window_bar.volume,不知道int()作用,int的范围更大?
        self.window_bar.open_interest = bar.open_interest

删除原来保存的bar数据库 database.db(会同时删掉dbtickdata表,或者可以直接删库下的dbbardata表),再重启VNPY,bardata中就加入了成交金额turnover。

完成上面的步骤后,输出bardata中的turnover,结果正确。我启动了datarecorder连接MySQL数据库,开始实时记录数据。发现turnover能够写入到MySQL中,但是后几位数字全是0。我在VNPY内各流程模块中打印出turnover,都是精确无误的,由此确定了问题应该出在本地的MySQL上。

查阅了peewee的文档,得知peewee的FloatField相当于MySQL的Real。MySQL中的Real一般是Float类型,在64位电脑上不设置长度、小数位,默认的Float精度只能到6位数,turnover存入时就溢出了。鉴于大于6位数挺常见的,所以将database_sql.py建表时的volume、turnover、open_interest改了Field类型为DoubleField(),问题解决。

还有几个注意要点:
①. VNPY的tick数据是CTP的源数据,turnover字段在郑商所中处理有点不太一样,turnover要乘以合约乘数才是真正的成交总金额。
②. 跟turnover相关还有一个是当日均价,这时郑商所是正确的,另外两商品交易所的要除以合约乘数。



一步步学会搭建阿里云Ubuntu

本教程使用MobaXterm、Xubuntu-destop、vnc4server来搭建阿里云ubuntu18.04。尽管过程有些复杂,但跟着图文教程一步一步去做,肯定能成功的。

第一步 安装MobaXterm

MobaXterm是一款增强型远程连接工具,可以轻松地来使用Linux上的GNUUnix命令。这样一来,我们可以不用安装虚拟机来搭建虚拟环境,然后只要通过MobaXterm就可以使用大多数的Linux命令。本教程主要使用MobaXterm的SSH和VNC功能:SSH可以想象成Ubuntu的终端(无图形界面),VNC是Ubuntu的图形操作界面。

首先,从官网下载MobaXterm (https://mobaxterm.mobatek.net/download-home-edition.html)

下载完成后解压安装包,直接双击.exe文件进行安装。

安装完成后,启动MobaXterm,在主界面中单击导航栏左边第一个【Session】进入连接页面。(或者单击点击菜单栏【Sessions】->【new Session】按钮也行)


 

在弹出的新页面Session Settings中,单击导航栏最左边的【SSH】按钮。然后在Basic SSH Settings中输入云服务器的公网IP和账号。其中默认账号是root,输入root账号之前记得把左边小方框的√打上,端口号保留默认的22。然后点击最下方的【OK】按钮。


 

之后会弹出一个新页面:第一次连接,左边的黑框会提示输入云服务器的密码(密码输入输入界面不会有任何反应)。输入完按回车键后,若密码正确,会弹出一个小窗口提示是否保存密码,可以点击【Yes】按钮。


 

出现下图就表示阿里云Ubuntu连接成功:左边是云服务器的文件夹,右边的黑框是命令操作界面。到这里,就完成了使用MobaXterm远程连接云服务器了。当然,这种连接是基于SSH连接的,只能使用阿里云Ubuntu的终端功能,图形化界面还需要另外搭建。

 

为了更好管理界面,需要进行一下重命名:鼠标点击最左边的【Session】选项,显示刚刚创建的SSH连接,鼠标选定该连接,右键选择【Rename session】 会弹出Session settings界面,在里面的Session name可输入新的名字,如DEV_1。
输入完毕,钮点击左下方的【OK】即可改名成功。



 

同理按照上面的操作,输入相同的云服务器的公网IP和账号,创建第二个SSH连接,命名为DEV_2。这样我们就能同时使用2个终端了。

 

第二步 更新软件仓库

Ubuntu系统在安装软件前,需要更新其软件仓储列表。这也是于Windows系统的一大差异。

在Windows下安装软件,我们只需要有.exe文件,然后一直双击【下一步】即可完成。但Linux并非如此:每个Linux的发行版,比如Ubuntu,都会维护一个自己的软件仓库,我们常用的几乎所有软件都在这里面。这里面的软件绝对安全,而且绝对的能正常安装。

故在Ubuntu下,我们需要维护一个源列表,源列表里面都是一些网址信息,这每一条网址就是一个源,这个地址指向的数据标识着这台源服务器上有哪些软件可以安装使用。

所以,为了能够正常安装软件,需要更新软件包管理器里里面的软件列表。在Ubuntu终端输入命令sudo apt-get update,会访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑。

 

第三步 安装Xubuntu-destop

Xfce是一款针对Linux系统的现代化轻型开源桌面环境。其最大的优点是内存消耗小系统资源占用率很低。但是Xfce用起来并不方便,需要另外安装其他包,如支持中文显示,安装火狐浏览器等。

而Xubuntu-destop则免去这个麻烦,它整合了Xfce桌面环境和其他支持包,让用户搭建起来更加方面。安装方法也相对简单,在终端中输入命令sudo apt-get install xubuntu-desktop即可。

 

第四步 安装vnc4server

VNC是一款基于RFB协议的屏幕画面分享及远程操作软件。它最大的特色在于跨平台性,即我们可以用Windows电脑控制Linux系统或苹果的Mac OS,反之亦然。

首先,安装VNC服务器:在终端下输入命令sudo apt-get install vnc4server

 

安装完毕后,在终端输入vncserver运行服务器,首次运行需要设置密码(长度至少是6位)并且二次输入来确认。
VNC连接好后可以看到其默认端口是1(红色方框标识“:1”)。

然而,尽管连接上VNC,不代表客户能够立刻实现图形化界面操作,还需要配置xstartup文件和配置MobaXterm的VNC设置。

首先,用文本编辑器nano打开xstarup文件,在终端输入命令nano ~/.vnc/xstartup,可以看到如下内容。

需要在最后一行 "x-window-manager &" 前面添加一个"#",以注释不再需要的配置。然后在文件最后加入一段配置信息:

sesion-manager & xfdesktop & xfce4-panel &
xfce4-menu-plugin &
xfsettingsd &
xfconfd &
xfwm4 &

修改完毕后,需要保存退出,nano保存退出的方法相对简单:按住“ctrl”和“x”键即可。

 
配置完xstarup后,还需要配置端口信息:先把默认的1号端口会话杀掉,然后生成新的会话,我们改成9号端口(因为1号端口容易被攻击),然后设置图形界面的分辨率位1920x1080。

注意:杀掉原先会话,建立新的会话,在每次启动VNC图形界面前都要做。

vncserver -kill :1
vncserver -geometry 1920x1080 :9

现在回到MobaXterm主界面,单击主页最上边的【Sessions】->【new Session】弹出【Sessions settings】界面,这一次选择【VNC】连接。
【IP address】为阿里云公网IP,【Port】为VNC连接端口,vncserver -geometry 1920x1080 :9意为在9号端口启动,故从默认的5900调整为5909。

在下面的【Bookmark settings】界面对该VNC连接进行重命名为“VNC”。输入完毕,钮点击左下方的【OK】按会弹出基于Xfce图形化界面。


 

第五步 安装IBus中文输入法

IBus中文输入法是Ubutnu常用的中文输入法。安装方法也比较简单,在终端中输入命令sudo apt install ibus-pinyin即可。

使用中文输入法之前需要配置中文语言包:

  • 在菜单栏左上方点击【Applications】->【Settings】->【Language Support】按钮;
  • 第一次会出现提示语言未全部安装,然后点击确认自动安装,成功后会弹出【Language Support】界面;
  • 完成后点击下方的【Install/Remove Languages】按钮,会弹出新的【Installed Languages】界面,勾选【Chinese(Simplified)】,即简体中文,然后点击下方的【Apply】按钮;
  • 最后在【Keyboard input method system】选项选择【IBus】。

 

设置完中文语言包后,进入IBus输入法设置:

  • 在菜单栏左上方点击【Applications】->【Settings】->【IBus Preferences】选项;
  • 第一次会提示IBus-Daemon尚未启动,点击【Yes】按钮进行安装,成功后菜单栏右上角出现一个语言图标,并且弹出【IBus Preferences】界面;
  • 进入【Input Method】界面,点击【Add】来添加中文输入法:选择【Chinese】->【Pinyin】
  • 鼠标右键点击菜单栏上的语言图标【Restart】按钮来重启
  • 然后再次左键点击,点击【Chines-Pinyin】就可以输入了。此时语言图标也变成“拼”字。





 

第六步 安装Vscode

Vscode是微软出品的轻量级代码编辑器,安装和使用起来非常方便。

首先通过火狐浏览器打开百度,搜索“vscode”,第一个就是官网地址。在官网首页安装点击下载.deb版本。

Ubuntu下的Vscode安装包是.deb格式的,需要用使用dpkg命令来安装。进入下载文件所在的目录/root/Downloads,鼠标在空白处右键点击【Open Terminal Here】进入终端,输入下面命令安装Vscode。

sudo dpkg -i code_1.37.0-1565227985_amd64.deb


 

安装完Vscode之后,发现不能正常启动,因为Xfce和Vscode的兼容性问题,在终端中输入下面命令即可正常运行。(命令输入后界面没有任何反应)

sudo sed -i 's/BIG-REQUESTS/_IG-REQUESTS/' /usr/lib/x86_64-linux-gnu/libxcb.so.1

 

第七步 安装Python3.7

阿里云ubuntu18.04 已经安装了Python2.7以及Python3.6,并且默认启动的是Python2.7。

 

而vn.py是基于python3.7。故面临着一个问题:需要把新安装的Python3.7设置位系统默认的Python环境,并且pip3安装库需要对应Python3.7,而不是原来的3.6版本。

这样的Python版本管理起来非常复杂,所以我们使用了MiniConda(Python3.7 64位),它是Anaconda的简化版。安装MiniConda后,会自动设置其Python3.7为系统默认环境,而且提供了conda install的命令代替的pip3来安装其他库。

Miniconda安装也是非常简单的,首先在百度上搜索“miniconda”,第一个就是官网下载地址。打开官网页面后,选择【Linux】系统的Python3.7【64-bit】版本来下载。下载完成后,进入文件所在目录/root/Downloads可以看到.sh格式的Miniconda安装包。鼠标在空白处右击点击【Open Teminal Here】进入终端,然后输入命令bash Miniconda3-latest-Linux-x86_64.sh进行安装。



 

安装完毕后重启MobaXterm后,终端输入Pyhton可以看到Python默认版本已经变成Python3.7了

 



Jupyter Notebook实现从IB接口历史数据获取,写入数据库,策略回测和实盘交易

刚好有个同学问怎么实现IB历史数据获取,和策略回测和实盘交易。想着熟悉vnpy2.0操作,就用Jupyter Notebook都是跑了一边。VNPY2.0的整体架构设计很有扩展性,而且调用也比起v1.0先进清晰很多,引擎加载调用非常方便。

讲讲注意点:

  1. IB接口历史数据大多是要收费的订阅的,如果收费会有报错信息提示,这里找个免费的作为使用。另外vnpy是按照最大6个月历史数据设计的。
  2. 数据库定义有个小坑,我是用mongodb的,在第一次填写 trader/setting.py中密码写错了,后面在trader/setting.py改发现怎么也改不好;原来当第一次维护后,配置会写入.vntrader/vt_setting,之后系统只会去.vntrader/vt_setting读取。去改vt_setting,而不是trader/setting.py。
  3. 使用CtaStrategyApp支持加入新策略,系统会自动输出json保持策略信息;所以第二次运行代码时候,会提示已经有了,不是问题。
  4. 我在代码里面把回测和实盘放在一次,如果直接跑下来可能会报错,建议跑实盘时候先注释的回测。
  5. 使用script_engine订阅历史数据是是默认从rqdata获取,vnpy v2.07 IB接口已经提供历史数据获取,这里创建HistoryRequest用main_engine来获取,

为了方便贴出来,改成.py代码格式,直接跑也没有问题。

from vnpy.app.script_trader import init_cli_trading
from vnpy.app.script_trader.cli import process_log_event
from vnpy.gateway.ib import IbGateway
from time import sleep
from datetime import datetime
import pandas as pd
# 连接到服务器
setting = {
    "TWS地址": "127.0.0.1",
    "TWS端口": 7497,
    "客户号":8 #每个链接用一个独立的链接号,一个IBAPI支持32个来同时链接
}
engine = init_cli_trading([IbGateway]) #返回Script_engine 示例,并且给main_engine注册了gateway
engine.connect_gateway(setting, "IB") #链接

# 查询资金 - 自动
sleep(10)
print("***查询资金和持仓***")
print(engine.get_all_accounts(use_df = True))
# 查询持仓
print(engine.get_all_positions(use_df = True))

# 订阅行情
from vnpy.trader.constant import Exchange
from vnpy.trader.object import SubscribeRequest
# 从我测试直接用Script_engine有问题,IB的品种太多,get_all_contracts命令不行,需要指定具体后才可以,这里使用main_engine订阅
req1 = SubscribeRequest("12087792",Exchange.IDEALPRO) #创建行情订阅
engine.main_engine.subscribe(req1,"IB")


# 使用script_engine订阅历史数据是从rqdata获取,vnpy v2.07已经提供历史数据获取,这里创建HistoryRequest来获取,
# 查询如果没有endtime,默认当前。返回历史数据输出到数据库和csv文件
# 关于api更多信息可以参见 https://interactivebrokers.github.io/tws-api/historical_bars.html
print("***从IB读取历史数据, 返回历史数据输出到数据库和csv文件***")
from vnpy.trader.object import HistoryRequest
from vnpy.trader.object import Interval
start = datetime.strptime('20190901', "%Y%m%d")

historyreq = HistoryRequest(
    symbol="12087792",
    exchange=Exchange.IDEALPRO,
    start=start,
    interval=Interval.MINUTE
)
# # 读取历史数据,并把历史数据BarData放入数据库
bardatalist = engine.main_engine.query_history(historyreq,"IB")
from vnpy.trader.database import database_manager
database_manager.save_bar_data(bardatalist)

# 把历史数据BarData输出到csv
pd.DataFrame(bardatalist).to_csv("C:\Project\\"+ str(historyreq.symbol) + ".csv" , index=True, header=True)
print("History data export to CSV")

# # 参考backtesting.ipynb, 使用自带的双均线策略回测,10日上穿60日做多,否则反之
print("***从数据库读取历史数据, 进行回测***")
from vnpy.app.cta_strategy.backtesting import BacktestingEngine
from vnpy.app.cta_strategy.strategies.double_ma_strategy import (
    DoubleMaStrategy,
)
btengine = BacktestingEngine() #新建回测引擎
btengine.set_parameters(
    vt_symbol="12087792.IDEALPRO",
    interval="1m",
    start=datetime(2019, 9, 1),
    end=datetime(2019, 10, 5),
    rate = 0,
    slippage=0.00005,
    size=1000,
    pricetick=0.00005,
    capital=1_000_000,
)
btengine.add_strategy(DoubleMaStrategy, {"fast_window":10, "slow_window": 60})

btengine.load_data()
btengine.run_backtesting()
df = btengine.calculate_result()
btengine.calculate_statistics()
btengine.show_chart()

# 给script_engine载入双均线策略,实盘运行
print("***从数据库读取准备数据, 实盘运行***")
# 使用cta交易引擎
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_strategy.base import EVENT_CTA_LOG
engine.event_engine.register(EVENT_CTA_LOG, process_log_event)
cta_engine = engine.main_engine.add_app(CtaStrategyApp) #加入app
cta_engine.init_engine()
cta_engine.add_strategy("DoubleMaStrategy","DoubleMaStrategy_IB_12087792_v1", "12087792.IDEALPRO",{"fast_window":10, "slow_window": 50})
sleep(10)
cta_engine.init_strategy("DoubleMaStrategy_IB_12087792_v1")
sleep(10)
cta_engine.start_strategy("DoubleMaStrategy_IB_12087792_v1")


关于使用redis分发行情以及多开gateway实现真正的多账户交易方法

  1. 首先需要保证vt_symbol的唯一,我使用的vt_symbol格式是self.vtsymbol = f"{self.symbol}{self.exchange.value}/{self.gateway_name}"。vnpy\trader\object.py里面的所有类都要继承BaseData,然后就是添加gateway_name参数到其他使用到object.py里面的类。举个例子

    @dataclass
    class HistoryRequest(BaseData):
     """
     Request sending to specific gateway for querying history data.
     """
    
     symbol: str
     exchange: Exchange
     start: datetime
     end: datetime = None
     interval: Interval = None
     #--------------------------------------------------------------------------------------------------
     def __post_init__(self):
         """"""
         self.vt_symbol = f"{self.symbol}_{self.exchange.value}/{self.gateway_name}"

    然后其他地方引用到HistoryRequest的地方添加gateway_name参数

     #-------------------------------------------------------------------------------------------------   
     def query_history(self,event):
         """查询合约历史数据"""
         if len(self.history_contract) > 0:
             symobl,exchange,gateway_name = extract_vt_symbol(self.history_contract[0])
             req = HistoryRequest(
                 symbol = symobl,
                 exchange = Exchange(exchange),
                 interval = Interval.MINUTE,
                 start = datetime.now() - timedelta(days = 1),
                 gateway_name = self.gateway_name
             )
             self.rest_api.query_history(req)
             self.history_contract.pop(0)

    需要分解vt_symbol建议使用extract_vt_symbol函数

    #------------------------------------------------------------------------------------
    def extract_vt_symbol(vt_symbol: str):
     """
     返回(symbol:str, exchange: Exchange,gateway_name:str)
     """
     *symbol_1, exchange_gateway_name = vt_symbol.split('_')
     exchange,gateway_name = exchange_gateway_name.split('/')
     if len(symbol_1) == 1:
         symbol = symbol_1[0]
     elif len(symbol_1) == 2:
         symbol = "_".join([symbol_1[0],symbol_1[1]])
     elif len(symbol_1) == 3:
         symbol = "_".join([symbol_1[0],symbol_1[1],symbol_1[2]])
     elif len(symbol_1) == 4:
         symbol = "_".join([symbol_1[0],symbol_1[1],symbol_1[2],symbol_1[3]])
     return symbol, Exchange(exchange),gateway_name


vn.py发布v2.0.9 - 期权交易

2019年已经进入最后倒计时,vn.py总算是赶上末班车发布了v2.0.9版本:期权交易。

 

本周一,国内三大沪深300指数相关的期权已经同时上线,分别是:

 

  • 中金所股指期权
  • 上交所300ETF期权
  • 深交所300ETF期权

 

2.0.9版本主要更新了围绕期权交易方面的接口和应用,和之前一样,对于使用VN Studio的用户,启动VN Station后,直接点击界面右下角的【更新】按钮就能完成自动更新升级。

 

对于没有安装的用户,请下载VNStudio-2.0.9,体验一键安装的量化交易Python发行版,下载链接:

 

https://download.vnpy.com/vnstudio-2.0.9.exe

 
 

OptionMaster模块

 

OptionMaster是vn.py框架内针对【期权波动率交易】专门设计的上层应用模块。

 

description

 

初始化配置
 

description

 

打开OptionMaster后,会看到上图中的长条形组件。【期权产品】下拉框中会显示当前已连接的交易接口上可选的期权产品组合。

 

注意底层接口必须支持期权合约的交易,这里才会有对应期权产品的显示,否则是不会有任何信息的(比如连接SimNow的CTP测试环境就没有)。

 

description

 

点击【配置】按钮后,弹出上图所示的组合配置对话框,在这里选择要用的期权定价模型,设置期权定价中用到的无风险利率,以及每个期权链定价所用的标的物合约。

 

注意期权链的标的物可以选择留空,此时该期权链在后续的交易中将不会被添加到期权组合中,可以降低一部分定价相关的计算延时。

 
 

期权定价
 

做期权交易,第一步总是离不开正确的定价,针对国内的期权类型,OptionMaster模块中内置了三大定价模型:
 

  • Black-76模型:针对欧式期货期权(股指期权)
  • Black-Scholes模型:针对欧式股票期权(ETF期权)
  • Binomial-Tree模型:针对美式期货期权(商品期权)

 
每个定价模型中,从计算方向来区分,又可以分为:

 

  1. 从定价波动率来计算期权价格:calculate_price相关函数,包括希腊值相关的计算函数calculate_greeks;
  2. 从期权价格来返推隐含波动率:calculate_impv函数,使用Newton-Raphson method(牛顿迭代法)来计算。

 

所有模型中都包含了输入数值的边界检查功能,避免计算出某些异常数值。

 
 
数据模型

 
期权相关的量化交易,和CTA策略等单标的量化交易相比,最大的区别之一就在于会同时交易大量的合约,包括不同行权价的期权、不同行权月份的期权以及标的物期货和股票(线性资产)。

 

同时以上合约之间的价格、成交、持仓等情况变化还会互相影响。在任意时间点结合当前最新行情数据的情况下,期权交易员需要能够实时跟踪整个期权交易组合的波动率曲面和希腊值风险情况。

 

OptionMaster中专门构建了多层嵌套式的立体数据结构,来解决以上多合约数据计算中的复杂性问题:

 

  • UnderlyingData:标的物合约(线性资产)
  • OptionData:期权合约(非线性资产)
  • ChainData:期权链(某一行权月份的所有期权合约)
  • PortfolioData:期权组合(某一品种的所有期权合约,以及标的物合约)
     

当以上数据结构中的任意一个数据发生变化时,会同时触发与之相关的所有计算,保证整体数据结构的一致性。

 
 
T型报价

 

T型报价是期权交易中最常用的行情显示方式,中间白色的一列为行权价,左侧为看涨期权,右侧为看跌期权。

 

description

 
上图中,除了由交易接口层推送过来的原始行情数据外(买卖价格、挂单数量、成交量、持仓量等),还包含了实时计算的买卖价隐含波动率和每个期权的现金希腊值。

 

传统意义上的理论希腊值,直接基于期权定价模型计算,衡量的是当某一变量发生变化时期权价格的变化情况。这种方法从数学的角度容易理解,但是从交易员的实盘使用来说却十分麻烦。
 

假设某个50ETF期权合约的Delta数值,使用Black-Scholes期权定价公式计算出来的结果为0.5482,意味着每当ETF价格上涨1元时,该期权的价格应该上涨0.5482元。

 

而50ETF当前的价格大约是3元,上涨1元是足足超过30%的涨幅,对交易员来说,知道【标的物价格上涨30%期权能赚0.5482元】不能说完全没有参考价值,但效果可能也就跟【每天喝10瓶可乐一定会胖】差不多。

 

所以在实践中,专业期权交易员更多使用的是现金希腊值,衡量的是当某一变量发生1%变化时该期权对应的现金盈亏情况。还是用上面的这个50ETF期权合约,其现金Delta为:

 

0.5484(理论Delta)x 3(标的价格)x 10000 (合约乘数)x 1% = 165
 

这里的165,意味着每当ETF价格上涨1%时,持有1手该期权合约的盈利金额是165元,实盘交易中用来判断某个合约当前的风险水平无疑要方便得多。

 

除了Delta数据外,理论Gamma/Theta/Vega等希腊值也可以同样转化为更加直观的现金希腊值。

 
 
希腊值风险
 

description

 
有了现金希腊值,可以在交易前方便直观的了解某一期权合约的风险水平。但在交易完成后,手头持有一堆期权和标的物持仓时,我们更需要持仓希腊值来跟踪当前整个账户的期权风险暴露:

 

持仓希腊值 = 现金希腊值 x 合约持仓

 

上图中的持仓希腊值的风险,分为单合约、期权链、期权组合三个层次统计,方便交易员结合各种不同类型的波动率交易策略使用(如做多近月波动率、做空远月波动率)。

 
 
快速交易
 

description

 
和VN Trader主界面的交易下单组件使用类似,在上图中的【代码】编辑框中输入合约代码后回车,即可显示该合约的行情盘口数据。或者在T型报价组件上,寻找到好的交易机会后,双击单元格即可完成合约代码的自动填充和行情显示。
 

选好方向、开平,输入价格、数量后,点击【委托】按钮即可立即发出交易委托,点击【全撤】按钮则可一次性将当前处于活动状态的委托(未成交、部分成交)全部撤单。
 

 

期权相关接口

 

2.0.9版本中同样更新完善了和期权相关的交易接口,目前针对期权合约可用的包括:

 

  • CTP期货接口(ctp):可交易股指期权、商品期权
  • 飞马四所接口(femas):可交易股指期权、商品期权
  • CTP期权接口(sopt):可交易ETF期权

 

目前所有的ETF期权程序化交易(包括sopt),都需要曾经向上交所报备过、有程序化交易权限的老账户,有小道消息传闻新账户的报备将在最近放开。

 

此外2.0.9中还新增了数字货币期权交易所Deribit的交易接口,和JEX/OKEX等每个行权月份只提供一个行权价的伪期权不同,Deribit交易所是有完整期权链的正经期权交易所。不过由于其期权合约采用了币本位反向合约的设计,目前还无法在OptionMaster模块中交易,预计将会在后续版本中支持。

 

 

OptionMaster Pro

 

最后,附上开发中的OptionMaster Pro期权交易系统,采用vn.py框架以及OptionMaster模块组件开发。

 

description

 
除了在核心的定价模型方面进行了Cython低延时优化,也加入了波动率曲面实时跟踪、持仓风险情景3D分析、期权组合Delta自动对冲算法等功能。

 

最后,还有针对期权高频套利设计的电子眼算法引擎(开发中尚未完成):
 

description

 
考虑到几大股指期权刚上线,期权程序化交易方面的监管尚未明朗,OptionMaster Pro目前仅对机构用户提供试用。

 

需要下载软件的用户,请加vn.py机构用户群(QQ群号676499931),本群只对机构用户开放,加群申请中请注明:姓名/机构/部门。

 
 
了解更多知识,请关注vn.py社区公众号。
 

description



vn.py 2.0.7源代码分析入门

学习vn.py有一个星期了,时间上绝对是新手。但以前除了自己编程,还有挺多分析别人程序的经历,包括SQLite、MySQL、PostgreSQL、Weka、Tanagra等,分析vn.py时可以少走不少弯路。
学习vn.py这么好的程序,一个星期肯定不够,我也会继续学习,也会继续整理文档。但把这个时间点的新手文档发出来,或许对同辈新手更有帮助,咱们可能正走着同样的路,而且可能就是肩并着肩。
不同人分析源码的方法不同,有的人是直奔目标模块深入分析,而我喜欢先搞清代码的整体结构。本文主要介绍以数据结构为基础的各模块之间的调用关系,没有深入到任何模块。如果您不喜欢这种方式,就不用再往下看了。
文档不长,只能作为后续分析工作的基础。本文从vn.py源码的下载、安装、主程序入口、主窗口入手,先跟您一起把源码运行起来。再聚焦于vn.py的一个重要应用“CTA回测”,从各个层次上分析其源码,包括相关的数据库操作、多线程机制、事件引擎机制等,把这个应用从顶到底,再从底到顶贯通起来。明白了这些内容,再分析其它的功能就会事半功倍。
文档链接:https://pan.baidu.com/s/1kFoFxREg4OzX3aBrWdxl2g&shfl=sharepset
提取码:tana


统计

主题
2256
帖子
8146
已注册用户
8933
最新用户
在线用户
112
在线来宾用户
125
© 2015-2019 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号-3