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

置顶主题

三行代码 解决国内期货10.00到10.15的数据合成缺失问题

https://www.vnpy.com/forum/topic/3409-wei-shi-yao-ni-de-hui-ce-ce-lue-he-bie-de-ping-tai-bu-tai-yi-yang?page=1#pid12167
这是我之前的帖子,为什么你的回测策略和别的平台“不太一样”

vnpy的商品期货30分钟周期的每天的10点到11点的数据是没有的,别的时间比如9.30-10.00都是
有数据的但是10.00到10.30是没有数据的,直接是10.00到11.00,少了这一部分的分钟的数据,
也就是说商品期货休息的这段时间没有数据但是事实是10.00-10.30之间有15min的数据所以一直是少
了这一个K线,下面就是解决办法,只是国内的商品期货,别的品种大家自行选择

在合成分钟线的代代码下面加上这三句代码,原理大家都懂不多说,之后就会合成10.00-10.15的K线了

            elif self.last_bar and str(bar.datetime)[-8:]=='10:14:00':
                finished = True
                self.interval_count = 0

description

description



VNPY模块间调用关系

画了一个周末,头晕了,简直就是个迷宫,放一放先...
description



无界面模式运行CTA策略实现模拟(实盘)交易

对于新手,当然是通过VN Trader的界面操作是最直观和方便的,具体过程我就不做介绍了,入门系列教程讲的很详细。
如果想通过无界面启动模拟交易或者实盘交易,需要找到***\vnpy-2.1.1\examples\no_ui\文件夹下的run.py文件:

  1. 需要配置CTP、XTP或者其他接口的连接信息;
  2. 设置需要运行的CTA策略参数;
  3. run_child()子程序,在main_engine中增加相应接口;
  4. 创建CTA策略引擎;
  5. 创建自己的CTA策略;
  6. 初始化策略;
  7. 启动策略。

具体的示例如下:

import multiprocessing
from time import sleep
from datetime import datetime, time
from logging import INFO

from vnpy.event import EventEngine
from vnpy.trader.setting import SETTINGS
from vnpy.trader.engine import MainEngine

from vnpy.gateway.ctp import CtpGateway
from vnpy.gateway.xtp import XtpGateway
from vnpy.app.cta_strategy import CtaEngine
from vnpy.app.cta_strategy import CtaStrategyApp
from vnpy.app.cta_strategy.base import EVENT_CTA_LOG

SETTINGS["log.active"] = True
SETTINGS["log.level"] = INFO
SETTINGS["log.console"] = True

# CTP接口连接设置
ctp_setting = {
    "用户名": "161xxx",
    "密码": "****************",
    "经纪商代码": "9999",
    "交易服务器": "180.168.146.187:10101",
    "行情服务器": "180.168.146.187:10111",
    "产品名称": "simnow_client_test",
    "授权编码": "0000000000000000",
    "产品信息": ""
}

# XTP接口连接设置
xtp_setting = {
    "账号": "53191000xxx",
    "密码": "********",
    "客户号": "1",
    "行情地址": "120.27.164.138",
    "行情端口": "6002",
    "交易地址": "120.27.164.69",
    "交易端口": "6001",
    "行情协议": "TCP",
    "授权码": "*****************************************"
}

# CTA策略信息
class_name = "DemoMaStrategyCTP"
strategy_name = "DM_ru2009"
vt_symbol = "ru2009.SHFE"
"""
class_name = "DemoMaStrategy"
strategy_name = "DM_601990"
vt_symbol = "601990.SSE"
"""
strategy_setting = {
    "fast_window": 5,
    "slow_window": 10
}


def run_child():
    """
    Running in the child process.
    """
    SETTINGS["log.file"] = True

    event_engine = EventEngine()
    main_engine = MainEngine(event_engine)
    main_engine.add_gateway(XtpGateway)
    main_engine.add_gateway(CtpGateway)
    main_engine.add_app(CtaStrategyApp)
    main_engine.write_log("主引擎创建成功")

    log_engine = main_engine.get_engine("log")
    event_engine.register(EVENT_CTA_LOG, log_engine.process_log_event)
    main_engine.write_log("注册日志事件监听")

    main_engine.connect(xtp_setting, "XTP")
    main_engine.write_log("连接XTP接口")

    main_engine.connect(ctp_setting, "CTP")
    main_engine.write_log("连接CTP接口")

    sleep(10)

    # 创建CTA策略引擎
    cta_engine = CtaEngine(main_engine, event_engine)

    # 初始化CTA策略引擎, 会依次调用init_rqdata(), load_strategy_class()等函数
    cta_engine.init_engine()

    # 创建属于我们自己的策略,首次创建成功后会将参数写入到C:\Users\Administrator\.vntrader文件夹下的cta_strategy_setting.json文件内
    if strategy_name not in cta_engine.strategies:
        main_engine.write_log(f"创建{strategy_name}策略")
        cta_engine.add_strategy(class_name, strategy_name, vt_symbol, strategy_setting)
    else:
        cta_engine.update_strategy_setting(strategy_name, strategy_setting)

    # 初始化刚创建的策略
    cta_engine.init_strategy(strategy_name)

    # 留有足够的时间来进行策略初始化
    sleep(10)

    # 启动刚创建的策略
    cta_engine.start_strategy(strategy_name)

    # cta_engine.init_all_strategies()

    # sleep(60)
    # main_engine.write_log("CTA策略全部初始化")

    # cta_engine.start_all_strategies()
    # main_engine.write_log("CTA策略全部启动")

    print("正在交易中...")

    while True:
        sleep(1)

我已经成功运行SimNow的CTP接口,采用最简单的双均线策略进行了ru2009的模拟交易测试,下单的情况与策略逻辑一致。
目前vnpy的XTP接口只支持期货期权等具有'开'、'平'、'平今'、'平昨'的买卖操作,暂不支持股票的下单操作,服务器会拒单。原因是股票下单的"开平"应该选择'空',而不是'开'或者其他,询问过版主,XTP接口需要升级后才支持,但是在VN Trader界面操作中可以通过下拉菜单选择'空'进行委托下单。



centos7.6 搭建vnpy量化交易环境

作为Python开发的开源项目,vn.py本身具有非常好的跨平台通用性,毕竟Python几乎可以在所有主流操作系统上运行。但对于Linux系统,官方团队只提供了对Ubuntu 18.04版本的支持(主要就是安装脚本)。

本人一直用的是CentOS的服务器,折腾了几天,终于在上面把vnpy跑起来了。没有记录折腾的细节,只是记录了下正常的操作步骤,欢迎大家一起交流。
以下内容全部基于CentOS 7.6版本,首先准备好一个全新安装的系统,然后跟着一步步操作即可。

安装python环境

wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
按照提示信息进行安装,当出现以下信息时,选择no,不然后面vncserver无法正常启动。还不清楚具体原因。
by running conda init? [yes|no]
[no] >>> no

安装Mate桌面

yum groups install "X Window System" -y
yum install epel-release -y
yum groups install "MATE Desktop" -y
systemctl set-default graphical.target

安装VNC Server

yum install tigervnc-server -y

# 替换User为root,增加显示分辨率参数设置
sed -r -i "s/^(ExecStart.*)<USER>(.*%i)/\1root\2 -geometry 1920x1200 -depth 16/" /lib/systemd/system/vncserver@.service
sed -r -i "s/^(PIDFile.*)home\/<USER>(.*pid)/\1root\2/" /lib/systemd/system/vncserver@.service

mv /lib/systemd/system/vncserver@.service /lib/systemd/system/vncserver@:1.service
systemctl daemon-reload
vncpasswd
systemctl start vncserver@:1.service
systemctl enable vncserver@:1.service

# 屏蔽默认桌面,启动mate桌面
sed -r -i "s%^/etc/X11/xinit/xinitrc$%# &%" /root/.vnc/xstartup
echo "/usr/bin/mate-session &" >> /root/.vnc/xstartup

# 其它操作
# 禁用selinux
sed -r -i "s/^(SELINUX=).*/\1disabled/" /etc/selinux/config
# 关闭防火墙
systemctl stop firewalld.service
systemctl disable firewalld.service

reboot

# 如果是云服务器,需要确保开放了TCP 5901端口

安装VS Code

rpm --import https://packages.microsoft.com/keys/microsoft.asc
sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
yum check-update
yum install code -y

升级GCC版本

注意GCC必须要使用9.1.0以上的版本,否则在编译vnpy的时候,会报-std=c++17相关的错误。
GCC的编译时间很长,估计得几个小时。

yum install gcc gcc-c++ bzip2 m4  gmp-devel.x86_64  -y

wget https://mirrors.ustc.edu.cn/gnu/gcc/gcc-9.1.0/gcc-9.1.0.tar.gz
tar xvf gcc-9.1.0.tar.gz
cd gcc-9.1.0/
./contrib/download_prerequisites

cd gmp;mkdir temp;cd temp
../configure --prefix=/usr/local/gmp-6.1.0
make && make install

cd ../../mpfr;mkdir temp;cd temp
../configure --prefix=/usr/local/mpfr-3.1.4 --with-gmp=/usr/local/gmp-6.1.0
make && make install

cd ../../mpc;mkdir temp;cd temp
../configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-6.1.0 --with-mpfr=/usr/local/mpfr-3.1.4
make && make install

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/mpc-1.0.3/lib:/usr/local/gmp-6.1.0/lib:/usr/local/mpfr-3.1.4/lib

cd ../..;mkdir temp;cd temp
../configure --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-6.1.0 --with-mpfr=/usr/local/mpfr-3.1.4 --with-mpc=/usr/local/mpc-1.0.3
make -j4 && make install

我的服务器是4核的,就在make 后面加了-j4,大家可根据自己的情况调整,缩短编译时间。

安装vnpy

最后终于可以安装vn.py了,在此过程中会自动编译Linux上支持的交易接口,如CTP/OES等。

# 切换到python环境
. ~/miniconda3/bin/activate
yum install postgresql-devel* libxkbcommon-x11 -y
下载vnpy的最新源码包并解压。
cd vnpy
bash install.sh


挖个小坑,利用Scikit-learn机器学习库的特征分类进行VnTrade期货量化交易

这个算是一个小坑,因为我也还在学习过程中,代码慢慢完善。一开始在python 2.7,vnpy 1.9.2环境中实现。后面在python 3.7也基本实现,增加支持了xgboost。代码写的繁杂,多多抱歉。

首先说说Scikit-learn是Python语言中专门针对机器学习应用而发展起来的一款开源框架,相对于现在深度学习库tensorflow,由于Scikit-learn本身不支持深度学习,也不支持GPU加速,但是相对于tensorflow那种近乎黑箱的多层神经网络,还是比较好从数学来解释分析。

分类是指识别给定对象的所属类别,属于监督学习的范畴,最常见的应用场景包括垃圾邮件检测和图像识别等。目前Scikit-learn已经实现的算法包括:支持向量机(SVM),最近邻,逻辑回归,随机森林,决策树以及多层感知器(MLP)神经网络等等。这里会使用逻辑回归,决策数, MLP神经网络和SVM向量机,其实都是两句代码事情。

不考虑内部的复杂数学逻辑,这里功能性的使用Scikit-learn特征分类的功能。
1) 选取的特征值,为了避免数据值非逻辑化,这里不直接使用点位最高点这些,而使用那些和具体点位无关的指标,比如atr,cci,rsi,std和bar的涨跌百分比。
2) 利用这些特征值进行分类,这里对于期货走势就是三类,1 是之后上涨,0是之后无规律,-1是之后下跌,这里使用线性回归分析当前时点之后6根K线的走势,如果斜度下,那么当前时点归为-1下跌类,斜度上,为1上涨,如果取信p值不够,或者上下斜率不大,为0。
那么特征值就是atr,cci,rsi,std和bar的涨跌百分比,当然你可以加入KDJ,MACD更多;类别就是三类1,0,-1,利用机器学习,找出特征值和类别的隐含逻辑,进而指导交易,非常粗糙。

整体代码逻辑如下,这里大量借鉴这个 https://mp.weixin.qq.com/s?__biz=MjM5MDEzNDAyNQ==&mid=2650314212&idx=1&sn=0f04627d34f4305e0386fc7562563bff&chksm=be454f828932c694f8ce107249457e0ffba705e6e9531807e86a1f468a3a549001c00bb5389e&scene=21

一,期货K线数据, 导入k线数据,并整理加入特性和类属性
• 利用之前做的DataAnalyzer,读取Mongodb或者csv的1分钟k数据, 放入Dataframe来处理,按照定义合并出n分钟k线,这里n为10
• 还是利用DataAnalyzer,利用ta-lib方法。给Dataframe加入atr,cci,rsi,std,macd和涨跌百分比。
• 使用新方法addTrend,利用scipy.stats的线性回归求出当前时点之后的斜率,给与分类值-1,0,1.

二,数据处理,为了后面机器学习,把特征数组和类数组划分出来,并且划分训练机和测试集。
(1)划分出特征数组 X,和类别数组y
(2)划分训练集和测试集
• model_selection.train_test_split()

三,特征工程,之前需求很多特征,其实有些并没有体现规律,或者完全随机,那么没有意义,可以删除
• 根据P值选:feature_selection.SelectFpr()
• 按照百分比选出最高分特征:feature_selection.SelectPercentile()
这里使用SelectPercentile,

四,模型定义调参/选择
这里使用下面模式进行分析,然后利用网格调参
1)LogisticRegression 逻辑回归
2)DecisionTreeClassifier 决策树
3)SVC 支持向量分类
4)MLP 神经网络
• 交叉验证+网格搜索:model_selection.GridSearchCV()

五,模型测试和评价,使用选取最好的模型,进行测试看看拼接
• 模型预测:model.predict()
• Accuracy:metrics.accuracy_score()
• Presicion:metrics.precision_score()
• Recall:metrics.recall_score()

六,模型保存和调用
• 模型保存:joblib.dump()
• 模型调用:joblib.load(),这里就可以在vnpy中使用了。

后面代码整理放在后面,最后,只做参考,我发现虽然准确率有差不多70%,但是都是要你空仓,大智慧。。。



四行代码合成日K线数据(超简单,附代码!!!!)

因为自己写的策略会用到日K线的数据,但是我自己写的时候发现调用不了,然后进入代码去看,
发现合成K线的BarGenerator下面的方法并没有self.interval == Interval.DAILY
又是我就来社区找,发现有大佬写的代码,很强,于是小弟也来发一发自己的,
因为自己做的是cta国内期货所以时间的问题可能和大家的不一样,我的规定是每天收到14:59:00的
合成一个日K线,所以在self.interval == Interval.HOUR后面加上了四行代码,就很简单的合成了日K线
把代码粘到elif self.interval == Interval.HOUR: 下面对齐就好了,只是国内的期货啊,别的不适应!

        elif self.interval == Interval.DAILY:
            ''' 如果当天的最后一个收盘时间事14.59,进行合成,生成日线bar'''
            if self.last_bar and str(bar.datetime)[-8:]=='14:59:00':
                finished = True
                self.interval_count = 0

description

那么如何调用呢??也很简单 看图

description

description

这是合成的数据,和别的平台的对比,看图

description

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都对接准备好了。



如何让你的双均线策略更加灵活?(附代码)

送给量化小白的小技巧:

原理很简单,算是一个小技巧,某些时候效果很不错,送给均线派,可以适度提升模型!
传统简单均线受困于固定周期参数的限制,不论你使用什么参数的均线都会出现的问题就是反应过快或者反应过慢,最让人头疼的是进场后的均线反应过慢,往往让你损失一大笔利润。自适应均线的原理很简单就是随着持仓周期的拉长,均线的参数慢慢变小,越来越敏感,有时候往往能收到意想不到的效果,各位看官看图

description

description

description

就如图上所示,加了自适应均线的模型因为均线参数的逐渐变小而慢慢敏感,于是额外获得了一段利润
但是有利也有弊,自适应均线会导致过早出场,与后面的利润失之交臂,如何使用还请自行决断。

代码如下

    liqDays = 60
    liqpoint = 0
    holding_days = 0  #需要增加的三个变量

假如我的模型主策略在on_xmin_bar这个函数里面,在on_xmin_bar这个函数最后面加上这段代码
假如有持仓,并没有立即更新liqDays,而是判断持仓超过20个holding_days,开始启动liqDays的更新
当然了最低不能低于某一个阈值,我设置的是50,你们自行选择

        # 更新自适应均线
        if self.pos != 0:
            self.holding_days += 1

        if self.pos!=0 and self.holding_days>=20:
            self.liqDays-=1
            self.liqDays=max(self.liqDays,50)
        else:
            self.liqDays=60
        self.liqpoint=am.close_array[-self.liqDays:].mean()

下面是多单出场演示,空单同理

            elif self.holding_days>=20 and bar.close_price<=self.liqpoint:
                self.sell(bar.close_price, abs(self.pos))
                print('多单自适应均线止盈', bar.datetime, bar.close_price)


最全UTC时间转化为本地时间

import pandas as pd
from typing import Callable, Dict,List, Union
from pytz import timezone
TZ_INFO = timezone("Asia/Shanghai")   #使用东八区时区
#------------------------------------------------------------------------------------
def utc_to_local(timestamp:Union[str, float,int]):
    """
    把timestamp或者str的datetime转化成东八区的datetime
    """
    if isinstance(timestamp,str):
        if "Z" in timestamp:
            if "." in timestamp:
                local_time = pd.to_datetime(timestamp,format="%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)
            else:
                local_time = pd.to_datetime(timestamp,format="%Y-%m-%dT%H:%M:%SZ") + timedelta(hours=8)
        elif "T" in timestamp:
            if "." in timestamp:
                local_time = pd.to_datetime(timestamp,format="%Y-%m-%dT%H:%M:%S.%f") + timedelta(hours=8)
            else:
                local_time = pd.to_datetime(timestamp,format="%Y-%m-%dT%H:%M:%S") + timedelta(hours=8)
    elif isinstance(timestamp,float):
        local_time = pd.to_datetime(timestamp,unit = "s")   + timedelta(hours=8)
    elif isinstance(timestamp,int):
        #秒时间戳
        if len(str(timestamp)) == 10:
            local_time = pd.to_datetime(timestamp,unit = "s")   + timedelta(hours=8)
        #毫秒时间戳
        elif len(str(timestamp)) == 13:
            local_time = pd.to_datetime(timestamp,unit = "ms")   + timedelta(hours=8)
        #微妙时间戳
        elif len(str(timestamp)) == 16:
            local_time = pd.to_datetime(timestamp,unit = "us")   + timedelta(hours=8)
        #纳秒时间戳
        elif len(str(timestamp)) == 19:
            local_time = pd.to_datetime(timestamp,unit = "ns")   + timedelta(hours=8)
    return local_time.tz_localize(TZ_INFO)  #pandas timestamp添加时区


为VNPY的K线序列管理工具ArrayManager增加对数收益率队列

这段文字说明特别清楚,引用过来

如果我们考察单一投资品在总共 T 期内的表现,那应该用对数收益率,而非算数收益率。算术平均值不能正确的反应一个投资品的收益率。比如一个投资品今年涨了 50%,明年跌了 50%,它的算数平均收益率为0;但事实上,两年后该投资品亏损了最初资金的 25%。相反的,对数收益率由于具备可加性,它的均值可以正确反映出该投资品的真实收益率。比如这两年的对数收益率分别为 40.5% 和 -69.3%,平均值为-28.77%,转换为百分比亏损就是 exp{-28.77%} - 1 = -25%。
对数收益率的时序可加性让我们能够使用另外两个利器:“中心极限定理”和“大数定律”。假设初始资金 X_0(假设等于 1),ln(X_T) = ln(X_T/X_0) 就是整个 T 期的对数收益率。对数收益率的最大好处是它的可加性,把单期的对数收益率相加就得到整体的对数收益率。

在做策略建模的时候,经常需要把K线转换为可以正态分布数据,这样可以使用那些很牛吼吼的数学模型进行挖掘。

实现很简单

c = ln(t1/t0)
像相信研究可以看看这个 https://www.zhihu.com/question/30113132

在VNPY的K线序列管理工具ArrayManager,可以加入下面代码。按照属性返回对数收益率序列

@property
def percentLog(self):
    """获取对数收益序列"""
    arrayold = self.closeArray[0:self.size - 1]
    arraynew = self.closeArray[1:self.size]
    return np.log(arraynew/arrayold)*100.0

传统close 曲线
enter image description here
对数收益率后,把几个突变极大极小值忽略后,就是一个很标准正态分布,然后就可以用一堆模型来套用了
enter image description here


统计

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