常见问题

关于量化平台部署

关于量化环境

PTrade客户端为本地运行,但量化模块为云端部署方式,客户端通过http或https方式链接云服务器。

关于策略安全

客户策略部署在券商服务器,策略文件加密存储。利用Docker容器技术,隔离多账号运行空间,有效分配各用户账号运行环境,保证策略运行环境与资源使用的独立性。

Mac是否支持

Mac目前不支持,只能在Windows环境下。

关于付费

云纪网络提供的仿真环境目前为免费使用,包括所有数据、回测资源、模拟交易资源。券商部署环境以券商发布的使用条件为准。

关于程序语言

PTrade量化目前仅支持Python语言编程。

关于Python版本

目前Python版本为3.5.2。

关于数据

数据种类

在研究、回测、交易模块均可调用2005年以来的历史财务数据以及历史行情数据,包含分钟、日线、周线不同周期数据。交易场景还支持tick级别行情快照数据。数据支持股票、可转债、指数等多品种。

关于数据读写

研究环境可以存放文件,根目录路径为'/home/fly/notebook/',可通过get_research_path接口获取。回测和交易中均可以通过该路径进行策略中的读写等操作,从而实现数据的保存和读取。

关于本地数据

由于PTrade为云端部署,策略中是无法与本地路径进行直接交互的。

关于行情数据除复权

PTrade行情数据支持不复权、前复权、后复权、动态前复权四种取历史行情数据的方法,但要注意的是回测中回测引擎撮合的价格是不复权的,因此可以通过除权因子进行价格除权处理。

关于level2数据

云纪网络的仿真环境不提供level2数据,券商环境是否提供,由所在券商决定。

关于研究

研究环境资源

目前单个的客户研究环境资源没有上限。

文件传输限制

单个文件手动上传下载目前限制单个文件数据大小不超过50M。

关于定时上传功能

定时上传功能可以实现研究环境自动从本地路径读取文件,但上传次数是有限制的(具体由券商配置决定),因此仍不能支持高频的策略中调用本地数据场景。

定时上传功能目前限制单个文件数据大小不超过50M。

上传文件夹

暂时不支持文件夹上传,文件需要逐个上传。

关于回测

回测与研究有什么区别

研究环境更侧重于数据的清洗、处理、建模、画图、debug 调试等,类似于本地的Python 编程,无法调用诸如order下单,账户资产等与交易相关的函数。回测环境则更适用于完成完整的交易策略搭建、参数调优、历史收益回测等,更贴近交易。一般的,研究环境适用于对程序有调试需求,需要知道每一步程序执行的结果的用户,而回测则更适用于想知道策略在历史时间段内的收益如何,以便对策略参数甚至是构建思想进行调优的用户。

回测个数

目前支持同时进行5个回测。

回测的速度

PTrade量化中部分接口为在线调用接口,调用速度会受瞬时网络情况影响,比如get_fundamentals、get_Ashares,回测中按实际需求尽量少频次地调用这类在线调用接口。另外分钟级别策略中如果用到日频的历史数据,在before_trading_start模块处理一次就可以,这样可以提升回测的速度。

关于回测周期

目前回测只支持分钟和日线周期的回测。

关于调试功能

量化分步调试功能可以帮助开发者更高效地debug策略代码。该功能在回测模块中,支持调用堆栈查询、变量监视、本地变量查询功能。

关于性能分析

性能分析功能会对运行结果做分析,包括语句的触发次数和耗时情况,能够帮助用户快速地做策略性能优化。

关于离线回测

PTrade量化平台目前不支持离线回测,回测期间必须保障客户端打开。

关于策略上传和下载

PTrade量化平台所创建的策略是可以加密下载和上传的,我们利用AES/DES加密技术对文件流进行加密处理,随机生成盐值进行干扰混淆,保障上传与下载安全私密性。该功能的用途在于支持同一策略在不同账户上实现隐藏代码地进行模拟交易。

操作方法:

一、选定策略,点鼠标右键,选择下载,然后将策略保存到指定路径,下载的文件为zip格式,下载后不要做解压。 可以对该zip文件做重命名也可以不做处理,对于上传没有影响。

二、点击交易中的上传策略。 上传的策略我们可以在回测的策略列表中查询到,策略名称跟下载时候的策略名称保持一致,假如与原策略列表中出现重名,也不会报错。上传策略不允许修改策略名称,且不允许修改策略代码。上传的策略不可以做回测,仅能用来开启交易。

回测撮合是否受真实成交限制

回测提供了两种成交撮合方式,通过set_limit_mode接口控制,一种是按初始化设定的分钟成交量比例进行成交撮合,另一种是不受分钟成交量限制。前者可以较为真实地反映流动性对策略的影响,后者比较适合低频调仓策略,比如基本面月频调仓策略之类。

获取每次回测代码

在回测记录中找到目标回测记录,在‘操作’栏中点击详情按钮获得回测代码。

关于模拟交易

模拟交易个数

默认允许同时运行5个交易,具体以券商配置为准。

交易过程可以客户端离线吗

交易在服务器上运行,因此客户端关闭或掉线并不影响策略运行。

不同交易的账户管理

所有运行的模拟交易或实盘交易都共享一个账户(资金、持仓无法隔离),暂不支持子账户交易系统。

交易开启的时间

交易在任何时间都可以开启,开启后会立刻运行initialize和before_trading_start(如果策略中定义的话),要注意的是:开盘前开启交易,before_trading_start肯定会先于handle_data开启;但开盘期间开启交易,before_trading_start和handle_data可能会同时运行,策略逻辑防止混乱。

策略中模块的运行顺序

交易中before_trading_start、handle_data、tick_data、run_interval都是独立的线程,当交易开启之后,每个线程都会启动,理论上没有先后顺序关系。因此建议在策略中设置强制顺序的控制系统,比如运行完before_trading_start后打开handle_data的运行开关,运行完handle_data后打开tick_data或者run_interval的运行开关。

重启功能

重启功能和新建交易本质上是一样的,会重新创建交易id,原策略中的内存变量如果不做保存会清除。

回测与交易代码兼容

由于交易中支持tick数据以及市价单下单,因此大多数情况下回测和交易在代码设计上会有不同。为了减少代码维护的难度,PTrade量化提供了is_trade接口。通过该接口,用户可以在一套代码中兼容回测和交易两种逻辑。

关于模拟交易的稳定性

常见的影响交易稳定性的因素来自于几方面:

1、历史行情K线数据服务器更新异常。这种情况往往可以通过比较入参的K线数量、实际返回数据框的长度、时间戳index去重后的返回数据框的长度来做判断(看三者是否保持一致)。

2、实时行情数据获取失败。实时行情源的推送并不能保证一直稳定,因此需要做数据保护:比如

def initialize(context):
    # 初始化此策略
    # 设置我们要操作的股票池, 这里我们只操作一支股票
    g.security = ['600570.SS','600571.SS']
    set_universe(g.security)
    #每3秒运行一次主函数
    run_interval(context, func, seconds=3)
    
def func(context):
    for stock in g.security:
        #获取最新价
        snapshot = get_snapshot(stock)
        # 非空判断
        if snapshot[stock]:
            # 字段数据做保护
            price = snapshot[stock].get('last_px', 0)
            if price == 0:
                log.info((stock,'该股在本tick行情数据异常,不进行判断'))
                continue
            order(stock, 100, limit_price=price)

def handle_data(context, data):
    pass

3、财务数据获取失败。财务数据接口是在线向数据源调用的接口,瞬时调用量过大或者其他导致网络堵塞的原因都有可能使得获取失败,因此建议加入重连机制做保护(可参考单因子demo)。

4、服务器环境异常。这种情况是用户主观不能控制的,但可以通过持久化处理,让策略在短暂停止后,重新拉起并保持原有的策略逻辑连贯(可参考持久化说明)。

关于模拟交易的账户数据更新频率

模拟交易和实盘交易的账户数据同步理论上是6秒一次,包括资金、持仓、订单状态、撤单状态等。因此用户需要自建一定的中间变量做过渡,防止重复交易或者重复判断。

tick_data和run_interval的关系

tick_data和run_interval都可以实现tick级别周期策略,tick_data固定3秒一个间隔,run_interval可以随意设置运行间隔时间,最小间隔3秒,数据源也都是行情快照数据,因此可以选择其一进行策略设计。

关于实盘交易

如何开通实盘

向开展PTrade量化业务的所在券商进行申请。

实盘与模拟交易区别

模拟交易和实盘交易在数据获取的机制上是一致的,只是成交撮合机制不同。

关于委托

实时行情获取失败导致委托失败

限价委托接口包括order、order_target、order_value、order_target_value,如果不入参限价字段limit_price,引擎会默认以将行情最新价报单要,碰到行情异常快照数据推送为空的时候,下单会失败形成废单,日志中会有提醒,可以通过废单逻辑判断来进行二次委托。

委托数量校验

委托接口有委托数量校验,如果数量不是整数,会下单失败返回None。

集合竞价下单

已支持,参考集合竞价demo。

委托状态如何监控

get_orders接口可以获取当日本策略的所有订单信息(6秒同步更新),交易模块还可调用on_trade_response接口获取成交回报主推。

手动委托单策略中能否撤单

通过get_all_orders接口获取账户当日全部订单,再结合cancel_order_ex撤单接口,可以对手动委托单进行撤单。

关于隔夜单

每个交易日15:00之后,通过order、order_target、order_value、order_target_value、order_marget这五个接口处理的委托订单都会放到委托队列,第二天9:15分报给柜台。

关于三方库

查询支持的三方库

研究中输入 !pip list 即可查询到目前PTrade所支持的所有三方库及其版本。

三方库更新

目前暂不支持用户对三方库的自主更新。

其他

关于调用自有包

策略中不支持调包,也不支持跨策略调用函数,因此一个策略只能在一个文件中实现。

关于连接自己的数据库

因合规要求,目前不支持对本地数据库读写。可以在研究环境上传db文件,通过Python自带库包sqlite进行数据库读写操作。

如何将信号推送给自己

可通过邮件、企业微信接口实现,因该业务需要开通外网,实际看券商环境是否支持。

关于OS

os模块目前无法使用。

关于快速地获取最新价

在回测中建议用data[stock].price(注意这种方法取到的是不复权数据),交易中用get_snapshot接口获取行情快照的最新价。

关于日线策略运行时间

回测中是15:00执行;交易中默认设置是14:50分,具体看所在券商的配置。

关于get_history中的include参数

get_history中的include参数默认为False,如果设置为True,则返回包含当前周期的数据。日线周期(或以上级别)策略的回测场景设置include参数为True获取当日数据,可以使得回测更加快速便捷,其他场景建议谨慎使用该参数。

关于基准设置

基准支持设置为指数/个股/ETF,可参阅set_benchmark。

策略里如何实现跨周期处理

可以通过run_interval和handle_data相结合实现,根据策略逻辑进行编写。

关于requests

目前不能使用requests。

关于批量委托性能

策略发起委托到柜台接收的速度,测试结果:300笔委托耗时2秒。