ptrade交易工具,我的实战经历

发布于: 雪球转发:4回复:3喜欢:18

稍微系统来聊一下可编程量化交易,目前,可能跟我们没多大关系,但了解一下,扩展一下基金量化投资的视野,相对于鸡汤来说,应该更有营养。

一、初识PTrade

当时,跟高校的相关专业老师聊量化交易,感觉大家都很努力,在背地里狠下功夫。

那时候,开始了解到市面上有两个成熟的智能策略交易工具,PTrade和QMT,查了一下它们之间的区别,一般都说ptrade更轻量级、QMT更专业级,琢磨了一段时间,在我看来,感觉它们最核心的区别,应该是:

ptrade是平台托管、QMT是本地运行。

ptrade平台托管是把编写好的策略提交到服务器,由平台方提供资源运行策略,本地电脑可以关机大吉,这样是方便了用户,但仔细想想,这样的用户一般是轻量级用户、或者对用户一堆的限制,否则平台吃不消呀。

QMT策略在本地运行的话,本地电脑不能关机、计算全部在本地,平台更多的是提供接口,比如平台提供的下单接口,这个接口很简单,但是为了发出下单指令,可能需要计算几个小时。

所以,QMT放在本地执行的策略,自己配置资源,策略代码也不容易泄露,显得更专业。

二、踏上征途

站在岸上永远学不会游泳。

开了一个ptrade账号,一些不是问题的问题,马上释然。

问题1、ptrade在哪里下载?

ptrade是恒生电子开发的,以植入券商的交易终端形式而存在,所以,需要在指定的券商开户,然后由工作人员发送ptrade安装包给用户。

目前,东莞证券、国金证券等几家有ptrade功能,对入金有一定要求,好在资金存放几天就可以转出,可以享受很优惠的佣金。

问题2、ptrade是模拟还是实盘?

可以模拟回测、也可以实盘,否则就意义不大了。

回测之前需要对开始时间、结束时间、回测资金、回测基准、回测频率几个要素进行设定,设定完毕后点击保存。然后再点击回测按键,系统就会开始运行回测,回测的评价指标、收益曲线、日志都会在界面中展现。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

交易界面点击新增按键进行新增交易操作,交易开始运行后,可以实时看到总资产和可用资金情况,同时可以在交易列表查询交易状态。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

问题3、ptrade可以自动交易吗?

可以自动交易,调用下单函数就行。

比如买入证券ETF 100股,下单命令为: order('512880.SS', 100)

三、ptrade框架

这是ptrade工具的灵魂,刚开始学习需要了解,后续更应该多多体会,温故而知新。

多看几眼这张图,牢记心中。

编辑

添加图片注释,不超过 140 字(可选)

ptrade量化引擎以事件触发为基础,通过初始化事件(initialize)、盘前事件(before_trading_start)、盘中事件(handle_data)、盘后事件(after_trading_end)来完成每个交易日的策略任务。

initialize和handle_data是一个允许运行策略的最基础结构,是必选项,before_trading_start和after_trading_end是可以按需运行的。

handle_data仅满足日线和分钟级别的盘中处理。

除了以上的一些事件以外,ptrade也支持通过定时任务来运行策略逻辑,可以通过run_daily接口实现,这些玄乎的,可以先不管。

走起来,再跑步前进。

明白了以上框架,交易算法直接放到对应的模块就行。

示例

# 策略初始化 def initialize(context): #g为全局变量 g.security = '600570.SS' set_universe(g.security) log.info('初始化完成') def before_trading_start(context, data): log.info(g.security) log.info('盘前执行完成') # 盘中执行 def handle_data(context, data): order('600570.SS',100) log.info('盘中执行完成') #盘后执行 def after_trading_end(context, data): log.info(g.security) log.info('盘后执行完成')

点击回测,按顺序显示文字,可以验证框图中的流程。

简单吧,再进一步学习点接口函数,就可以上场了。

四、ptrade工具菜单

ptrade框架清楚了,要干活,得先了解一下ptrade工具的界面、菜单及功能,以便知道油盐酱醋的位置。

点击左边的“量化”,ptrade的菜单就出来了,总共四个模块,下面分别介绍。

编辑

添加图片注释,不超过 140 字(可选)

菜单1、研究

第一个菜单叫“研究”,研究了半天,就是一个文件浏览器,不知道要研究个啥。

后面才知道,这个还挺有用的,值得研究。

在量化交易算法中,少不了有些参数、交易记录要存盘,要是全部放在内存,说没了就没了。

这些要存盘的数据,就是放在“研究”目录下的,可以在这里查看、打开、修改

编辑

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

get_research_path – 获取研究路径

get_research_path()

接口说明

该接口用于获取研究根目录路径,该路径为'/home/fly/notebook/'。

示例

def initialize(context): g.security = "600570.SS" set_universe(g.security) path = get_research_path() def handle_data(context, data): pass

菜单2、回测

回测,熟悉基中宝的朋友再熟悉不过了,就是用历史价格走势,来验证一下算法的正确性、有效性。

首先是正确性,比如算法里面希望跌三个点买,回测看看是否确实如此。

其次,检验一下收益如果,高大上一点的,可以看看专业指标,如:阿尔法收益、贝塔收益、夏普比率、信息比率。

简单粗暴的话,直接看收益率就行。

回测中,还可以显示日K线,有买卖标识,不过不能看当天的分时交易图,有点不直观,我现在的做法是,同步查看同花顺,按照成交时间对照着看,检查买卖点是否符合预期。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

回测时,有几个核心参数:

开始日期、结束日期,这个好理解。

基准:选择一只参照的股票、基金、或指数,选择本身也行,以便回测完成后,统计前面提到的那些牛X的指标。

周期:这个很重要,选择每日,每天执行一次“盘中算法”;选择每分钟,每分钟执行一次“盘中算法”。

最后,点击“回测”,底下就显示运行状态啦。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

菜单3、交易

量化交易算法写好后,比如,我的第一个举世无双的“黄金网格”策略,回测能达到预期效果,真刀实枪的话,就需要点击“交易”。

操作很简单,先学会新增、停止、删除就够用了。

编辑

添加图片注释,不超过 140 字(可选)

重点说一下“新增交易”:

交易名称,随便写,自己能记住就行。

策略方案,选择回测里面的策略。

点击“确定”,交易策略就开始加载、执行。

编辑

添加图片注释,不超过 140 字(可选)

量化交易策略当天运行的状态,可以实时查看,只能查看当天的,历史日期我测试了一下,没有。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

菜单4、帮助

PTrade框架搞清楚了的话,要实现自己的想法,剩下的就是代码拼凑,不会的,看“帮助”。

比如,要想实现交易下单,必须先知道下单函数是哪个,那就找 order 函数。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

还有示例,赶紧拿来跑一下:

def initialize(context): g.security = ['600570.SS', '000001.SZ'] set_universe(g.security) def handle_data(context, data): #以系统最新价委托,买入100股 order('000001.SZ', 100)

当然,从最近的经历看,也不能全依赖帮助文档,文档偶有错误、或模糊不清,见惯不怪。

最好有交流,过来人踩过的坑,一句话便豁然开朗。

五、案例学习 - 极简网格

工具是拿来用的,而不是显摆炫酷的。

最近的行情有点让人窒息,涨一天、跌一天,刚好要做ptrade策略案例,突然想到“极简网格”。

编辑

添加图片注释,不超过 140 字(可选)

策略思路是这样的:

1、底部买入底仓

底部可以人为制作,但最好选择横盘区间,并通过网格下限来控制。

2、涨一点卖,如涨0.8%卖一格

3、跌一点买,如跌0.5%买一格

编辑切换为居中

添加图片注释,不超过 140 字(可选)

思路就这么简单,比如:

首次买入底仓5份,网格下限留一格的空间,总共6格,每格0.8%,则整个网格空间为4.8%,在这个区间来回网格。

【实现代码】

刚好可以小试牛刀,上代码。

本代码仅供学习交流,请勿直接使用

''' 策略名称:极简网格量化交易 运行周期:分钟 策略思想: 1、底部买入底仓 2、涨一点卖,如涨0.8%卖一格 3、跌一点买,如跌0.5%买一格 注意事项: 学习交流,请勿直接使用 ''' # 导入函数库 import talib as tl import pandas as pd import numpy as np # 初始化此策略 def initialize(context): # 参数设置,运行前必须人为修改 g.security = "512880.SS" #设置股票、基金代码 set_universe(g.security) g.upGridRate = 0.8/100 #上涨n%卖出一格 g.downGridRate = 0.5/100 #下跌n%买入一格 g.oneGridAmount = 1000 #每格委托的股数 g.firstBuyGrids = 3 #首次买入份数,买入资金 = 份数 * 每格股数 * 当前价格 # 以下参数不用人为修改 g.first_buy_flag = 1 #首次运行标志,1 - 首次启动 g.plan_completed = False #计划是否完成,卖完就完成 log.info('初始化完成' + g.security) #盘前处理 9:30以前 def before_trading_start(context, data): log.info('啥事也不用做,盘前处理完成') #盘后处理 15:00以后 def after_trading_end(context, data): log.info('啥事也不用做,盘后处理完成') #盘中处理 9:30~11:30 13:00~15:00 def handle_data(context, data): if g.plan_completed: log.info('计划完成啦,哥哥!') return # 获取当前价格 curPrice = data[g.security].price log.info('当前价:' + str(curPrice)) #首次自动买入持仓 if g.first_buy_flag == 1: # 首次买入股数 g.firstBuyAmount = g.oneGridAmount * g.firstBuyGrids order(g.security, g.firstBuyAmount) #下单买入 log.info('首次买入股数:' + str(g.firstBuyAmount)) g.basePrice = curPrice #下次对比的基准价格 g.downPrice = curPrice * (1 - g.downGridRate * 1) #下限价格向下预留一格 g.plan_position_amount = g.firstBuyAmount g.first_buy_flag = 0 if curPrice < g.downPrice: log.info('价格低于网格下限,不买了,气死你^~^') return # 计算增长率 curGainRate = (curPrice - g.basePrice)/g.basePrice log.info('当前增长率:' + str(round(curGainRate*100,2)) +'%') # 增长大于上涨粒度,卖出一份 if curGainRate >= g.upGridRate: order(g.security, - g.oneGridAmount) #下单卖出一份 log.info('卖出数量:' + str(g.oneGridAmount) + '/' + str(g.plan_position_amount)) g.basePrice = curPrice g.plan_position_amount = g.plan_position_amount - g.oneGridAmount if g.plan_position_amount <= 0: #持仓全部卖出,则计划完成 g.plan_completed = True log.info('卖完了,数数去') # 跌幅大于下跌幅度,买入一份 if curGainRate < -g.downGridRate: order(g.security, g.oneGridAmount) #下单买入一份 log.info('买入数量:' + str(g.oneGridAmount)) g.basePrice = curPrice g.plan_position_amount = g.plan_position_amount + g.oneGridAmount

【回测效果】

不废话了,直接看回测图,主要感受一下有哪些东西。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

编辑

添加图片注释,不超过 140 字(可选)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

代码写得明白吗?

若能完成以下思考题,那就ok了。

问:策略中,默认使用的是#证券ETF# 512880,怎么修改成自己的股票或基金代码?

问:策略中,网格上涨幅度是 0.8%,怎么修改成0.9%

问:策略中,下限价格向下预留一格,怎么改成下限价格向下预留二格?

六、黄金网格策略思想

实战中正在跑这个策略,效果有点小激动。

黄金分割回调线、反弹线,核心思想很简单,以前有专门介绍,基中宝里面的智能网格已有实现《智能网格参数及攻略2.0》。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这次在ptrade里面实现,主要有以下几个地方不同:

1、实时性更强些

ptrade最快的频率可以3秒扫描一次行情,我选择了一分钟,对于应对型策略,感觉足够了;

2、可以自动交易

对于目标大一点的计划,如定盈计划的目标收益是10%,收益偏差1%,并且还可能有失有得,完全可以不拘泥于小节,按基中宝的提示下单就行。

但如果目标收益就是1%,这个时候精准就重要了,总不能说误差1%了吧,所以,这时候自动交易是必要的,它可以捕捉当前实时价格交易。

3、回落、反弹百分比自动调节

粒度设置很细,这个容易做到,华宝智投里面也可以。

以下是在华宝智投里面的实战,设置下跌1%、反弹0.5%买入,仔细观察交易点,对于很坚决的下跌,这个设置很好;对于大跌一下,然后阴跌,就很容易上当,导致中途没必要的买入。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

所以,才有了在ptrade里面实现黄金分割反弹值的想法,以实现:

先张小嘴,小鱼来了吃小鱼,大鱼来了张大嘴,大小通吃。

编辑

添加图片注释,不超过 140 字(可选)

4、增加了横盘判断功能

跌破网格下限,探底横盘时自动开启下一道防线,如下图游戏ETF,进入第三道防线后,已平稳收割四个月,让第一道、第二道防线馋的摩拳擦掌。

当然,如果一上来就进入第三道防线,那是最理想的,所以,高频黄金网格,要尽量寻找跌无可跌的品种进行布局。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

横盘预警功能,在基中宝里面也在同步开发了,供大家做时机预警,也可以回测,期望达到一目了然的效果。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

这么说来,ptrade里面的黄金网格,可以秒杀基中宝里面的网格计划吗?

当然不行。它们是互补关系,ptrade自动量化交易,适合于做小区域精细化耕耘,最好选择震荡幅度小的品种,如红利ETF;而基中宝里面的网格交易,则大气得多,适应范围广,行业ETF也能轻松应对。

七、ptrade量化交易工具使用体会

1、ptrade自身也在不断完善中,在需求、功能的碰撞中不断升级,希望它尽快越来越好

2、目前使用的人很少,现在加入的小伙伴,都是开始吃螃蟹的人,相信以后会越来越多,直到有一天突然爆发

3、量化有预测型、应对型两种模式

预测型消耗资源大、编写复杂,甚至还经常用到多线程,ptrade平台很吃力,出错的概率也大;

应对型策略,是行情出现以后的应对实现,我们现在的策略大多是属于这种。

至于效果孰优孰劣,没有真切的对比,暂时不敢妄言。

最后,看谁有参加培训的需求,培训中可以详细讲解代码,聊聊量化代码的利与弊,让我们有点价值,Call me!

聪明人,少讲空话,多做计划,

基中宝一定记得微信关注呀,

投资交流,不构成投资建议!

全部讨论

2022-09-07 16:32

外国软件一律都有病毒!!

2023-12-25 20:10

ptrade感觉还很原始,很多信息无法获取,比如ETF的iopv数据就不能获取

2022-11-13 08:07

ptrade是中国人自己开发的