投资海外市场,有哪些标的可以考虑?| 多个QDII基金数据分析

股票李魔佛 发表了文章 • 0 个评论 • 815 次浏览 • 2023-07-10 23:21 • 来自相关话题

投资为什么要放眼全球? 看看下图就一目了然。
 
这是过去十几年纳斯达克指数的月K线走势。
 





 
 
去年2022年回调了一年,下跌了33%,而今年截至到今天,已经涨了31%。
 
以前老司机曾经说过,对于纳指的每次回调都是买入的机会。老司机果诚不欺我也!
 
2016年的时候不少大V就在喊美股冲顶风险很大泡沫要破云云之类。再来看看我们那低估的沪深300。
 





 
 
 
最近十五年来的月K线。上涨的时光总是短暂的。如果十多年前山顶位置买的投资者,熬到现在也可能未解套。
 
 
 
怪不得网友们的吐槽
 





 
 
 
所以放眼全球,可选标的更为丰富,那投资标的就可以更为分散,篮子里的品种相关性就会越低,那么遭遇系统性风险的概率就越低。好比买了一揽子基于A股的基金,然后A股大盘崩了,覆巢之下无完卵,那一篮子的鸡蛋也碎了。而投资全球基金,就是把鸡蛋装到不同的篮子,甚至不同的车子里。
 
 
 
本期雪球老司基评测选出了8只全球市场主题基金,我们来对其进行评测,来看看各自的风格,哪一只的风格适合你。
 
 
 
本次评测的8个全球基金如下:
 





 
 
其中,易方达标普消费品,广发全球医疗保健,华安标普全球石油,诺安全球黄金这4个基金为跟踪指数型基金,主要考察基金经理对指数跟踪误差的控制能力。
 
工银全球精选股票,国富全球科技互联,富国全球科技互联,银华抗通胀主题主要考验基金经理的选股,择时能力。
 





 
 
 
同为投资标的为科技互联网的国富全球科技互联和富国全球科技互联,名字很像,只不过是两个基金公司发行的基金。不过它俩最近三年的收益率差距很大,国富全球科技互联(006373)最近三年的收益率为32%,而富国全球科技互联(100055)的最近三年的收益率却为-7%, 同为全球科技型股票基金,为何二者差距会有这么大呢?
 
 
 
根据最新的季报信息,二者的规模与持仓比较如下:
 
 
 





 
 
二者都属于小规模基金,规模小于3个亿,而国富全球科技互联(006373)其基金规模更加低于一个亿。国富全球科技互联(006373)的持仓股票占比比富国全球科技互联(100055)要高近20%(79% vs 61%)
 
 
 
而对比一下二者的十大持仓股,黄色标注的为中概股(港股),富国全球科技(100055)十大持仓里有8个中概股。
 
 





 
 
这种情况下,很难躲过中概股的这一轮下跌的。
 
而最近2年的中概股走势你们也是有目共睹的。
 
 





 
 
 
就这样跌跌跌的走势,还想着赚钱? 能保本不亏已经算是人上人了。
 
因此富国全球科技(100055)在评测的这8个海外基金里面,最近3年的收益率是最低的。见最上面的近三年收益率图
 
而这两只海外QDII基金的规模有点小,尤其是国富全球科技互联(006373),当前规模只有8千万,遇到暴跌行情时会有赎回的流动性问题,且有触发低于规定规模(一般3千万)而清盘的风险。
 
 
 
在这8只全球海外基金里,还有一只重仓科技互联网的基金,工银全球精选股票,目前该基金经理为林念。而且它的基金规模接近4个亿,比富国全球科技和国富全球科技互联的规模要大。
 
 
 
其十大持仓股:





工银全球精选股票
 
从上图可以看到该基金的十大持仓里基本囊括了微软谷歌META这种美国优秀互联网企业,也有国内腾讯,台积电这样的互联网,芯片龙头企业。
 
 
 
而该基金从成立到现在,该基金的累计收益率为200%,最大回撤为-28%, 回撤控制得相当不错。对于厌恶风险的朋友,又想投资互联网科技股的朋友可以考虑考虑此基金。





工银全球精选最大回撤
 
如果你想像买国内贵州茅台股票那样的消费品,来对标买入全球范围内类似茅台此类优秀的股票,那么买入跟踪全球的消费指数的基金----易方达标普消费品,是一个很不错的选择。
 
 
 
从它的跟踪标的来看,它的确如茅台一样,在国内看来,持有的都是些奢华的消费品。





易方达标普消费品十大持仓
 
国内百姓日常能买的,这里面也只有耐克了。。。。。
 
这些公司的奢侈品如茅台一样具有很高的溢价,为了维持品牌形象,它们的定价策略是不轻易走降价路线的,况且也不愁卖不出。
 
正如雪球上的主流投资理念,买股票就是买公司;买入易方达标普消费品QDII基金,等于一篮子买入了这些奢侈品公司,何不美哉?
 
 
 
如何选择适合我的QDII基金?
 
先看最近5年每年度的收益率以及近5年的收益率:
 




最近5年的年度收益率
 





5年累计收益
 
石油,黄金,抗通胀类的基金,属于周期性的品种,个人觉得是不能长持的,一旦在上涨周期的冲顶阶段迈入了,很可能就是要被套个几年了。如果一直持有会一直坐过山车;这类基金适合在周期底部开始买入;一般而言,底部要比顶部要好判断的多。有反弹了,可以继续持有,等待上涨周期的到来;而且不能买入过早,不然前期会比较煎熬,比较考验耐心。
 
而医疗和消费是可以长期持有并穿越牛熊的。从最近5年的广发全球医疗和易方达标普消费的每年收益率和近5年总收益率来看,绝大部分年份都不是涨幅最大的,但跌幅也不是最大的,波动不如其他几个科技,石油来的大,但累计收益却是最大的2个。这其实和股票交易的很像,每天上蹿下跳的,实际几年下来可能还是原地踏步甚至倒退。
 
 
 
广发全球医疗成立以来的业绩曲线





广发全球医疗
波动率和最大回撤都要比沪深300低,截止当前的累计收益率为141%,高于沪深300的56%,典型的长牛走势。
 
 
 
虽然石油类QDII具有强周期属性,但作为基金市场上场内外购买渠道里,直接对标全球原油的基金只有华安标普全球石油和广发石油指数,人气更高的华宝油气挂钩的则是上游油气开采的企业,和石油价格相关性比华安石油和广发石油要低不少。原来的银行渠道的可以直接购买的原油宝等高风险产品,因负油价事件已经被暂停了。
 
 
 
华安标普全球石油跟踪的石油指数为标普全球石油指数,其指数走势如下:





标普全球石油指数
从这近10年的走势图,2014-2015的高点在2022年中才被收复。
 
该指数的成分股为全球内石油巨头。





标普全球石油指数成分股
 
 
 
由于跟踪的是石油公司,而非石油本身,且分散买入这些石油公司,所以指数波动要比石油价格要小得多,但也是和油价呈现出强相关关系。
 
2020年5月的负油价事件,把该指数和跟踪它的华安标普全球石油砸了个大坑。但不会像石油期货交割那样亏完本金还要倒亏。毕竟基金持有的石油公司的资产,品牌等各类资源还在。
 
 
 
下图为华安标普全球石油160416场内的月K线图。
 





华安标普全球石油
 
所以华安标普全球石油这种QDII基金是普通投资者参与国际大宗商品最便捷,最简单的方式,没有换汇的繁琐和每年5W美刀的限制,不需要开通复杂的商品期货账户,只要有个雪球账户或支付宝账户就可以直接参与国际原油的交易当中了。
 
 
 
## 总结
 
在这8个全球QDII基金里,如果想参与到当下的chatGPT等AI科技浪潮中,看好AI继续引领全球经济,可以选择科技型QDII基金工银全球精选股票;
 
如果要长持稳妥能有够硬的抵御风险能力的QDII基金,那么可以选择易方达标普消费品和广发全球医疗保健;
 
如果对俄乌战事继续悲观,平时对国际时事战争比较关心,那么可以根据事件预测,适时埋伏华安标普全球石油和诺安全球黄金,做一波事件驱动的短线操作。 查看全部
投资为什么要放眼全球? 看看下图就一目了然。
 
这是过去十几年纳斯达克指数的月K线走势。
 

20230707001.jpg

 
 
去年2022年回调了一年,下跌了33%,而今年截至到今天,已经涨了31%。
 
以前老司机曾经说过,对于纳指的每次回调都是买入的机会。老司机果诚不欺我也!
 
2016年的时候不少大V就在喊美股冲顶风险很大泡沫要破云云之类。再来看看我们那低估的沪深300。
 

20230707002.jpg

 
 
 
最近十五年来的月K线。上涨的时光总是短暂的。如果十多年前山顶位置买的投资者,熬到现在也可能未解套。
 
 
 
怪不得网友们的吐槽
 

mmexport1688745326545-v1.jpg

 
 
 
所以放眼全球,可选标的更为丰富,那投资标的就可以更为分散,篮子里的品种相关性就会越低,那么遭遇系统性风险的概率就越低。好比买了一揽子基于A股的基金,然后A股大盘崩了,覆巢之下无完卵,那一篮子的鸡蛋也碎了。而投资全球基金,就是把鸡蛋装到不同的篮子,甚至不同的车子里。
 
 
 
本期雪球老司基评测选出了8只全球市场主题基金,我们来对其进行评测,来看看各自的风格,哪一只的风格适合你。
 
 
 
本次评测的8个全球基金如下:
 

20230708009.jpg

 
 
其中,易方达标普消费品,广发全球医疗保健,华安标普全球石油,诺安全球黄金这4个基金为跟踪指数型基金,主要考察基金经理对指数跟踪误差的控制能力。
 
工银全球精选股票,国富全球科技互联,富国全球科技互联,银华抗通胀主题主要考验基金经理的选股,择时能力。
 

Screenshotfrom2023-07-0522-04-26.png

 
 
 
同为投资标的为科技互联网的国富全球科技互联和富国全球科技互联,名字很像,只不过是两个基金公司发行的基金。不过它俩最近三年的收益率差距很大,国富全球科技互联(006373)最近三年的收益率为32%,而富国全球科技互联(100055)的最近三年的收益率却为-7%, 同为全球科技型股票基金,为何二者差距会有这么大呢?
 
 
 
根据最新的季报信息,二者的规模与持仓比较如下:
 
 
 

20230708005.jpg

 
 
二者都属于小规模基金,规模小于3个亿,而国富全球科技互联(006373)其基金规模更加低于一个亿。国富全球科技互联(006373)的持仓股票占比比富国全球科技互联(100055)要高近20%(79% vs 61%)
 
 
 
而对比一下二者的十大持仓股,黄色标注的为中概股(港股),富国全球科技(100055)十大持仓里有8个中概股。
 
 

20230708006.jpg

 
 
这种情况下,很难躲过中概股的这一轮下跌的。
 
而最近2年的中概股走势你们也是有目共睹的。
 
 

20230708007.jpg

 
 
 
就这样跌跌跌的走势,还想着赚钱? 能保本不亏已经算是人上人了。
 
因此富国全球科技(100055)在评测的这8个海外基金里面,最近3年的收益率是最低的。见最上面的近三年收益率图
 
而这两只海外QDII基金的规模有点小,尤其是国富全球科技互联(006373),当前规模只有8千万,遇到暴跌行情时会有赎回的流动性问题,且有触发低于规定规模(一般3千万)而清盘的风险。
 
 
 
在这8只全球海外基金里,还有一只重仓科技互联网的基金,工银全球精选股票,目前该基金经理为林念。而且它的基金规模接近4个亿,比富国全球科技和国富全球科技互联的规模要大。
 
 
 
其十大持仓股:

20230708010.jpg

工银全球精选股票
 
从上图可以看到该基金的十大持仓里基本囊括了微软谷歌META这种美国优秀互联网企业,也有国内腾讯,台积电这样的互联网,芯片龙头企业。
 
 
 
而该基金从成立到现在,该基金的累计收益率为200%,最大回撤为-28%, 回撤控制得相当不错。对于厌恶风险的朋友,又想投资互联网科技股的朋友可以考虑考虑此基金。

20230708011-v2.jpg

工银全球精选最大回撤
 
如果你想像买国内贵州茅台股票那样的消费品,来对标买入全球范围内类似茅台此类优秀的股票,那么买入跟踪全球的消费指数的基金----易方达标普消费品,是一个很不错的选择。
 
 
 
从它的跟踪标的来看,它的确如茅台一样,在国内看来,持有的都是些奢华的消费品。

20230708013.jpg

易方达标普消费品十大持仓
 
国内百姓日常能买的,这里面也只有耐克了。。。。。
 
这些公司的奢侈品如茅台一样具有很高的溢价,为了维持品牌形象,它们的定价策略是不轻易走降价路线的,况且也不愁卖不出。
 
正如雪球上的主流投资理念,买股票就是买公司;买入易方达标普消费品QDII基金,等于一篮子买入了这些奢侈品公司,何不美哉?
 
 
 
如何选择适合我的QDII基金?
 
先看最近5年每年度的收益率以及近5年的收益率:
 
20230708016.jpg

最近5年的年度收益率
 

20230708017.jpg

5年累计收益
 
石油,黄金,抗通胀类的基金,属于周期性的品种,个人觉得是不能长持的,一旦在上涨周期的冲顶阶段迈入了,很可能就是要被套个几年了。如果一直持有会一直坐过山车;这类基金适合在周期底部开始买入;一般而言,底部要比顶部要好判断的多。有反弹了,可以继续持有,等待上涨周期的到来;而且不能买入过早,不然前期会比较煎熬,比较考验耐心。
 
而医疗和消费是可以长期持有并穿越牛熊的。从最近5年的广发全球医疗和易方达标普消费的每年收益率和近5年总收益率来看,绝大部分年份都不是涨幅最大的,但跌幅也不是最大的,波动不如其他几个科技,石油来的大,但累计收益却是最大的2个。这其实和股票交易的很像,每天上蹿下跳的,实际几年下来可能还是原地踏步甚至倒退。
 
 
 
广发全球医疗成立以来的业绩曲线

20230709006.jpg

广发全球医疗
波动率和最大回撤都要比沪深300低,截止当前的累计收益率为141%,高于沪深300的56%,典型的长牛走势。
 
 
 
虽然石油类QDII具有强周期属性,但作为基金市场上场内外购买渠道里,直接对标全球原油的基金只有华安标普全球石油和广发石油指数,人气更高的华宝油气挂钩的则是上游油气开采的企业,和石油价格相关性比华安石油和广发石油要低不少。原来的银行渠道的可以直接购买的原油宝等高风险产品,因负油价事件已经被暂停了。
 
 
 
华安标普全球石油跟踪的石油指数为标普全球石油指数,其指数走势如下:

20230709003.jpg

标普全球石油指数
从这近10年的走势图,2014-2015的高点在2022年中才被收复。
 
该指数的成分股为全球内石油巨头。

20230709005.jpg

标普全球石油指数成分股
 
 
 
由于跟踪的是石油公司,而非石油本身,且分散买入这些石油公司,所以指数波动要比石油价格要小得多,但也是和油价呈现出强相关关系。
 
2020年5月的负油价事件,把该指数和跟踪它的华安标普全球石油砸了个大坑。但不会像石油期货交割那样亏完本金还要倒亏。毕竟基金持有的石油公司的资产,品牌等各类资源还在。
 
 
 
下图为华安标普全球石油160416场内的月K线图。
 

20230709004.jpg

华安标普全球石油
 
所以华安标普全球石油这种QDII基金是普通投资者参与国际大宗商品最便捷,最简单的方式,没有换汇的繁琐和每年5W美刀的限制,不需要开通复杂的商品期货账户,只要有个雪球账户或支付宝账户就可以直接参与国际原油的交易当中了。
 
 
 
## 总结
 
在这8个全球QDII基金里,如果想参与到当下的chatGPT等AI科技浪潮中,看好AI继续引领全球经济,可以选择科技型QDII基金工银全球精选股票;
 
如果要长持稳妥能有够硬的抵御风险能力的QDII基金,那么可以选择易方达标普消费品和广发全球医疗保健;
 
如果对俄乌战事继续悲观,平时对国际时事战争比较关心,那么可以根据事件预测,适时埋伏华安标普全球石油和诺安全球黄金,做一波事件驱动的短线操作。

Ptrade几个order下单接口 order_target order_value order_target_value order_market的不同

Ptrade李魔佛 发表了文章 • 0 个评论 • 1008 次浏览 • 2023-07-10 02:23 • 来自相关话题

接口文档:
https://ptradeapi.com
 





 
注意:大部分函数自适用于交易模块,回测模式不支持部分order函数。
 order_target :
接口通过持仓数量比较将入参的目标数量转换成需要交易的成交,传入 order
接口
 
order_value:
 接口通过 金额/限价 或者 金额/默认最新价 两种方式转换成需要交易的数量,
传入 order 接口
 
order_target_value:
 接口通过持仓金额比较得到需要交易的金额, 金额/限价 或者 金额/默
认最新价 两种方式转换成需要交易的数量,传入 order 接口
 
order 接口:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则最新价代替,都是
限价方式报单。

二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就放到未处理订单
队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。

order_market 接口:
一、
按照传入的 market_type 参数,市价委托方式报单。

二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就翻到未处理订单
队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
之后买单和卖单处理有所不同,买单直接报柜台,卖单会校验持仓最大可卖然后调整数
量再报柜台。

tick_order:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则取档位价格(默
认第一档)
,都是限价方式报单。

二、
直接放到未处理订单队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
 
低门槛入金(2W)开通Ptrade量化API,扫码联系: 查看全部
接口文档:
https://ptradeapi.com
 

20230710002.jpg

 
注意:大部分函数自适用于交易模块,回测模式不支持部分order函数。
 order_target :
接口通过持仓数量比较将入参的目标数量转换成需要交易的成交,传入 order
接口
 
order_value:
 接口通过 金额/限价 或者 金额/默认最新价 两种方式转换成需要交易的数量,
传入 order 接口
 
order_target_value:
 接口通过持仓金额比较得到需要交易的金额, 金额/限价 或者 金额/默
认最新价 两种方式转换成需要交易的数量,传入 order 接口
 
order 接口:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则最新价代替,都是
限价方式报单。

二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就放到未处理订单
队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。

order_market 接口:
一、
按照传入的 market_type 参数,市价委托方式报单。

二、
判断隔夜单和交易时间,交易时间(9:10(系统可配)~15:00)范围的订单会马上
加入未处理订单队列,其他订单先放到一个队列,等时间到交易时间就翻到未处理订单
队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
之后买单和卖单处理有所不同,买单直接报柜台,卖单会校验持仓最大可卖然后调整数
量再报柜台。

tick_order:
一、
先判断 limit_price 是否传入,传入则用传入价格限价,不传入则取档位价格(默
认第一档)
,都是限价方式报单。

二、
直接放到未处理订单队列

三、
未处理订单队列的订单会进行限价判断,如果没有传入限价就按当前最新价处理,
然后报柜台。
 
低门槛入金(2W)开通Ptrade量化API,扫码联系:

QMT vs PTrade资金更新速度|高频中如何处理

Ptrade李魔佛 发表了文章 • 0 个评论 • 1169 次浏览 • 2023-07-06 17:35 • 来自相关话题

QMT vs PTrade资金更新速度|高频中如何处理

平时在手动交易中,下单委托后,再切换回去持仓页面,可以看到你的可用资金变少了。而在QMT和PTrade里面,却可能会表现得不一样。本文用代码和实盘来作对比。希望本文对量化新手有所帮助,记得收藏哦! 公众号首页链接了视频号,里面也有不少的新手入门教程和进阶教程,欢迎观看。

了解量化交易程序里面的资金更新速度,无论对量化T+0日内交易(可转债,T+0 ETF),还是轮动策略调仓,都是必须的。

Ptrade

以交易逆回购为例,这也便于量化新手也可以实践,可以放心跑,不会亏钱。

代码很简单,每个tick_data行情更新时间(3秒)里打印当前的可用资金。中途买入(借出)逆回购后,看看当面打印的可用资金什么时候发生变化。
 
import datetime

def initialize(context):
# 初始化策略
g.already_run = False

def handle_data(context, data):
pass

def get_available_cash(context):
# 读取变量protfolio里的可用资金的值
return context.portfolio.cash

def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')

def tick_data(context, data):
log.info('可用资金{}'.format(get_available_cash(context)))
if not g.already_run:
g.already_run = True
# 卖出100手 R-001
ret = order_tick('131810.SZ', -10, priceGear='1', limit_price=None)

def on_order_response(context, trade_list):
# 委托回调函数,有委托出现就调用此函数
log.info('已委托下单 {}'.format(current_time()))

放到Ptrade的实盘里执行,得到下面日志








下单前可用资金为17902,程序启动后下单时间在10:41:08,卖出10张R-001,市值1000元;间隔3s后打印可用资金,在10:41:13的时候,可用资金依然是17902,此时时间已经过去了5秒;

在10:41:18打印的时候资产才发生了变化,此时可用资金为16902,此时距离下单时的10:41:08,已经过去了10秒。所以如果在高频下单时,使用读取内置的context.portfolio.cash 来获取可用资金,那就寄了。那是不是意味着Ptrade无法进行高频率的交易了呢?当然不是的,此时可以使用内置的成交主推函数来更新可用资金,后面下面再介绍。

QMT

而qmt的代码如下,把打印的可用资金的操作放到handlebar里面,它和上面的Ptrade作用一样,每隔3s执行一次。
# encoding:gbk
import datetime


ACCOUNT = '你的账户ID'
start = True

def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)

def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')


def get_available_cash(ContextInfo):
acct_info = get_trade_detail_data(ACCOUNT, 'stock', 'account')
return acct_info[0].m_dAvailable


def deal_callback(ContextInfo, dealInfo):
print('before')
print(dealInfo.m_strProductID)
print(dealInfo.m_nDirection)
print(dealInfo.m_dTradeAmount)
print(dealInfo.m_nVolume)
print(dealInfo.m_dPrice)
print('call back --- ')
print(current_time())

def buy_action(ContextInfo):
opType = 24
orderType = 1101
accountID = ACCOUNT
orderCode = '131810.SZ'
prType = 11
price = 1.8
volume = 10
quickTrade = 2
passorder(opType, orderType, accountID, orderCode, prType, price, volume, quickTrade, ContextInfo)

def handlebar(ContextInfo):
global start
if ContextInfo.is_last_bar():

cash = get_available_cash(ContextInfo)
print('{} 可用资金{}'.format(current_time(),cash))
if start:
print('下单逆回购 131810 ')
buy_action(ContextInfo)
start = False
 
部署到QMT实盘后,执行。

得到下面的运行日志:








从上面的日志看出,程序在14:35:11启动,马上使用passorder下单,卖出1000元的R-001,此时时间14:35:12,马上成交了。而可用资金在下单后的0.47秒后,14:35:12,显示少了1000元。此时的资金状态已经被更新了。

所以QMT的资金持仓更新速度要比Ptrade快出不少的,如果不是追求毫秒级别的话,这个速度足够满足大部分的轮动和T+0操作了。

虽然QMT的资金持仓更新很快,但如果你的策略是高频或偏高频运行,比如你这一个时刻刚刚买入,下一个tick来到时就要卖出,或者采用驱动成交型的网格交易,你无法知道挂单是在哪一个时刻成交的,此时也亦不能一直循环读取你的可以资金或者持仓来判断是否成交,因为这样会阻塞QMT无法进行下一步的操作(除非你本身就是一直在等待成交,成交后才进行下程序一步)。

委托、成交回调函数

Ptrade和QMT都有对应的委托成交回调函数,用于应对需要即时获取成交状态的情景下。

接口文档介绍如下 
Ptrade http://ptradeapi.com/#on_trade_response

QMT:http://qmt.ptradeapi.com/QMT_Python_API_Doc.html#deal-callback








里面就说明了,“该函数会在成交主推回调时响应,比引擎和get_trades()函数更新Order状态的速度更快,适合对速度要求比较高的策略。”

Ptrade的部分代码片段如下:
# 交易回调
def on_trade_response(context, trade_list):
# 成交主推
now = context.blotter.current_dt.strftime("%H:%M:%S")

for trade_info in trade_list:
if trade_info['order_id'] == '':
# 不是本策略跳过
log.info('非本策略订单')
continue

code = trade_info['stock_code']
code = post_fix_convert(code)
business_time = trade_info['business_time']
business_amount = trade_info['business_amount'] # 这个是负数,如果卖出
business_price = trade_info['business_price']
g.total_cash -= business_amount # 马上更新资金状态
 
g.total_cash -= business_amount # 马上更新资金状态g.total_cash是一个全局的可用资金, 可以提前设定好,亦可以是开盘前读取一次你的账户可用资金。

每次成交的那一刻,on_trade_response这个函数就会被动触发,在这里就可以简单的更新你的资金状态了。上面的例子是最基础的更新资金。

实际可以使用其他的诸如dict或类对象来更新仓位。








上面代码是把仓位更新放到一个全局dict里面,key是股票代码,value也是一个dict,里面包含交易时间,持仓数目,价格等等。

好了,时间有限,今天的教程就到这里了,码字不易,欢迎点赞+收藏哦~
  查看全部
QMT vs PTrade资金更新速度|高频中如何处理

平时在手动交易中,下单委托后,再切换回去持仓页面,可以看到你的可用资金变少了。而在QMT和PTrade里面,却可能会表现得不一样。本文用代码和实盘来作对比。希望本文对量化新手有所帮助,记得收藏哦! 公众号首页链接了视频号,里面也有不少的新手入门教程和进阶教程,欢迎观看。

了解量化交易程序里面的资金更新速度,无论对量化T+0日内交易(可转债,T+0 ETF),还是轮动策略调仓,都是必须的。

Ptrade

以交易逆回购为例,这也便于量化新手也可以实践,可以放心跑,不会亏钱。

代码很简单,每个tick_data行情更新时间(3秒)里打印当前的可用资金。中途买入(借出)逆回购后,看看当面打印的可用资金什么时候发生变化。
 
import datetime

def initialize(context):
# 初始化策略
g.already_run = False

def handle_data(context, data):
pass

def get_available_cash(context):
# 读取变量protfolio里的可用资金的值
return context.portfolio.cash

def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')

def tick_data(context, data):
log.info('可用资金{}'.format(get_available_cash(context)))
if not g.already_run:
g.already_run = True
# 卖出100手 R-001
ret = order_tick('131810.SZ', -10, priceGear='1', limit_price=None)

def on_order_response(context, trade_list):
# 委托回调函数,有委托出现就调用此函数
log.info('已委托下单 {}'.format(current_time()))


放到Ptrade的实盘里执行,得到下面日志


20230706001.jpg



下单前可用资金为17902,程序启动后下单时间在10:41:08,卖出10张R-001,市值1000元;间隔3s后打印可用资金,在10:41:13的时候,可用资金依然是17902,此时时间已经过去了5秒;

在10:41:18打印的时候资产才发生了变化,此时可用资金为16902,此时距离下单时的10:41:08,已经过去了10秒。所以如果在高频下单时,使用读取内置的context.portfolio.cash 来获取可用资金,那就寄了。那是不是意味着Ptrade无法进行高频率的交易了呢?当然不是的,此时可以使用内置的成交主推函数来更新可用资金,后面下面再介绍。

QMT

而qmt的代码如下,把打印的可用资金的操作放到handlebar里面,它和上面的Ptrade作用一样,每隔3s执行一次。
# encoding:gbk
import datetime


ACCOUNT = '你的账户ID'
start = True

def init(ContextInfo):
ContextInfo.set_account(ACCOUNT)

def current_time():
return datetime.datetime.now().strftime('%H:%M:%S.%f')


def get_available_cash(ContextInfo):
acct_info = get_trade_detail_data(ACCOUNT, 'stock', 'account')
return acct_info[0].m_dAvailable


def deal_callback(ContextInfo, dealInfo):
print('before')
print(dealInfo.m_strProductID)
print(dealInfo.m_nDirection)
print(dealInfo.m_dTradeAmount)
print(dealInfo.m_nVolume)
print(dealInfo.m_dPrice)
print('call back --- ')
print(current_time())

def buy_action(ContextInfo):
opType = 24
orderType = 1101
accountID = ACCOUNT
orderCode = '131810.SZ'
prType = 11
price = 1.8
volume = 10
quickTrade = 2
passorder(opType, orderType, accountID, orderCode, prType, price, volume, quickTrade, ContextInfo)

def handlebar(ContextInfo):
global start
if ContextInfo.is_last_bar():

cash = get_available_cash(ContextInfo)
print('{} 可用资金{}'.format(current_time(),cash))
if start:
print('下单逆回购 131810 ')
buy_action(ContextInfo)
start = False

 
部署到QMT实盘后,执行。

得到下面的运行日志:


20230705001.jpg



从上面的日志看出,程序在14:35:11启动,马上使用passorder下单,卖出1000元的R-001,此时时间14:35:12,马上成交了。而可用资金在下单后的0.47秒后,14:35:12,显示少了1000元。此时的资金状态已经被更新了。

所以QMT的资金持仓更新速度要比Ptrade快出不少的,如果不是追求毫秒级别的话,这个速度足够满足大部分的轮动和T+0操作了。

虽然QMT的资金持仓更新很快,但如果你的策略是高频或偏高频运行,比如你这一个时刻刚刚买入,下一个tick来到时就要卖出,或者采用驱动成交型的网格交易,你无法知道挂单是在哪一个时刻成交的,此时也亦不能一直循环读取你的可以资金或者持仓来判断是否成交,因为这样会阻塞QMT无法进行下一步的操作(除非你本身就是一直在等待成交,成交后才进行下程序一步)。

委托、成交回调函数

Ptrade和QMT都有对应的委托成交回调函数,用于应对需要即时获取成交状态的情景下。

接口文档介绍如下 
Ptrade http://ptradeapi.com/#on_trade_response

QMT:http://qmt.ptradeapi.com/QMT_Python_API_Doc.html#deal-callback


20230706002.jpg



里面就说明了,“该函数会在成交主推回调时响应,比引擎和get_trades()函数更新Order状态的速度更快,适合对速度要求比较高的策略。”

Ptrade的部分代码片段如下:
# 交易回调
def on_trade_response(context, trade_list):
# 成交主推
now = context.blotter.current_dt.strftime("%H:%M:%S")

for trade_info in trade_list:
if trade_info['order_id'] == '':
# 不是本策略跳过
log.info('非本策略订单')
continue

code = trade_info['stock_code']
code = post_fix_convert(code)
business_time = trade_info['business_time']
business_amount = trade_info['business_amount'] # 这个是负数,如果卖出
business_price = trade_info['business_price']
g.total_cash -= business_amount # 马上更新资金状态

 
g.total_cash -= business_amount # 马上更新资金状态g.total_cash是一个全局的可用资金, 可以提前设定好,亦可以是开盘前读取一次你的账户可用资金。

每次成交的那一刻,on_trade_response这个函数就会被动触发,在这里就可以简单的更新你的资金状态了。上面的例子是最基础的更新资金。

实际可以使用其他的诸如dict或类对象来更新仓位。


20230706003.jpg



上面代码是把仓位更新放到一个全局dict里面,key是股票代码,value也是一个dict,里面包含交易时间,持仓数目,价格等等。

好了,时间有限,今天的教程就到这里了,码字不易,欢迎点赞+收藏哦~
 

目前支持量化接口的万一免五的券商有哪些?

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 2370 次浏览 • 2023-07-04 22:52 • 来自相关话题

支持量化交易的券商如下:




 
其中能够股票免五的有国金证券,国盛证券,国信证券,安信证券。
 
其中,国金证券,国盛证券支持QMT、MiniQMT、Ptrade。
 
国信证券,安信证券支持QMT。
 
东莞证券支持Ptrade
 
可转债默认免五。
 





 
开户后可加入量化技术交流群,可获得编程技术指导。
【提问者需要把问题描述清楚即可,PS: 有些人动不动就说:“Ptrade不行呀”,“QMT垃圾呀”,结果让他贴代码上来瞅瞅,是他本身代码写的拉垮,目前贴出来的已知的问题,90%是个人代码问题。】
 
扫码添加微信咨询开户:

  查看全部
支持量化交易的券商如下:
20230704002.jpg

 
其中能够股票免五的有国金证券,国盛证券,国信证券,安信证券。
 
其中,国金证券,国盛证券支持QMT、MiniQMT、Ptrade。
 
国信证券,安信证券支持QMT。
 
东莞证券支持Ptrade
 
可转债默认免五。
 

20230704003.jpg

 
开户后可加入量化技术交流群,可获得编程技术指导。
【提问者需要把问题描述清楚即可,PS: 有些人动不动就说:“Ptrade不行呀”,“QMT垃圾呀”,结果让他贴代码上来瞅瞅,是他本身代码写的拉垮,目前贴出来的已知的问题,90%是个人代码问题。】
 
扫码添加微信咨询开户:

 

Ptrade/QMT 可转债转股操作 python代码

量化交易李魔佛 发表了文章 • 0 个评论 • 1537 次浏览 • 2023-06-19 18:14 • 来自相关话题

如果想进行折价套利(裸套),需要对持有的转债进行转股操作。
 
而这个转股操作是要在交易时间,也就是盘中时间下一个债转股的命令,然后盘后交易所会更会你盘中下的转股指令,将对应的可转债转为对应的股票,这是,持仓里面的可转债会消失,变成该可转债对应的正股。
 
(当然这是在全部转股的前提下的情况,也有可能有部分人转债只转一部分,这样持仓里面还仍然会有部分可转债没有被转为股票)
 
那么在Ptrade和QMT里面,如何调用API接口进行可转债转股呢?
 
Ptrade:
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)

def before_trading_start(context, data):
g.count = 0

def handle_data(context, data):
if g.count == 0:
# 对持仓内的贝斯进行转股操作
debt_to_stock_order("123075.SZ", -1000)
g.count += 1
# 查看委托状态
log.info(get_orders())
g.count += 1
 主要是上面的函数, 
debt_to_stock_order 传入可转债代码和转股的数量,注意数量用加一个负号。
 
 
QMT可转债转股操作
#coding:gbk
c = True
account = '11111111' # 个人账户
def init(ContextInfo):
pass

def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
#历史k线不应该发出实盘信号 跳过
return

if c:
passorder(80,1101,account,s,5,0,-100,'1',2,'tzbz',ContextInfo)
c=False

 passorder 里面的 80是 普通账户可转债转股
 
更多Ptrade,qmt知识,可以关注公众号

 
  查看全部
如果想进行折价套利(裸套),需要对持有的转债进行转股操作。
 
而这个转股操作是要在交易时间,也就是盘中时间下一个债转股的命令,然后盘后交易所会更会你盘中下的转股指令,将对应的可转债转为对应的股票,这是,持仓里面的可转债会消失,变成该可转债对应的正股。
 
(当然这是在全部转股的前提下的情况,也有可能有部分人转债只转一部分,这样持仓里面还仍然会有部分可转债没有被转为股票)
 
那么在Ptrade和QMT里面,如何调用API接口进行可转债转股呢?
 
Ptrade:
def initialize(context):
g.security = "600570.SS"
set_universe(g.security)

def before_trading_start(context, data):
g.count = 0

def handle_data(context, data):
if g.count == 0:
# 对持仓内的贝斯进行转股操作
debt_to_stock_order("123075.SZ", -1000)
g.count += 1
# 查看委托状态
log.info(get_orders())
g.count += 1

 主要是上面的函数, 
debt_to_stock_order 传入可转债代码和转股的数量,注意数量用加一个负号。
 
 
QMT可转债转股操作
#coding:gbk
c = True
account = '11111111' # 个人账户
def init(ContextInfo):
pass

def handlebar(ContextInfo):
if not ContextInfo.is_last_bar():
#历史k线不应该发出实盘信号 跳过
return

if c:
passorder(80,1101,account,s,5,0,-100,'1',2,'tzbz',ContextInfo)
c=False

 passorder 里面的 80是 普通账户可转债转股
 
更多Ptrade,qmt知识,可以关注公众号

 
 

宁稳可转债全表数据 - 历史数据更新至2023年06-18日

可转债李魔佛 发表了文章 • 0 个评论 • 1162 次浏览 • 2023-06-19 11:16 • 来自相关话题

包含全字段:
转债代码  转债名称  满足  发行日期  股票代码  股票名称  行业  子行业  转债价格  本息  涨跌  日内套利  股价  正股涨跌  剩余本息  转股价格  转股溢价率  转股价值  距离转股日  剩余年限  回售年限  剩余余额  成交额(百万)  转债换手率 余额/市值  余额/股本  股票市值(亿)  P/B 税前收益率  税后收益率  税前回售收益  税后回售收益 回售价值 纯债价值 弹性 信用 折现率 老式双低 老式排名 新式双低 新式排名 热门度





点击查看大图





点击查看大图
 
数据会定期更新,目前更新到本文发文日期,2023-06-18
  查看全部
包含全字段:
转债代码  转债名称  满足  发行日期  股票代码  股票名称  行业  子行业  转债价格  本息  涨跌  日内套利  股价  正股涨跌  剩余本息  转股价格  转股溢价率  转股价值  距离转股日  剩余年限  回售年限  剩余余额  成交额(百万)  转债换手率 余额/市值  余额/股本  股票市值(亿)  P/B 税前收益率  税后收益率  税前回售收益  税后回售收益 回售价值 纯债价值 弹性 信用 折现率 老式双低 老式排名 新式双低 新式排名 热门度

20230619002.jpg

点击查看大图

20230619001-v2.jpg

点击查看大图
 
数据会定期更新,目前更新到本文发文日期,2023-06-18
 

高效操作!linux在终端里快速跳转到文件管理器对应的目录下

Linux马化云 发表了文章 • 0 个评论 • 914 次浏览 • 2023-06-15 19:34 • 来自相关话题

在linux下,可能会有一个经常的操作,是在终端下,进入某个文件夹,用vim修改了某些操作,比如修改了一个html文件;


然后你想用chrome打开这个html文件,那么你可能需要打开文件管理器,切换到上述路径,选中上述修改的html文件。

(具体可以参考vs code的打开方式, cd 到某个目录, 然后运行: "code . " 然后就可以直接用vs code打开当前目录 )

你可以使用以下命令在Linux终端中打开文件浏览器并将其设置为当前目录:

- GNOME桌面环境:在终端中输入 `nautilus .`,即可在当前目录下打开Nautilus文件管理器。
- KDE桌面环境:在终端中输入 `dolphin .`,即可在当前目录下打开Dolphin文件管理器。
- Xfce桌面环境:在终端中输入 `thunar .`,即可在当前目录下打开Thunar文件管理器。
- LXDE桌面环境:在终端中输入 `pcmanfm .`,即可在当前目录下打开PCManFM文件管理器。



这些命令都会在当前目录下启动相应的文件管理器,以便您进行文件操作。



当然,手动敲那么多字也是挺累的。

### 如何自动化?

可以做成别名写到启动环境里面vim ~/.bashrc在这个文件里面的最后一行

加入对应的语句alias here="nautilus ."

以后只要你在终端下面输入 here
那么就会自动打开文件管理器,然后文件管理器的路径和你的终端路径一样。这样很方便吧? 查看全部
在linux下,可能会有一个经常的操作,是在终端下,进入某个文件夹,用vim修改了某些操作,比如修改了一个html文件;


然后你想用chrome打开这个html文件,那么你可能需要打开文件管理器,切换到上述路径,选中上述修改的html文件。

(具体可以参考vs code的打开方式, cd 到某个目录, 然后运行: "code . " 然后就可以直接用vs code打开当前目录 )

你可以使用以下命令在Linux终端中打开文件浏览器并将其设置为当前目录:

- GNOME桌面环境:在终端中输入 `nautilus .`,即可在当前目录下打开Nautilus文件管理器。
- KDE桌面环境:在终端中输入 `dolphin .`,即可在当前目录下打开Dolphin文件管理器。
- Xfce桌面环境:在终端中输入 `thunar .`,即可在当前目录下打开Thunar文件管理器。
- LXDE桌面环境:在终端中输入 `pcmanfm .`,即可在当前目录下打开PCManFM文件管理器。



这些命令都会在当前目录下启动相应的文件管理器,以便您进行文件操作。



当然,手动敲那么多字也是挺累的。

### 如何自动化?

可以做成别名写到启动环境里面
vim ~/.bashrc
在这个文件里面的最后一行

加入对应的语句
alias here="nautilus ."


以后只要你在终端下面输入 
here

那么就会自动打开文件管理器,然后文件管理器的路径和你的终端路径一样。这样很方便吧?

国盛Ptrade又可以重新开了,需要的小伙伴抓紧开啦

Ptrade李魔佛 发表了文章 • 0 个评论 • 1303 次浏览 • 2023-06-14 11:34 • 来自相关话题

作为目前为止,唯一一个可以和外部通讯的Ptrade券商,之前因为账户号码耗尽的原因,暂停了开通Ptrade的业务。
而目前又可以重新开启这个量化业务了。
 
如果不太懂的小伙伴,笔者这里可以稍加详细解释。
这里的外网,指的外部网络,相对券商部署的服务器内网而言的,并不是指墙外的网络哈,这里小伙伴们注意一下哈。
 
 在大部分券商里,Ptrade是封闭环境下运行的,Ptrade是在券商的内部服务器上执行,所以它无法把数据传出外部的服务器,同样也不能访问外面服务器的数据。比如我想获取同花顺的热门概念,由于Ptrade无法访问外部网络,如果内置的Ptrade数据没有提供,就没有办法了。或者用Ptrade想要搞点可转债溢价率,规模的数据,如果没办法联通外网,实际你的策略就无法下手,因为基础数据已经缺乏了。
 
好在国盛的Ptrade支持外网联通,可以用爬虫的方式,读取mysql的方式,读取MQ队列的方式的等等获取外部数据,弥补内置数据的不足。
 
具体可以看这个文章:
http://30daydo.com/article/44453
 
比如下面代码是在ptrade里面访问百度的:
 
import requests

def initialize(context):
# 初始化策略
g.security = "600570.SS"
set_universe(g.security)


def handle_data(context, data):

url='http://www.baidu.com'
headers={'User-Agent':'Google'}
try:
r=requests.get(url,headers=headers)
r.encoding='utf8'
print(r.text)
except Exception as e:
print('error')
print(e)

 
可以看到能够使用requests这个库正常获取数据的,当然requests库是ptrade本身就有的,不需要你再pip安装,当然ptrade也无法pip安装第三方库。
 
ptrade支持的内置库名单:
http://www.30daydo.com/article/44458
 
APScheduler (3.3.1)
arch (3.2)
bcolz (1.2.1)
beautifulsoup4 (4.6.0)
bleach (1.5.0)
boto (2.43.0)
Bottleneck (1.0.0)
bz2file (0.98)
cachetools (3.1.0)
click (4.0)
contextlib2 (0.4.0)
crypto (1.4.1)
cvxopt (1.1.8)
cx-Oracle (8.0.1)
cycler (0.10.0)
cyordereddict (0.2.2)
Cython (0.22.1)
decorator (4.0.10)
entrypoints (0.2.2)
fastcache (1.0.2)
gensim (0.13.3)
h5py (2.6.0)
hmmlearn (0.2.0)
hs-udata (0.3.6)
html5lib (0.9999999)
ipykernel (4.5.0)
ipython (5.1.0)
ipython-genutils (0.1.0)
ipywidgets (5.2.2)
jieba (0.38)
Jinja2 (2.8)
jsonpickle (1.0)
jsonschema (2.5.1)
jupyter (1.0.0)
jupyter-client (4.4.0)
jupyter-console (5.0.0)
jupyter-core (4.2.0)
jupyter-kernel-gateway (1.1.1)
Keras (2.3.1)
Keras-Applications (1.0.8)
Keras-Preprocessing (1.1.0)
line-profiler (2.1.2)
Logbook (1.4.3)
lxml (4.5.0)
Markdown (2.2.0)
MarkupSafe (0.23)
matplotlib (1.5.3)
mistune (0.7.3)
Naked (0.1.31)
nbconvert (4.2.0)
nbformat (4.1.0)
networkx (1.9.1)
nose (1.3.6)
notebook (4.2.3)
numexpr (2.6.1)
numpy (1.11.2)
pandas (0.23.4)
patsy (0.4.0)
pexpect (4.2.1)
pickleshare (0.7.4)
pip (9.0.1)
pkgconfig (1.0.0)
prompt-toolkit (1.0.8)
protobuf (3.3.0)
ptvsd (2.2.0)
ptyprocess (0.5.1)
PyBrain (0.3)
pycrypto (2.6.1)
Pygments (2.1.3)
PyMySQL (0.9.3)
pyparsing (2.1.10)
python-dateutil (2.7.5)
pytz (2015.4)
PyWavelets (0.4.0)
PyYAML (5.3.1)
pyzmq (16.1.0.dev0)
qtconsole (4.2.1)
requests (2.7.0)
retrying (1.3.3)
scikit-learn (0.18)
scipy (0.18.0)
seaborn (0.7.1)
setuptools (28.7.1)
setuptools-scm (3.1.0)
shellescape (3.4.1)
simplegeneric (0.8.1)
simplejson (3.17.0)
six (1.10.0)
sklearn (0.0)
smart-open (1.3.5)
SQLAlchemy (1.0.8)
statsmodels (0.10.2)
TA-Lib (0.4.10)
tables (3.3.0)
tabulate (0.7.5)
tensorflow (1.3.0rc1)
tensorflow-tensorboard (0.1.2)
terminado (0.6)
Theano (0.8.2)
toolz (0.7.4)
tornado (4.4.2)
traitlets (4.3.1)
tushare (1.2.48)
tzlocal (1.3)
wcwidth (0.1.7)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (1.2.6)
xcsc-tushare (1.0.0)
xgboost (0.6a2)
xlrd (1.1.0)
xlwt (1.3.0)
zipline (0.8.3)
You are using pip version 9.0.1, however version 22.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
需要开户可以关注微信公众号
费率优惠多多(万一免五)

后台回复:ptrade开通
 
 
  查看全部
作为目前为止,唯一一个可以和外部通讯的Ptrade券商,之前因为账户号码耗尽的原因,暂停了开通Ptrade的业务。
而目前又可以重新开启这个量化业务了。
 
如果不太懂的小伙伴,笔者这里可以稍加详细解释。
这里的外网,指的外部网络,相对券商部署的服务器内网而言的,并不是指墙外的网络哈,这里小伙伴们注意一下哈。
 
 在大部分券商里,Ptrade是封闭环境下运行的,Ptrade是在券商的内部服务器上执行,所以它无法把数据传出外部的服务器,同样也不能访问外面服务器的数据。比如我想获取同花顺的热门概念,由于Ptrade无法访问外部网络,如果内置的Ptrade数据没有提供,就没有办法了。或者用Ptrade想要搞点可转债溢价率,规模的数据,如果没办法联通外网,实际你的策略就无法下手,因为基础数据已经缺乏了。
 
好在国盛的Ptrade支持外网联通,可以用爬虫的方式,读取mysql的方式,读取MQ队列的方式的等等获取外部数据,弥补内置数据的不足。
 
具体可以看这个文章:
http://30daydo.com/article/44453
 
比如下面代码是在ptrade里面访问百度的:
 
import requests

def initialize(context):
# 初始化策略
g.security = "600570.SS"
set_universe(g.security)


def handle_data(context, data):

url='http://www.baidu.com'
headers={'User-Agent':'Google'}
try:
r=requests.get(url,headers=headers)
r.encoding='utf8'
print(r.text)
except Exception as e:
print('error')
print(e)


 
可以看到能够使用requests这个库正常获取数据的,当然requests库是ptrade本身就有的,不需要你再pip安装,当然ptrade也无法pip安装第三方库。
 
ptrade支持的内置库名单:
http://www.30daydo.com/article/44458
 
APScheduler (3.3.1)
arch (3.2)
bcolz (1.2.1)
beautifulsoup4 (4.6.0)
bleach (1.5.0)
boto (2.43.0)
Bottleneck (1.0.0)
bz2file (0.98)
cachetools (3.1.0)
click (4.0)
contextlib2 (0.4.0)
crypto (1.4.1)
cvxopt (1.1.8)
cx-Oracle (8.0.1)
cycler (0.10.0)
cyordereddict (0.2.2)
Cython (0.22.1)
decorator (4.0.10)
entrypoints (0.2.2)
fastcache (1.0.2)
gensim (0.13.3)
h5py (2.6.0)
hmmlearn (0.2.0)
hs-udata (0.3.6)
html5lib (0.9999999)
ipykernel (4.5.0)
ipython (5.1.0)
ipython-genutils (0.1.0)
ipywidgets (5.2.2)
jieba (0.38)
Jinja2 (2.8)
jsonpickle (1.0)
jsonschema (2.5.1)
jupyter (1.0.0)
jupyter-client (4.4.0)
jupyter-console (5.0.0)
jupyter-core (4.2.0)
jupyter-kernel-gateway (1.1.1)
Keras (2.3.1)
Keras-Applications (1.0.8)
Keras-Preprocessing (1.1.0)
line-profiler (2.1.2)
Logbook (1.4.3)
lxml (4.5.0)
Markdown (2.2.0)
MarkupSafe (0.23)
matplotlib (1.5.3)
mistune (0.7.3)
Naked (0.1.31)
nbconvert (4.2.0)
nbformat (4.1.0)
networkx (1.9.1)
nose (1.3.6)
notebook (4.2.3)
numexpr (2.6.1)
numpy (1.11.2)
pandas (0.23.4)
patsy (0.4.0)
pexpect (4.2.1)
pickleshare (0.7.4)
pip (9.0.1)
pkgconfig (1.0.0)
prompt-toolkit (1.0.8)
protobuf (3.3.0)
ptvsd (2.2.0)
ptyprocess (0.5.1)
PyBrain (0.3)
pycrypto (2.6.1)
Pygments (2.1.3)
PyMySQL (0.9.3)
pyparsing (2.1.10)
python-dateutil (2.7.5)
pytz (2015.4)
PyWavelets (0.4.0)
PyYAML (5.3.1)
pyzmq (16.1.0.dev0)
qtconsole (4.2.1)
requests (2.7.0)
retrying (1.3.3)
scikit-learn (0.18)
scipy (0.18.0)
seaborn (0.7.1)
setuptools (28.7.1)
setuptools-scm (3.1.0)
shellescape (3.4.1)
simplegeneric (0.8.1)
simplejson (3.17.0)
six (1.10.0)
sklearn (0.0)
smart-open (1.3.5)
SQLAlchemy (1.0.8)
statsmodels (0.10.2)
TA-Lib (0.4.10)
tables (3.3.0)
tabulate (0.7.5)
tensorflow (1.3.0rc1)
tensorflow-tensorboard (0.1.2)
terminado (0.6)
Theano (0.8.2)
toolz (0.7.4)
tornado (4.4.2)
traitlets (4.3.1)
tushare (1.2.48)
tzlocal (1.3)
wcwidth (0.1.7)
Werkzeug (0.12.2)
wheel (0.29.0)
widgetsnbextension (1.2.6)
xcsc-tushare (1.0.0)
xgboost (0.6a2)
xlrd (1.1.0)
xlwt (1.3.0)
zipline (0.8.3)
You are using pip version 9.0.1, however version 22.1.2 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

需要开户可以关注微信公众号
费率优惠多多(万一免五)

后台回复:ptrade开通
 
 
 

ChatGPT开启GPT4不限次数使用插件

深度学习马化云 发表了文章 • 0 个评论 • 1638 次浏览 • 2023-06-07 17:50 • 来自相关话题

ChatGPT开启GPT4不限次数使用插件

一个ChatGPT开启GPT4不限次数使用插件:
ChatGPT开启不限次数的GPT4-Mobile,是一个油猴插件,取自iOS客户端的GPT4模型,
因为目前iOS上的客户端GPT4使用次数没有限制,而这个插件就是利用了这个特性实现的GPT4不限次数使用,
 
不过前提是你也是开通ChatGPT Plus的用户才可以的,不过目前插件无法和ChatGPT增强插件:KeepChatGPT同时启用。
感兴趣的同学可以下载体验。
 





 
 
ChatGPT开启GPT4不限次数使用插件下载

地址:ChatGPT开启不限次数的GPT4-Mobile

其他ChatGPT插件
 
1、ChatGPT增强插件 解决各种报错-KeepChatGPT

2、更多ChatGPT工具资源
  查看全部
ChatGPT开启GPT4不限次数使用插件

一个ChatGPT开启GPT4不限次数使用插件:
ChatGPT开启不限次数的GPT4-Mobile,是一个油猴插件,取自iOS客户端的GPT4模型,
因为目前iOS上的客户端GPT4使用次数没有限制,而这个插件就是利用了这个特性实现的GPT4不限次数使用,
 
不过前提是你也是开通ChatGPT Plus的用户才可以的,不过目前插件无法和ChatGPT增强插件:KeepChatGPT同时启用。
感兴趣的同学可以下载体验。
 

ChatGPT开启GPT4不限次数使用插件-GPT4-Mobile.jpg

 
 
ChatGPT开启GPT4不限次数使用插件下载

地址:ChatGPT开启不限次数的GPT4-Mobile

其他ChatGPT插件
 
1、ChatGPT增强插件 解决各种报错-KeepChatGPT

2、更多ChatGPT工具资源
 

国金证券QMT量化新人培训教程

QMT李魔佛 发表了文章 • 0 个评论 • 3556 次浏览 • 2023-05-29 00:37 • 来自相关话题

最近国金证券邀请了QMT技术人员对内部用户进行了新人培训,并提供视频回放。
视频已经整理放到B站:
https://space.bilibili.com/73827743/channel/seriesdetail?sid=3326385&ctype=0
 
视频目录:
 





 
量化新人用QMT+chat GPT快速上手量化策略(一)QMT基础介绍

量化新人用QMT+chat GPT快速上手量化策略(二)QMT均线盘后选股

量化新人用QMT+chat GPT快速上手量化策略(三)一个基本的回测策略代码

量化新人用QMT+chat GPT快速上手量化策略(四) QMT运行一个策略的整体流程

量化新人用QMT+chat GPT快速上手量化策略(五) 获取股票数据

量化新人用QMT+chat GPT快速上手量化策略(六) tablib计算指标

量化新人用QMT+chat GPT快速上手量化策略(七) 下单代码编写
 
欢迎观看并提出疑问。
 
公众号:可转债量化分析 查看全部
最近国金证券邀请了QMT技术人员对内部用户进行了新人培训,并提供视频回放。
视频已经整理放到B站:
https://space.bilibili.com/73827743/channel/seriesdetail?sid=3326385&ctype=0
 
视频目录:
 

20230529001.jpg

 
量化新人用QMT+chat GPT快速上手量化策略(一)QMT基础介绍

量化新人用QMT+chat GPT快速上手量化策略(二)QMT均线盘后选股

量化新人用QMT+chat GPT快速上手量化策略(三)一个基本的回测策略代码

量化新人用QMT+chat GPT快速上手量化策略(四) QMT运行一个策略的整体流程

量化新人用QMT+chat GPT快速上手量化策略(五) 获取股票数据

量化新人用QMT+chat GPT快速上手量化策略(六) tablib计算指标

量化新人用QMT+chat GPT快速上手量化策略(七) 下单代码编写
 
欢迎观看并提出疑问。
 
公众号:可转债量化分析

akshare 官网地址

量化交易-Ptrade-QMT李魔佛 发表了文章 • 0 个评论 • 3010 次浏览 • 2023-05-25 21:50 • 来自相关话题

https://akshare.xyz/





 
不明白为啥百度前面几页都显示不到akshare的官网。对这个搜索结果实在有点无语。
https://akshare.xyz/

20230525214855705.png

 
不明白为啥百度前面几页都显示不到akshare的官网。对这个搜索结果实在有点无语。

QMT获取实时分笔委托数据用哪个函数?

QMT李魔佛 发表了文章 • 0 个评论 • 1390 次浏览 • 2023-05-24 15:31 • 来自相关话题

.get_market_data 和 get_market_data_ex (第二版)都可以。
 
现在官方更加推荐使用第二版,速度要比第一版的要快,也就是推荐使用  .get_market_data_ex。
 
具体怎么使用呢?
 
def init(ContextInfo):
ContextInfo.run_time('execution', '3nSecond', '2019-10-14 13:20:00',)

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
data = ContextInfo.get_market_data_ex(
[], ['123136.SZ'], period='tick'
, start_time='', end_time='', count=1
, dividend_type='follow', fill_data=True
, subscribe=True)
print(data)


def handlebar(ContextInfo):
#计算当前主图的cci
pass上面代码是每个3秒获取一次 城市转债 的分笔/逐笔数据。
 
然后在实盘重运行得到下面的结果:





 
(点击放大)
 
可以拿到分笔委托的价格,委卖1到5,委托量也可以看到,买和卖的5挡数据。
 
更多QMT的知识分享: 查看全部
.get_market_data 和 get_market_data_ex (第二版)都可以。
 
现在官方更加推荐使用第二版,速度要比第一版的要快,也就是推荐使用  .get_market_data_ex。
 
具体怎么使用呢?
 
def init(ContextInfo):
ContextInfo.run_time('execution', '3nSecond', '2019-10-14 13:20:00',)

def execution(ContextInfo):
if not ContextInfo.is_last_bar():
return
data = ContextInfo.get_market_data_ex(
[], ['123136.SZ'], period='tick'
, start_time='', end_time='', count=1
, dividend_type='follow', fill_data=True
, subscribe=True)
print(data)


def handlebar(ContextInfo):
#计算当前主图的cci
pass
上面代码是每个3秒获取一次 城市转债 的分笔/逐笔数据。
 
然后在实盘重运行得到下面的结果:

20230524152638683.png

 
(点击放大)
 
可以拿到分笔委托的价格,委卖1到5,委托量也可以看到,买和卖的5挡数据。
 
更多QMT的知识分享:

QMT委托对象orderInfo的属性以及对应的值

QMT李魔佛 发表了文章 • 0 个评论 • 1379 次浏览 • 2023-05-18 15:43 • 来自相关话题

又得吐槽一次QMT的文档设计与撰写者。纯粹是业余水平+为了完成任务滥竽充数的API接口文档。
 
官网给出了来的oderInfo里面的字段以及简单的介绍(已经简单得不能再简单了,连对应的是什么类型都不写,懒的一笔)
 
m_strAccountID: 资金账号,账号,账号,资金账号

m_strExchangeID: 证券市场

m_strExchangeName: 交易市场

m_strProductID: 品种代码

m_strProductName: 品种名称

m_strInstrumentID: 证券代码

m_strInstrumentName: 证券名称,合约名称

m_strOrderRef: 内部委托号,下单引用等于股票的内部委托号

m_nOrderPriceType: EBrokerPriceType 类型,例如市价单、限价单

m_nDirection: EEntrustBS 类型,操作,多空,期货多空,股票买卖永远是 48,其他的 dir 同理

m_nOffsetFlag: EOffset_Flag_Type类型,买卖/开平,用此字段区分股票买卖,期货开、平仓,期权买卖等

m_nHedgeFlag: EHedge_Flag_Type 类型,投保

m_dLimitPrice: 委托价格,限价单的限价,就是报价

m_nVolumeTotalOriginal: 委托量,最初委托量

m_nOrderSubmitStatus: EEntrustSubmitStatus 类型,报单状态,提交状态,股票中不需要报单状态

m_strOrderSysID: 合同编号,委托号

m_nOrderStatus: EEntrustStatus,委托状态

m_nVolumeTraded: 成交数量,已成交量

m_nVolumeTotal: 委托剩余量,当前总委托量,股票的含义是总委托量减去成交量

m_nErrorID: 状态信息

m_strErrorMsg: 状态信息

m_nTaskId:任务号

m_dFrozenMargin: 冻结金额,冻结保证金

m_dFrozenCommission: 冻结手续费

m_strInsertDate: 委托日期,报单日期

m_strInsertTime: 委托时间

m_dTradedPrice: 成交均价(股票)

m_dCancelAmount: 已撤数量

m_strOptName: 买卖标记,展示委托属性的中文

m_dTradeAmount: 成交金额,成交额,期货 = 均价 * 量 * 合约乘数

m_eEntrustType: EEntrustTypes,委托类别

m_strCancelInfo: 废单原因

m_strUnderCode: 标的证券代码

m_eCoveredFlag: ECoveredFlag,备兑标记 '0' - 非备兑,'1' - 备兑

m_dOrderPriceRMB: 委托价格(人民币),目前用于港股通

m_dTradeAmountRMB: 成交金额(人民币),目前用于港股通

m_dReferenceRate: 汇率,目前用于港股通

m_strCompactNo: 合约编号

m_eCashgroupProp: EXTCompactBrushSource类型,头寸来源

m_dShortOccupedMargin: 预估在途占用保证金,用于期权

m_strXTTrade: 是否是迅投交易

m_strAccountKey: 账号key,唯一区别不同账号的key

m_strRemark:投资备注但我们可以直接使用枚举的方法,把上面的属性和对应的值列出来。
 
attr EBrokerPriceType value <class 'EBrokerPriceType'>
attr ECoveredFlag value <class 'ECoveredFlag'>
attr EEntrustBS value <class 'EEntrustBS'>
attr EEntrustStatus value <class 'EEntrustStatus'>
attr EEntrustSubmitStatus value <class 'EEntrustSubmitStatus'>
attr EEntrustTypes value <class 'EEntrustTypes'>
attr EFutureTradeType value <class 'EFutureTradeType'>
attr EHedge_Flag_Type value <class 'EHedge_Flag_Type'>
attr EOffset_Flag_Type value <class 'EOffset_Flag_Type'>
attr ESideFlag value <class 'ESideFlag'>
attr EXTCompactBrushSource value <class 'EXTCompactBrushSource'>
attr EXTCompactStatus value <class 'EXTCompactStatus'>
attr EXTCompactType value <class 'EXTCompactType'>
attr EXTSloTypeQueryMode value <class 'EXTSloTypeQueryMode'>
attr EXTSubjectsStatus value <class 'EXTSubjectsStatus'>
attr __class__ value <class 'COrderDetail'>
attr __delattr__ value <method-wrapper '__delattr__' of COrderDetail object at 0x000000004AD59A60>
attr __dict__ value {}
attr __dir__ value <built-in method __dir__ of COrderDetail object at 0x000000004AD59A60>
attr __doc__ value None
attr __eq__ value <method-wrapper '__eq__' of COrderDetail object at 0x000000004AD59A60>
attr __format__ value <built-in method __format__ of COrderDetail object at 0x000000004AD59A60>
attr __ge__ value <method-wrapper '__ge__' of COrderDetail object at 0x000000004AD59A60>
attr __getattribute__ value <method-wrapper '__getattribute__' of COrderDetail object at 0x000000004AD59A60>
attr __gt__ value <method-wrapper '__gt__' of COrderDetail object at 0x000000004AD59A60>
attr __hash__ value <method-wrapper '__hash__' of COrderDetail object at 0x000000004AD59A60>
attr __init__ value <bound method __init__ of <COrderDetail object at 0x000000004AD59A60>>
attr __init_subclass__ value <built-in method __init_subclass__ of Boost.Python.class object at 0x0000000044C55368>
attr __instance_size__ value 1088
attr __le__ value <method-wrapper '__le__' of COrderDetail object at 0x000000004AD59A60>
attr __lt__ value <method-wrapper '__lt__' of COrderDetail object at 0x000000004AD59A60>
attr __ne__ value <method-wrapper '__ne__' of COrderDetail object at 0x000000004AD59A60>
attr __new__ value <built-in method __new__ of Boost.Python.class object at 0x000007FEDCF525C0>
attr __reduce__ value <bound method <unnamed Boost.Python function> of <COrderDetail object at 0x000000004AD59A60>>
attr __reduce_ex__ value <built-in method __reduce_ex__ of COrderDetail object at 0x000000004AD59A60>
attr __repr__ value <method-wrapper '__repr__' of COrderDetail object at 0x000000004AD59A60>
attr __setattr__ value <method-wrapper '__setattr__' of COrderDetail object at 0x000000004AD59A60>
attr __sizeof__ value <built-in method __sizeof__ of COrderDetail object at 0x000000004AD59A60>
attr __str__ value <method-wrapper '__str__' of COrderDetail object at 0x000000004AD59A60>
attr __subclasshook__ value <built-in method __subclasshook__ of Boost.Python.class object at 0x0000000044C55368>
attr __weakref__ value None
attr j value j
attr m_bEnable value True
attr m_dCancelAmount value 0.0
attr m_dFrozenCommission value 0.15
attr m_dFrozenMargin value 1000.0
attr m_dLimitPrice value 2.3
具体的获取方式,可以到个人的知识星球获取。
星球也会不定时更新一些QMT常见的坑和问题,也可以提问:





 
 
这里简单介绍一下几个常用的字段:
attr m_nOrderStatus value  50
委托状态: 50代表已报, 注意,这里有个坑, 委托状态会返回2次,一次是先显示49,下一次是显示50,状态从待报-变成已报。 
 
  查看全部
又得吐槽一次QMT的文档设计与撰写者。纯粹是业余水平+为了完成任务滥竽充数的API接口文档。
 
官网给出了来的oderInfo里面的字段以及简单的介绍(已经简单得不能再简单了,连对应的是什么类型都不写,懒的一笔)
 
m_strAccountID: 资金账号,账号,账号,资金账号

m_strExchangeID: 证券市场

m_strExchangeName: 交易市场

m_strProductID: 品种代码

m_strProductName: 品种名称

m_strInstrumentID: 证券代码

m_strInstrumentName: 证券名称,合约名称

m_strOrderRef: 内部委托号,下单引用等于股票的内部委托号

m_nOrderPriceType: EBrokerPriceType 类型,例如市价单、限价单

m_nDirection: EEntrustBS 类型,操作,多空,期货多空,股票买卖永远是 48,其他的 dir 同理

m_nOffsetFlag: EOffset_Flag_Type类型,买卖/开平,用此字段区分股票买卖,期货开、平仓,期权买卖等

m_nHedgeFlag: EHedge_Flag_Type 类型,投保

m_dLimitPrice: 委托价格,限价单的限价,就是报价

m_nVolumeTotalOriginal: 委托量,最初委托量

m_nOrderSubmitStatus: EEntrustSubmitStatus 类型,报单状态,提交状态,股票中不需要报单状态

m_strOrderSysID: 合同编号,委托号

m_nOrderStatus: EEntrustStatus,委托状态

m_nVolumeTraded: 成交数量,已成交量

m_nVolumeTotal: 委托剩余量,当前总委托量,股票的含义是总委托量减去成交量

m_nErrorID: 状态信息

m_strErrorMsg: 状态信息

m_nTaskId:任务号

m_dFrozenMargin: 冻结金额,冻结保证金

m_dFrozenCommission: 冻结手续费

m_strInsertDate: 委托日期,报单日期

m_strInsertTime: 委托时间

m_dTradedPrice: 成交均价(股票)

m_dCancelAmount: 已撤数量

m_strOptName: 买卖标记,展示委托属性的中文

m_dTradeAmount: 成交金额,成交额,期货 = 均价 * 量 * 合约乘数

m_eEntrustType: EEntrustTypes,委托类别

m_strCancelInfo: 废单原因

m_strUnderCode: 标的证券代码

m_eCoveredFlag: ECoveredFlag,备兑标记 '0' - 非备兑,'1' - 备兑

m_dOrderPriceRMB: 委托价格(人民币),目前用于港股通

m_dTradeAmountRMB: 成交金额(人民币),目前用于港股通

m_dReferenceRate: 汇率,目前用于港股通

m_strCompactNo: 合约编号

m_eCashgroupProp: EXTCompactBrushSource类型,头寸来源

m_dShortOccupedMargin: 预估在途占用保证金,用于期权

m_strXTTrade: 是否是迅投交易

m_strAccountKey: 账号key,唯一区别不同账号的key

m_strRemark:投资备注
但我们可以直接使用枚举的方法,把上面的属性和对应的值列出来。
 
attr EBrokerPriceType value  <class 'EBrokerPriceType'>
attr ECoveredFlag value <class 'ECoveredFlag'>
attr EEntrustBS value <class 'EEntrustBS'>
attr EEntrustStatus value <class 'EEntrustStatus'>
attr EEntrustSubmitStatus value <class 'EEntrustSubmitStatus'>
attr EEntrustTypes value <class 'EEntrustTypes'>
attr EFutureTradeType value <class 'EFutureTradeType'>
attr EHedge_Flag_Type value <class 'EHedge_Flag_Type'>
attr EOffset_Flag_Type value <class 'EOffset_Flag_Type'>
attr ESideFlag value <class 'ESideFlag'>
attr EXTCompactBrushSource value <class 'EXTCompactBrushSource'>
attr EXTCompactStatus value <class 'EXTCompactStatus'>
attr EXTCompactType value <class 'EXTCompactType'>
attr EXTSloTypeQueryMode value <class 'EXTSloTypeQueryMode'>
attr EXTSubjectsStatus value <class 'EXTSubjectsStatus'>
attr __class__ value <class 'COrderDetail'>
attr __delattr__ value <method-wrapper '__delattr__' of COrderDetail object at 0x000000004AD59A60>
attr __dict__ value {}
attr __dir__ value <built-in method __dir__ of COrderDetail object at 0x000000004AD59A60>
attr __doc__ value None
attr __eq__ value <method-wrapper '__eq__' of COrderDetail object at 0x000000004AD59A60>
attr __format__ value <built-in method __format__ of COrderDetail object at 0x000000004AD59A60>
attr __ge__ value <method-wrapper '__ge__' of COrderDetail object at 0x000000004AD59A60>
attr __getattribute__ value <method-wrapper '__getattribute__' of COrderDetail object at 0x000000004AD59A60>
attr __gt__ value <method-wrapper '__gt__' of COrderDetail object at 0x000000004AD59A60>
attr __hash__ value <method-wrapper '__hash__' of COrderDetail object at 0x000000004AD59A60>
attr __init__ value <bound method __init__ of <COrderDetail object at 0x000000004AD59A60>>
attr __init_subclass__ value <built-in method __init_subclass__ of Boost.Python.class object at 0x0000000044C55368>
attr __instance_size__ value 1088
attr __le__ value <method-wrapper '__le__' of COrderDetail object at 0x000000004AD59A60>
attr __lt__ value <method-wrapper '__lt__' of COrderDetail object at 0x000000004AD59A60>
attr __ne__ value <method-wrapper '__ne__' of COrderDetail object at 0x000000004AD59A60>
attr __new__ value <built-in method __new__ of Boost.Python.class object at 0x000007FEDCF525C0>
attr __reduce__ value <bound method <unnamed Boost.Python function> of <COrderDetail object at 0x000000004AD59A60>>
attr __reduce_ex__ value <built-in method __reduce_ex__ of COrderDetail object at 0x000000004AD59A60>
attr __repr__ value <method-wrapper '__repr__' of COrderDetail object at 0x000000004AD59A60>
attr __setattr__ value <method-wrapper '__setattr__' of COrderDetail object at 0x000000004AD59A60>
attr __sizeof__ value <built-in method __sizeof__ of COrderDetail object at 0x000000004AD59A60>
attr __str__ value <method-wrapper '__str__' of COrderDetail object at 0x000000004AD59A60>
attr __subclasshook__ value <built-in method __subclasshook__ of Boost.Python.class object at 0x0000000044C55368>
attr __weakref__ value None
attr j value j
attr m_bEnable value True
attr m_dCancelAmount value 0.0
attr m_dFrozenCommission value 0.15
attr m_dFrozenMargin value 1000.0
attr m_dLimitPrice value 2.3

具体的获取方式,可以到个人的知识星球获取。
星球也会不定时更新一些QMT常见的坑和问题,也可以提问:

20230518001.jpg

 
 
这里简单介绍一下几个常用的字段:
attr m_nOrderStatus value  50
委托状态: 50代表已报, 注意,这里有个坑, 委托状态会返回2次,一次是先显示49,下一次是显示50,状态从待报-变成已报。 
 
 

vim配置运行node.js快捷键

Linux马化云 发表了文章 • 0 个评论 • 840 次浏览 • 2023-05-17 11:55 • 来自相关话题

我们知道在vim下可以按下 :!node hello.js

这样的方式来运行nodejs程序,这样就可以不用再开一个窗口去输入命令,运行。
 
不过手动输入那么多,显然是不符合vim的用法的。
那么我们使用一个快捷键定义,把按键次数减少。
 
打开.vimrc
 
加入一行 
nnoremap nr :!node %<CR> 
 
这样就是设置一个快捷键 nr
 
每次在命令行模式下,按下nr,
 
就可以运行当前的node文件了。快捷不?
 
  查看全部
我们知道在vim下可以按下 :!node hello.js

这样的方式来运行nodejs程序,这样就可以不用再开一个窗口去输入命令,运行。
 
不过手动输入那么多,显然是不符合vim的用法的。
那么我们使用一个快捷键定义,把按键次数减少。
 
打开.vimrc
 
加入一行 
nnoremap nr :!node %<CR> 
 
这样就是设置一个快捷键 nr
 
每次在命令行模式下,按下nr,
 
就可以运行当前的node文件了。快捷不?
 
 

技术大佬@haoel 一路走好,RIP

网络李魔佛 发表了文章 • 0 个评论 • 937 次浏览 • 2023-05-16 01:14 • 来自相关话题

Cloudflare上貌似已经访问不了源站,克隆了一个源站( http://rip.30daydo.com )。曾经得到技术大佬的一个邮件回复,给与的技术支持与鼓励,永不忘。
希望技术大佬的文章能够常驻。
 
RIP
走好~ 查看全部

20230516001.jpg

Cloudflare上貌似已经访问不了源站,克隆了一个源站( http://rip.30daydo.com )。曾经得到技术大佬的一个邮件回复,给与的技术支持与鼓励,永不忘。
希望技术大佬的文章能够常驻。
 
RIP
走好~

QMT运行后的历史日志保存在哪个位置?

QMT李魔佛 发表了文章 • 0 个评论 • 1383 次浏览 • 2023-05-11 14:10 • 来自相关话题

如果退出了QMT,那么在当前窗口运行的日志就会跟着消失。
 
PS: 知乎上这位是抄袭我的:
https://zhuanlan.zhihu.com/p/650119640
 
我这里有很多QMT的文章,都是没有原创没有加水印的





 
如果想要找回以前的历史日志,可以到下面的路径寻找;
以国信证券的iquant为例:
 
C:\iquant_gx\userdata\log
 
具体以你的券商路径安装名字为准
 





 
个人的日志输出在文件名:
XtClient_FormulaOutput_20230426 (后面的是日期,具体根据你要查找的时间来找)
 





 
看到没?
上面的日志就是记录当时的策略输出。
 
国信证券iQuant, 万一免五 开户,无门槛开通,
需要的可以联系:
可开通miniqmt 查看全部
如果退出了QMT,那么在当前窗口运行的日志就会跟着消失。
 
PS: 知乎上这位是抄袭我的:
https://zhuanlan.zhihu.com/p/650119640
 
我这里有很多QMT的文章,都是没有原创没有加水印的

20230511001.jpg

 
如果想要找回以前的历史日志,可以到下面的路径寻找;
以国信证券的iquant为例:
 
C:\iquant_gx\userdata\log
 
具体以你的券商路径安装名字为准
 

mmexport1683784887096.png

 
个人的日志输出在文件名:
XtClient_FormulaOutput_20230426 (后面的是日期,具体根据你要查找的时间来找)
 

20230511002.jpg

 
看到没?
上面的日志就是记录当时的策略输出。
 
国信证券iQuant, 万一免五 开户,无门槛开通,
需要的可以联系:
可开通miniqmt

拼多多上的台式主机坑真多

Linux李魔佛 发表了文章 • 0 个评论 • 3555 次浏览 • 2023-05-10 16:49 • 来自相关话题

本来想升级下主机,结果下单后才发现一堆深坑。 我觉得可能普通消费者未必能够发现的。这里罗列一下。
(pdd上面的价格虽然价格很低,但是要相信一分价钱一分货)
 
首先是CPU
比如常见的i7 11800H , 11代的i7, 可能性能很炸裂。
可是H后缀的CPU,不是给台式机的! 它是属于笔记本系列的弱鸡CPU! 性能上比同样台式机的要秒飞不少。
 
比如下面的这张图:




 
什么i5 12500H,i7 11800H,都是笔记本CPU。
 
比如11代的i7.
正常上京东的主板+cpu。





价格要3000多。
 
而带H后缀的CPU+主板





 
1500不到,价格比台式机的要腰斩一半哦。
 
然后还有显卡。
有些显卡带有Laptop后缀的。
 
比如这样的。




 
这个显卡的核心 GPU,是Laptop的, 不懂英文的可以百度词典一下, 这个是笔记本的意思,
 
也就是说这个显卡的核心,也是给笔记本的。
 
同样,京东或者pdd上也有卖这样的移动端核心的显卡。3060的laptop版本的显卡,只要1000多。
 
而台式机版本的要2000多。
 
我就说,我在京东上用京东装机,自己搞下来了,无论怎么搞,价格都无法比拼多多的要低,主要是他们的价格还低很多,低到让人怀疑。
  查看全部
本来想升级下主机,结果下单后才发现一堆深坑。 我觉得可能普通消费者未必能够发现的。这里罗列一下。
(pdd上面的价格虽然价格很低,但是要相信一分价钱一分货)
 
首先是CPU
比如常见的i7 11800H , 11代的i7, 可能性能很炸裂。
可是H后缀的CPU,不是给台式机的! 它是属于笔记本系列的弱鸡CPU! 性能上比同样台式机的要秒飞不少。
 
比如下面的这张图:
1683707737121.jpg

 
什么i5 12500H,i7 11800H,都是笔记本CPU。
 
比如11代的i7.
正常上京东的主板+cpu。

20230510002.jpg

价格要3000多。
 
而带H后缀的CPU+主板

20230510003.jpg

 
1500不到,价格比台式机的要腰斩一半哦。
 
然后还有显卡。
有些显卡带有Laptop后缀的。
 
比如这样的。
1683708182688-v2.jpg

 
这个显卡的核心 GPU,是Laptop的, 不懂英文的可以百度词典一下, 这个是笔记本的意思,
 
也就是说这个显卡的核心,也是给笔记本的。
 
同样,京东或者pdd上也有卖这样的移动端核心的显卡。3060的laptop版本的显卡,只要1000多。
 
而台式机版本的要2000多。
 
我就说,我在京东上用京东装机,自己搞下来了,无论怎么搞,价格都无法比拼多多的要低,主要是他们的价格还低很多,低到让人怀疑。
 

用户问的比较多的关于ptrade基础问题

Ptrade李魔佛 发表了文章 • 0 个评论 • 1651 次浏览 • 2023-05-04 01:19 • 来自相关话题

一些星友(星球好友)问的比较多的问题: 
 
1. 国金的Ptrade 实盘交易客户端是无法进行回测的,在任何时间段;
而模拟客户端可以,可以找自己的经理申请一个Ptrade模拟客户端账户; 
 
2. 国盛的Ptrade实盘交易客户端仅在交易时间无法回测,但非交易时间可以回测;
主要是因为实盘回测和交易在同一个服务器,回测占用过多资源会影响实盘交易;模拟客户端没有这个问题;

任何时间段均可以回测; (之前某个券商的ptrade实盘服务器,因为某个用户开了40多个回测策略,一直在后台运行,而且是关于运算密集型的,导致实盘交易的程序也崩溃了)
 
3. 国金Ptrade无法回测星球上面的可转债实盘代码,实盘代码是基于当前的实时数据,用来进行回测没有意义,因为获取不到可转债的历史数据(溢价率,规模等),只有历史的价格数据; 
 
4. 国金Ptrade无法使用星球上的可转债代码进行实盘,因为无法访问外网,无法访问我部署的接口数据; 而国盛的Ptrade可以;如果国金Ptrade需要实盘交易可转债,需要手工上传一些基础数据,Ptrade提供上传功能,具体操作可查找星球相关文章; 
 
5. 在共享的Ptrade模拟试用账户上,不要保留个人代码记录,跑完后记得删除,否则其他共有同一个账户的人可以进去修改复制你的策略和代码;如果是单独的个人模拟账户,则没有这个问题。
  查看全部
一些星友(星球好友)问的比较多的问题: 
 
1. 国金的Ptrade 实盘交易客户端是无法进行回测的,在任何时间段;
而模拟客户端可以,可以找自己的经理申请一个Ptrade模拟客户端账户; 
 
2. 国盛的Ptrade实盘交易客户端仅在交易时间无法回测,但非交易时间可以回测;
主要是因为实盘回测和交易在同一个服务器,回测占用过多资源会影响实盘交易;模拟客户端没有这个问题;

任何时间段均可以回测; (之前某个券商的ptrade实盘服务器,因为某个用户开了40多个回测策略,一直在后台运行,而且是关于运算密集型的,导致实盘交易的程序也崩溃了)
 
3. 国金Ptrade无法回测星球上面的可转债实盘代码,实盘代码是基于当前的实时数据,用来进行回测没有意义,因为获取不到可转债的历史数据(溢价率,规模等),只有历史的价格数据; 
 
4. 国金Ptrade无法使用星球上的可转债代码进行实盘,因为无法访问外网,无法访问我部署的接口数据; 而国盛的Ptrade可以;如果国金Ptrade需要实盘交易可转债,需要手工上传一些基础数据,Ptrade提供上传功能,具体操作可查找星球相关文章; 
 
5. 在共享的Ptrade模拟试用账户上,不要保留个人代码记录,跑完后记得删除,否则其他共有同一个账户的人可以进去修改复制你的策略和代码;如果是单独的个人模拟账户,则没有这个问题。
 

如何下载Ptrade上的数据?

Ptrade李魔佛 发表了文章 • 0 个评论 • 1388 次浏览 • 2023-04-29 02:40 • 来自相关话题

很多菜鸟会觉得不能下载或者上传数据到Ptrade的。

部分券商的Ptrade可以连通外网,只需要部署一个mysql服务器,或者rabbitMQ,就可以快捷的接受数据了。为啥是这两个,而不是mongodb?

因为ptrade内置的pip装好的库就有pymysql和pyzmq,可以配置下就可以直接开箱使用。如果需要开通有外网功能的Ptrade券商,可以关注公众号:可转债量化分析,后台留言:ptrade外网,即可咨询开通。


1. 首先,我们把数据保存到ptrade的服务端,保存方法多样,比如csv,excel,sql文件等,比如df.to_csv, df.to_excel等等。这里要注意一下,保存的路径。需要指定,/home/fly/notebookimport pickle
from collections import defaultdict
NOTEBOOK_PATH = '/home/fly/notebook/'
'''
持仓N日后卖出,仓龄变量每日pickle进行保存,重启策略后可以保证逻辑连贯
'''
def initialize(context):
#尝试启动pickle文件
try:
with open(NOTEBOOK_PATH+'hold_days.pkl','rb') as f:
g.hold_days = pickle.load(f)

2. 文件保存了之后,接着就可以下载了。

   数据在研究的页面那里。







然后点击某个文件,

如果是非纯文本文件,比如excel文件,会显示:Error! not UTF-8 encoded

Saving disable

See console for more details
不用理会,直接点击左上角的文件,下载,选择本地的路径,然后文件就可以下载下来了。 查看全部
很多菜鸟会觉得不能下载或者上传数据到Ptrade的。

部分券商的Ptrade可以连通外网,只需要部署一个mysql服务器,或者rabbitMQ,就可以快捷的接受数据了。为啥是这两个,而不是mongodb?

因为ptrade内置的pip装好的库就有pymysql和pyzmq,可以配置下就可以直接开箱使用。如果需要开通有外网功能的Ptrade券商,可以关注公众号:可转债量化分析,后台留言:ptrade外网,即可咨询开通。


1. 首先,我们把数据保存到ptrade的服务端,保存方法多样,比如csv,excel,sql文件等,比如df.to_csv, df.to_excel等等。这里要注意一下,保存的路径。需要指定,/home/fly/notebook
import pickle
from collections import defaultdict
NOTEBOOK_PATH = '/home/fly/notebook/'
'''
持仓N日后卖出,仓龄变量每日pickle进行保存,重启策略后可以保证逻辑连贯
'''
def initialize(context):
#尝试启动pickle文件
try:
with open(NOTEBOOK_PATH+'hold_days.pkl','rb') as f:
g.hold_days = pickle.load(f)


2. 文件保存了之后,接着就可以下载了。

   数据在研究的页面那里。


20230429001.jpg


然后点击某个文件,

如果是非纯文本文件,比如excel文件,会显示:
Error! not UTF-8 encoded

Saving disable

See console for more details

不用理会,直接点击左上角的文件,下载,选择本地的路径,然后文件就可以下载下来了。

20230429002.jpg

迅投QMT修改编辑器字体大小,4个空格缩进(默认是TAB),背景颜色

QMT李魔佛 发表了文章 • 0 个评论 • 1622 次浏览 • 2023-04-25 12:22 • 来自相关话题

QMT的默认编辑器是非常难用的。字体,大小,颜色,编码,缩进,一言难尽。
 
而且在菜单里面也找不到设置的地方。
 
其实用户是可以修改这个编辑器的配置的。
 
找到QMT的安装目录,找到config文件夹,里面有个editor.xml 的文件,用记事本或者notepad++等文本编辑器打开。
 





 
如果要修改字体大小,可以修改: 
 
  <font FamilyName="Courier New" IsBold="false" size="16"/>
 
把size设置大一点,字体即可变大。
 
如果要把tab缩进改为空格缩进(主流IDE,pycharm vscode都是4个空格缩进的),可以改成下面的
        <font FamilyName="Courier New" IsBold="false" size="20"/>

        <align TabStop="4" AutoIndent="true" IndentationsUseTabs="false" WrapWord="false"/>
 






 
如果需要修改背景色:
同理:
        <color bgcolor="255,255,255"/>
修改这一行,
比如变成黑色背景
        <color bgcolor="0,0,0"/>
 
PS: 上述配置部分券商可以在QMT的IDE上设置,比如字体大小等,而在这个xml里面修改却生效不了
 
改为后记得重启QMT生效
 
公众号后台回复:
qmt配置文件 
可以获取修改为tab缩进的配置文件
  查看全部
QMT的默认编辑器是非常难用的。字体,大小,颜色,编码,缩进,一言难尽。
 
而且在菜单里面也找不到设置的地方。
 
其实用户是可以修改这个编辑器的配置的。
 
找到QMT的安装目录,找到config文件夹,里面有个editor.xml 的文件,用记事本或者notepad++等文本编辑器打开。
 

20230425001.jpg

 
如果要修改字体大小,可以修改: 
 
  <font FamilyName="Courier New" IsBold="false" size="16"/>
 
把size设置大一点,字体即可变大。
 
如果要把tab缩进改为空格缩进(主流IDE,pycharm vscode都是4个空格缩进的),可以改成下面的
        <font FamilyName="Courier New" IsBold="false" size="20"/>

        <align TabStop="4" AutoIndent="true" IndentationsUseTabs="false" WrapWord="false"/>
 

20231012200620.png


 
如果需要修改背景色:
同理:
        <color bgcolor="255,255,255"/>
修改这一行,
比如变成黑色背景
        <color bgcolor="0,0,0"/>
 
PS: 上述配置部分券商可以在QMT的IDE上设置,比如字体大小等,而在这个xml里面修改却生效不了
 
改为后记得重启QMT生效
 
公众号后台回复:
qmt配置文件 
可以获取修改为tab缩进的配置文件
 

QMT vs Ptrade 速度对比 (二)实时行情速度对比

QMT李魔佛 发表了文章 • 0 个评论 • 1596 次浏览 • 2023-04-23 00:33 • 来自相关话题

上一篇文章(QMT vs Ptrade 速度对比 (一) 历史行情获取速度)对了了QMT和Ptrade的获取历史行情速度,本篇文章继续对它俩的实时行情速度。

本文以获取市场所有可转债的实时行情为例子,比较二者的速度。



Ptrade获取所有可转债实时行情

目前市场上有480多只可转债,由于Ptrade内置的数据源不足以支撑可转债的大部分策略,所以需要调用外部数据源,因此使用国盛证券的Ptrade进行交易,因为目前只有它可以链接外网,你可以把可转债的数据写入到数据库或者写成自己的接口,传递给Ptrade就可以了。

比如下面的基础数据接口。



【目前星球用户可以提供数据接口免费调用功能,提供实时数据功能,强赎倒数多个API接口】

然后调用端使用python的requests库请求下就有了。下面代码可以在Ptrade里面部署运行,用于获取可转债溢价率,剩余规模等数据。







然后在Ptrade的定时执行函数里面获取实时tick数据,使用get_snapshot,把所有的转债代码传入get_snapshot就可以拿到可转债的行情数据了,行情数据3秒更新一次。





在Ptrade里面的运行情况



红框的地方是几个时间点要关注的。

481:获取的转债个数有481

红色数字1的位置: time used

获取行情数据所用的时间,大概在17毫秒(ms)左右,数据一直比较稳定。返回的数据里面字段除了价格,还有昨收价,委买卖1队列,涨停价,成交量等多个数据,参考上图里面的那个字典格式的数据。 具体可以参考接口文档(http://ptradeapi.com)

红色数字2的位置:日志输出时候的时间,也就是程序当前所在时刻,在目前程序在14:42:51,红色数字3的时间,是当前价格的里面的时间,也就tick对应的时间,当前的tick时间是hsTimeStamp: 20230419144251000, 也就是 2023-04-19 14:42:51:000, 所以当前时间程序获取的tick时间是一致的。为什么这里要强调这个呢? 假如当前程序时刻是14:42:51, 而获取的tick timestamp数据是14:42:48,那么说明当前程序拿到的最新tick数据却是在48秒时的数据,也就是数据延时了3秒。所以Ptrade里面的tick数据并没有出现延时滞后。



QMT 实时行情

同样QMT提供的可转债基础也是少的可怜,几乎为零。所以同样调用个人部署的可转债接口数据,如法炮制。PS:通过数据解耦的方式,不同数据可以在不同的量化软件里面使用,省去很多重复编写的代码,即使后面接入掘金,聚宽等平台,你只需要编写下单接口逻辑即可。



QMT取实时行情代码如下:








Bond是一个类,和ptrade里面的一样的,用来获取转债基础数据。

同样在QMT的实盘模式下执行:



网络环境:500M宽带网络,PC:CPU I7 - 内存24GB


stock num : 481 同样获取的是481个转债实时行情数据

红色数字1时间:日志输出的当前时间,获取行情数据前的时间14:43:25

红色数字2时间:日志输出的当前时间,此时为已经获取行情数据后的时间:14:43:34

红色数字3:第一次获取行情数据时间差,达到了9.5秒! 这个数字简直惊呆了。 反复测试几次后,依然如此,使用get_market_data获取实时行情数据,第一次数据到达的时候都要挺久的。

新人刚使用这个函数获取实时行情的时候,往往会以为自己代码出bug,等待很久没数据出来,尤其是获取超过1000个股票代码的行情的时候,等待时候更久,等待时间随着输入的个数增加而增加; 同时QMT占用内存也会稳步增加,如果机子的内存太小,可能还会卡死了。(qmt里面的坑还挺多的)









红色数字6,第二次获取实时行情所用的时间,这一次就快很多了,只用了800毫秒。



随着后续运行,获取实时行情的时间就趋于稳定,从800毫秒慢慢降到150毫秒,最后到13-20毫秒,基本和ptrade差不多级别了。











实时行情延时方面,对比通达信








取110048.SH 这个转债的行情数据作为参考,因为QMT返回字段里面没有带tick的时间戳,所以拿通达信作的分时数据作为的对比,没有用L2,所以框住的位置时间约在14:47:03 ~ 14:47:06

图片上半部分通达信的分时数据,左下角的数据时间是14:47:06,所以数据并没有出现很大的延时。



总结

QMT稳定运行的时候,实时行情基本和Ptrade同一级别水平。但QMT的行情波动性大一些。而在初始启动获取数据时,QMT会非常耗费资源,且等待时间较长,而Ptrade则不存在这种问题。

QMT可以随意获取外部数据,所以对券商没有很高要求;而Ptrade目前只有一家券商(国盛证券)可以自由访问外部数据,如果缺少需要的数据或者指标,将无法实现相应的策略。


参考API接口文档:

Ptrade: http://ptradeapi.com/
QMT: http://qmt.ptradeapi.com/

公众号: 查看全部

上一篇文章(QMT vs Ptrade 速度对比 (一) 历史行情获取速度)对了了QMT和Ptrade的获取历史行情速度,本篇文章继续对它俩的实时行情速度。

本文以获取市场所有可转债的实时行情为例子,比较二者的速度。



Ptrade获取所有可转债实时行情

目前市场上有480多只可转债,由于Ptrade内置的数据源不足以支撑可转债的大部分策略,所以需要调用外部数据源,因此使用国盛证券的Ptrade进行交易,因为目前只有它可以链接外网,你可以把可转债的数据写入到数据库或者写成自己的接口,传递给Ptrade就可以了。

比如下面的基础数据接口。



【目前星球用户可以提供数据接口免费调用功能,提供实时数据功能,强赎倒数多个API接口】

然后调用端使用python的requests库请求下就有了。下面代码可以在Ptrade里面部署运行,用于获取可转债溢价率,剩余规模等数据。







然后在Ptrade的定时执行函数里面获取实时tick数据,使用get_snapshot,把所有的转债代码传入get_snapshot就可以拿到可转债的行情数据了,行情数据3秒更新一次。





在Ptrade里面的运行情况



红框的地方是几个时间点要关注的。

481:获取的转债个数有481

红色数字1的位置: time used

获取行情数据所用的时间,大概在17毫秒(ms)左右,数据一直比较稳定。返回的数据里面字段除了价格,还有昨收价,委买卖1队列,涨停价,成交量等多个数据,参考上图里面的那个字典格式的数据。 具体可以参考接口文档(http://ptradeapi.com

红色数字2的位置:日志输出时候的时间,也就是程序当前所在时刻,在目前程序在14:42:51,红色数字3的时间,是当前价格的里面的时间,也就tick对应的时间,当前的tick时间是hsTimeStamp: 20230419144251000, 也就是 2023-04-19 14:42:51:000, 所以当前时间程序获取的tick时间是一致的。为什么这里要强调这个呢? 假如当前程序时刻是14:42:51, 而获取的tick timestamp数据是14:42:48,那么说明当前程序拿到的最新tick数据却是在48秒时的数据,也就是数据延时了3秒。所以Ptrade里面的tick数据并没有出现延时滞后。



QMT 实时行情

同样QMT提供的可转债基础也是少的可怜,几乎为零。所以同样调用个人部署的可转债接口数据,如法炮制。PS:通过数据解耦的方式,不同数据可以在不同的量化软件里面使用,省去很多重复编写的代码,即使后面接入掘金,聚宽等平台,你只需要编写下单接口逻辑即可。



QMT取实时行情代码如下:


20230420013.jpg



Bond是一个类,和ptrade里面的一样的,用来获取转债基础数据。

同样在QMT的实盘模式下执行:



网络环境:500M宽带网络,PC:CPU I7 - 内存24GB


stock num : 481 同样获取的是481个转债实时行情数据

红色数字1时间:日志输出的当前时间,获取行情数据前的时间14:43:25

红色数字2时间:日志输出的当前时间,此时为已经获取行情数据后的时间:14:43:34

红色数字3:第一次获取行情数据时间差,达到了9.5秒! 这个数字简直惊呆了。 反复测试几次后,依然如此,使用get_market_data获取实时行情数据,第一次数据到达的时候都要挺久的。

新人刚使用这个函数获取实时行情的时候,往往会以为自己代码出bug,等待很久没数据出来,尤其是获取超过1000个股票代码的行情的时候,等待时候更久,等待时间随着输入的个数增加而增加; 同时QMT占用内存也会稳步增加,如果机子的内存太小,可能还会卡死了。(qmt里面的坑还挺多的)









红色数字6,第二次获取实时行情所用的时间,这一次就快很多了,只用了800毫秒。



随着后续运行,获取实时行情的时间就趋于稳定,从800毫秒慢慢降到150毫秒,最后到13-20毫秒,基本和ptrade差不多级别了。











实时行情延时方面,对比通达信

20230420004-v1.jpg




取110048.SH 这个转债的行情数据作为参考,因为QMT返回字段里面没有带tick的时间戳,所以拿通达信作的分时数据作为的对比,没有用L2,所以框住的位置时间约在14:47:03 ~ 14:47:06

图片上半部分通达信的分时数据,左下角的数据时间是14:47:06,所以数据并没有出现很大的延时。



总结

QMT稳定运行的时候,实时行情基本和Ptrade同一级别水平。但QMT的行情波动性大一些。而在初始启动获取数据时,QMT会非常耗费资源,且等待时间较长,而Ptrade则不存在这种问题。

QMT可以随意获取外部数据,所以对券商没有很高要求;而Ptrade目前只有一家券商(国盛证券)可以自由访问外部数据,如果缺少需要的数据或者指标,将无法实现相应的策略。


参考API接口文档:

Ptrade: http://ptradeapi.com/
QMT: http://qmt.ptradeapi.com/

公众号:

【100行python代码实现可转债日内网格-成交驱动】 自定义买卖步长

Ptrade李魔佛 发表了文章 • 0 个评论 • 1553 次浏览 • 2023-04-19 13:27 • 来自相关话题

基于ptrade的可转债日内网格实盘,基于成交驱动,成交后马上挂入下一轮的网格委托。
 
 ## 2023-04-19 更新: 部分成交的需要等待全部成交才触发下一轮挂单

简单的可转债日内网格策略,自定义买卖步长,基准价格,买入与卖出数量,保留底仓张数

开始同时挂买入和卖出委托,如果买入成交后,撤掉委卖(如果是卖出先成交,则撤掉委买),继续挂入下一个步长的委买与委卖,不断循环。


把注释和空格去了100行不到。

代码仅供参考学习具体用法:

用于实盘亏损盈亏自负

后续如果有需要再贴个升级版:多标的网格

或者,额,qmt版本。。。

部分代码截图:




 
 
实盘交易日志:点击查看大图





 






完整代码请参见知识星球.
知识无价,请尊重知识。
  查看全部
基于ptrade的可转债日内网格实盘,基于成交驱动,成交后马上挂入下一轮的网格委托。
 
 ## 2023-04-19 更新: 部分成交的需要等待全部成交才触发下一轮挂单

简单的可转债日内网格策略,自定义买卖步长,基准价格,买入与卖出数量,保留底仓张数

开始同时挂买入和卖出委托,如果买入成交后,撤掉委卖(如果是卖出先成交,则撤掉委买),继续挂入下一个步长的委买与委卖,不断循环。


把注释和空格去了100行不到。

代码仅供参考学习具体用法:

用于实盘亏损盈亏自负

后续如果有需要再贴个升级版:多标的网格

或者,额,qmt版本。。。

部分代码截图:
20230419001.jpg

 
 
实盘交易日志:点击查看大图

20230419003.jpg

 

20230419004.jpg


完整代码请参见知识星球.
知识无价,请尊重知识。
 

本地CPU部署的stable diffusion webui 环境,本地不受限,还可以生成色图黄图

深度学习马化云 发表了文章 • 0 个评论 • 3903 次浏览 • 2023-04-17 00:27 • 来自相关话题

正常输出,生成图的纹理贴图光线很逼真。





 






需要不断调节词汇(英语),打造你想要的人物设定
 






由于本地使用的词汇不限制,还能够生成细节丰富的黄图。(宅男福音)
提供一个语法给你们用用:prompt: beautiful, masterpiece, best quality, extremely detailed face, perfect lighting, (1girl, solo, 1boy, 1girl, NemoNelly, Slight penetration, lying, on back, spread legs:1.5), street, crowd, ((skinny)), ((puffy eyes)), brown hair, medium hair, cowboy shot, medium breasts, swept bangs, walking, outdoors, sunshine, light_rays, fantasy, rococo, hair_flower,low tied hair, smile, half-closed eyes, dating, (nude), nsfw, (heavy breathing:1.5), tears, crying, blush, wet, sweat, <lora:koreanDollLikeness_v15:0.4>, <lora:povImminentPenetration_ipv1:0>, <lora:breastinclassBetter_v14:0.1>





 
整体来说,现在的AI技术和效果就像跃迁了一个台阶。
  查看全部
正常输出,生成图的纹理贴图光线很逼真。

00015-31697332801.png

 

common_(22).jpeg


需要不断调节词汇(英语),打造你想要的人物设定
 

20230416002.jpg


由于本地使用的词汇不限制,还能够生成细节丰富的黄图。(宅男福音)
提供一个语法给你们用用:
prompt: beautiful, masterpiece, best quality, extremely detailed face, perfect lighting, (1girl, solo, 1boy, 1girl, NemoNelly, Slight penetration, lying, on back, spread legs:1.5), street, crowd, ((skinny)), ((puffy eyes)), brown hair, medium hair, cowboy shot, medium breasts, swept bangs, walking, outdoors, sunshine, light_rays, fantasy, rococo, hair_flower,low tied hair, smile, half-closed eyes, dating, (nude), nsfw, (heavy breathing:1.5), tears, crying, blush, wet, sweat, <lora:koreanDollLikeness_v15:0.4>, <lora:povImminentPenetration_ipv1:0>, <lora:breastinclassBetter_v14:0.1>

20230416001.jpg


 
整体来说,现在的AI技术和效果就像跃迁了一个台阶。
 

Stable Diffusion WebUI 模型下载速度很慢,但挂上梯子后速度狂飙

深度学习马化云 发表了文章 • 0 个评论 • 3102 次浏览 • 2023-04-16 00:38 • 来自相关话题

安装命令:$ git clone https ://github.com/AUTOMATIC1111/stable-diffusion-webui.git

$ cd stable-diffusion-webui

$ git checkout 22bcc7be428c94e9408f589966c2040187245d81

# 我们需要 CPU 版本的 torch
$ export TORCH_COMMAND="pip install torch==1.13.1 torchvision==0.14.1 --index-url https: //download.pytorch.org/whl/cpu"
$ export USE_NNPACK=0

# 前 4 个参数是为了让其运行在 CPU 上, 最后一个参数是让 WebUI 可以远程访问
$ bash webui.sh --skip-torch-cuda-test --no-half --precision full --use-cpu all --listen
不过安装实在太慢了。而且安装好了之后,如果下载模型,还要单独下载,也是奇慢。
 
试了下把梯子代理挂上,模型下载就飞快了





 





 
除了模型,还有一些checkpoint文件
Stable diffusion v1.4
stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
 
Stable diffusion v1.5
stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt
 
lora模型
koreanDollLikeness_v15.safetensors
 
等等。
  查看全部
安装命令:
$ git clone https ://github.com/AUTOMATIC1111/stable-diffusion-webui.git

$ cd stable-diffusion-webui

$ git checkout 22bcc7be428c94e9408f589966c2040187245d81

# 我们需要 CPU 版本的 torch
$ export TORCH_COMMAND="pip install torch==1.13.1 torchvision==0.14.1 --index-url https: //download.pytorch.org/whl/cpu"
$ export USE_NNPACK=0

# 前 4 个参数是为了让其运行在 CPU 上, 最后一个参数是让 WebUI 可以远程访问
$ bash webui.sh --skip-torch-cuda-test --no-half --precision full --use-cpu all --listen

不过安装实在太慢了。而且安装好了之后,如果下载模型,还要单独下载,也是奇慢。
 
试了下把梯子代理挂上,模型下载就飞快了

20230415005.jpg

 

202304150061.jpg

 
除了模型,还有一些checkpoint文件
Stable diffusion v1.4
stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt
 
Stable diffusion v1.5
stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.ckpt
 
lora模型
koreanDollLikeness_v15.safetensors
 
等等。
 

没有显卡GPU,想用CPU玩Stable Diffusion 本地部署AI绘图吗? 手把手保姆教程

深度学习马化云 发表了文章 • 0 个评论 • 2025 次浏览 • 2023-04-15 13:16 • 来自相关话题

 





 





 





 





 
在网上看到那些美cry的AI生成的美女图片 ,你是不是也蠢蠢欲动想要按照自己的想法生成一副属于自己的女神照呢?

什么?你的电脑显卡没有显卡? 没关系,今天笔者带大家手把手在本地电脑上使用CPU部署Stable Diffusion+Lora AI绘画 模型。
 
什么是Stable Diffusion ?

Stable Diffusion 是一种通过文字描述创造出图像的 AI 模型. 它是一个开源软件, 有许多人愿意在网络上免费分享他们的计算资源, 使得新手可以在线尝试.

 
安装

本地部署的 Stable Diffusion 有更高的可玩性, 例如允许您替换模型文件, 细致的调整参数, 以及突破线上服务的道德伦理检查等. 鉴于我目前没有可供霍霍的 GPU, 因此我将在一台本地ubuntu上部署,因为Stable Diffusion 在运行过程中大概需要吃掉 12G 内存。如果你的电脑或者服务器没有16GB以上的内存,需要配置一个虚拟内存来扩展你的内存容量,当然,性能也打个折扣,毕竟是在硬盘上扩展的内存空间。

如果你的电脑内存大小大于16GB,可以忽略以下的操作:$ dd if=/dev/zero of=/mnt/swap bs=64M count=256
$ chmod 0600 /mnt/swap
$ mkswap /mnt/swap
$ swapon /mnt/swap笔者的电脑配置:





 
然后直接安装下载并安装 Stable Diffusion WebUI:
 
稍等片刻(依赖你的网速)





 
由于需要连接到github下载源码,所以如果网络不稳定掉线,需要重新运行安装命令就可以了。
 





 
重新运行:bash webui.sh --skip-torch-cuda-test --no-half --precision full --use-cpu all --listen
这个脚本会自动创建python的虚拟环境,并安装对应的pip依赖,一键到位,可谓贴心。果断要到github上给原作者加星
 





 
等待一段时间, 在浏览器中打开 127.0.0.1:7860 即可见到 UI 界面.
 
 
下载更多模型

模型, 有时称为检查点文件(checkpoint), 是预先训练的 Stable Diffusion 权重, 用于生成一般或特定的图像类型. 模型可以生成的图像取决于用于训练它们的数据. 如果训练数据中没有猫, 模型将无法产生猫的形象. 同样, 如果您仅使用猫图像训练模型, 则只会产生猫.

Stable Diffusion WebUI 运行时会自动下载 Stable Diffusion v1.5 模型. 下面提供了一些快速下载其它模型的命令.$ cd models/Stable-diffusion​# Stable diffusion v1.4
# 下面的URL超链接过长有省略号,需要右键复制url$ wget https://huggingface.co/CompVis ... .ckpt




# Stable diffusion v1.5$ wget https://huggingface.co/runwaym ... .ckpt# F222$ wget https://huggingface.co/acheong ... .ckpt# Anything V3$ wget
https://huggingface.co/Linaqru ... nsors

# Open Journey$ wget https://huggingface.co/prompth ... .ckpt# DreamShaper$ wget https://civitai.com/api/download/models/5636 -O dreamshaper_331BakedVae.safetensors# ChilloutMix$ wget https://civitai.com/api/download/models/11745 -O chilloutmix_NiPrunedFp32Fix.safetensors# Robo Diffusion$ wget
https://huggingface.co/nousr/r ... .ckpt

# Mo-di-diffusion$ wget
https://huggingface.co/nitroso ... .ckpt

# Inkpunk Diffusion$ wget
https://huggingface.co/Envvi/I ... .ckpt

修改配置文件

ui-config.json 内包含众多的设置项, 可按照个人的习惯修改部分默认值. 例如我的配置部分如下:{
"txt2img/Batch size/value": 4,
"txt2img/Width/value": 480,
"txt2img/Height/value": 270
}提示语示例model: chilloutmix_NiPrunedFp32Fix.safetensors

prompt: beautiful, masterpiece, best quality, extremely detailed face, perfect lighting, (1girl, solo, 1boy, 1girl, NemoNelly, Slight penetration, lying, on back, spread legs:1.5), street, crowd, ((skinny)), ((puffy eyes)), brown hair, medium hair, cowboy shot, medium breasts, swept bangs, walking, outdoors, sunshine, light_rays, fantasy, rococo, hair_flower,low tied hair, smile, half-closed eyes, dating, (nude), nsfw, (heavy breathing:1.5), tears, crying, blush, wet, sweat, <lora:koreanDollLikeness_v15:0.4>, <lora:povImminentPenetration_ipv1:0>, <lora:breastinclassBetter_v14:0.1>
prompt: paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, (ugly:1.331), (duplicate:1.331), (morbid:1.21), (mutilated:1.21), (tranny:1.331), mutated hands, (poorly drawn hands:1.331), blurry, (bad anatomy:1.21), (bad proportions:1.331), extra limbs, (disfigured:1.331), (missing arms:1.331), (extra legs:1.331), (fused fingers:1.61051), (too many fingers:1.61051), (unclear eyes:1.331), bad hands, missing fingers, extra digit, bad body, pubic
上述提示词结尾引用了 3 个 Lora 模型, 需提前下载至 models/Lora 目录.$ cd models/Lora

$ wget
https://huggingface.co/amornln ... nsors




$ wget
https://huggingface.co/samle/s ... nsors

$ wget https://huggingface.co/jomcs/N ... nsors生成的效果图:





 
 
  查看全部
v2-6d1a26989d9d1f455abbdaa930f8bae3_r.jpg


v2-3f0519e151bbb99fa49934670ec8d0a4_r.jpg

 

v2-992a54d0863a4b1ab6cacc0fe597d81b_r.jpg

 

20230415001.jpg

 

v2-efee1a21df13b177267f31889efc5b40_r.jpg

 

v2-c2e1a2a3a1b0849b3f2b7efb3083fd6b_r.jpg

 
在网上看到那些美cry的AI生成的美女图片 ,你是不是也蠢蠢欲动想要按照自己的想法生成一副属于自己的女神照呢?

什么?你的电脑显卡没有显卡? 没关系,今天笔者带大家手把手在本地电脑上使用CPU部署Stable Diffusion+Lora AI绘画 模型。
 
什么是Stable Diffusion ?


Stable Diffusion 是一种通过文字描述创造出图像的 AI 模型. 它是一个开源软件, 有许多人愿意在网络上免费分享他们的计算资源, 使得新手可以在线尝试.


 
安装

本地部署的 Stable Diffusion 有更高的可玩性, 例如允许您替换模型文件, 细致的调整参数, 以及突破线上服务的道德伦理检查等. 鉴于我目前没有可供霍霍的 GPU, 因此我将在一台本地ubuntu上部署,因为Stable Diffusion 在运行过程中大概需要吃掉 12G 内存。如果你的电脑或者服务器没有16GB以上的内存,需要配置一个虚拟内存来扩展你的内存容量,当然,性能也打个折扣,毕竟是在硬盘上扩展的内存空间。

如果你的电脑内存大小大于16GB,可以忽略以下的操作:
$ dd if=/dev/zero of=/mnt/swap bs=64M count=256
$ chmod 0600 /mnt/swap
$ mkswap /mnt/swap
$ swapon /mnt/swap
笔者的电脑配置:

20230415004.jpg

 
然后直接安装下载并安装 Stable Diffusion WebUI:
 
稍等片刻(依赖你的网速)

20230415002.jpg

 
由于需要连接到github下载源码,所以如果网络不稳定掉线,需要重新运行安装命令就可以了。
 

20230415003.jpg

 
重新运行:
bash webui.sh --skip-torch-cuda-test --no-half --precision full --use-cpu all --listen

这个脚本会自动创建python的虚拟环境,并安装对应的pip依赖,一键到位,可谓贴心。果断要到github上给原作者加星
 

v2-a85a91949b0f08315abd104425ecf7ee_r-v1.jpg

 
等待一段时间, 在浏览器中打开 127.0.0.1:7860 即可见到 UI 界面.
 
 
下载更多模型

模型, 有时称为检查点文件(checkpoint), 是预先训练的 Stable Diffusion 权重, 用于生成一般或特定的图像类型. 模型可以生成的图像取决于用于训练它们的数据. 如果训练数据中没有猫, 模型将无法产生猫的形象. 同样, 如果您仅使用猫图像训练模型, 则只会产生猫.

Stable Diffusion WebUI 运行时会自动下载 Stable Diffusion v1.5 模型. 下面提供了一些快速下载其它模型的命令.
$ cd models/Stable-diffusion​
# Stable diffusion v1.4
# 下面的URL超链接过长有省略号,需要右键复制url
$ wget https://huggingface.co/CompVis ... .ckpt




# Stable diffusion v1.5
$ wget https://huggingface.co/runwaym ... .ckpt
# F222
$ wget https://huggingface.co/acheong ... .ckpt
# Anything V3
$ wget 
https://huggingface.co/Linaqru ... nsors

# Open Journey
$ wget https://huggingface.co/prompth ... .ckpt
# DreamShaper
$ wget https://civitai.com/api/download/models/5636 -O dreamshaper_331BakedVae.safetensors
# ChilloutMix
$ wget https://civitai.com/api/download/models/11745 -O chilloutmix_NiPrunedFp32Fix.safetensors
# Robo Diffusion
$ wget 
https://huggingface.co/nousr/r ... .ckpt

# Mo-di-diffusion
$ wget 
https://huggingface.co/nitroso ... .ckpt

# Inkpunk Diffusion
$ wget 
https://huggingface.co/Envvi/I ... .ckpt

修改配置文件

ui-config.json 内包含众多的设置项, 可按照个人的习惯修改部分默认值. 例如我的配置部分如下:
{
"txt2img/Batch size/value": 4,
"txt2img/Width/value": 480,
"txt2img/Height/value": 270
}
提示语示例
model: chilloutmix_NiPrunedFp32Fix.safetensors

prompt: beautiful, masterpiece, best quality, extremely detailed face, perfect lighting, (1girl, solo, 1boy, 1girl, NemoNelly, Slight penetration, lying, on back, spread legs:1.5), street, crowd, ((skinny)), ((puffy eyes)), brown hair, medium hair, cowboy shot, medium breasts, swept bangs, walking, outdoors, sunshine, light_rays, fantasy, rococo, hair_flower,low tied hair, smile, half-closed eyes, dating, (nude), nsfw, (heavy breathing:1.5), tears, crying, blush, wet, sweat, <lora:koreanDollLikeness_v15:0.4>, <lora:povImminentPenetration_ipv1:0>, <lora:breastinclassBetter_v14:0.1>
prompt: paintings, sketches, (worst quality:2), (low quality:2), (normal quality:2), lowres, normal quality, ((monochrome)), ((grayscale)), skin spots, acnes, skin blemishes, age spot, (ugly:1.331), (duplicate:1.331), (morbid:1.21), (mutilated:1.21), (tranny:1.331), mutated hands, (poorly drawn hands:1.331), blurry, (bad anatomy:1.21), (bad proportions:1.331), extra limbs, (disfigured:1.331), (missing arms:1.331), (extra legs:1.331), (fused fingers:1.61051), (too many fingers:1.61051), (unclear eyes:1.331), bad hands, missing fingers, extra digit, bad body, pubic

上述提示词结尾引用了 3 个 Lora 模型, 需提前下载至 models/Lora 目录.
$ cd models/Lora

$ wget
https://huggingface.co/amornln ... nsors




$ wget 
https://huggingface.co/samle/s ... nsors

$ wget https://huggingface.co/jomcs/N ... nsors
生成的效果图:

11102.png

 
 
 

QMT vs Ptrade 速度对比 (一) 历史行情获取速度

QMT李魔佛 发表了文章 • 0 个评论 • 2065 次浏览 • 2023-04-11 16:45 • 来自相关话题

众所周知(狗头),QMT是在你本地电脑运行的,包括行情获取,计算指标,选股选债,下单都在你的本地电脑执行。行情数据通过网络去券商服务器或者迅投(QMT)服务器获取,拿到数据在你的本地电脑处理,比如计算涨速,量比,然后再使用下单接口把下单指令通过网络提交到券商柜台,券商柜台接到QMT的委托指令后,再提交给交易所。

Ptrade(恒生电子)则是在券商部署的服务器上执行,你下载的Ptrade在你的本地电脑,只是负责写代码,把代码部署到券商服务器,然后在券商服务其执行你的策略,当然你的代码在券商服务器运行时是被加密的。行情获取,计算指标,下单委托都在券商机房内部执行,属于云策略的类型,策略部署好了,就不需要开着本地电脑观察它的状态。

对比环境均为同一个券商下的QMT和Ptrade,均为生产环境的实盘版本。(PS:温馨提示,平时少用模拟版本,bug多,交易不准,还浪费时间。我平时调试都直接在实盘上调试的,要对自己的策略有信心哈,至少回测过了的嘛O(∩_∩)O~~)

历史行情数据获取

目标:获取2022年到昨天的沪深300所有股票的日线收盘价数据。

QMT

获取行情数据 使用这个函数:ContextInfo.get_market_data()用法: ContextInfo.get_market_data(fields, stock_code = , start_time = '',
end_time = '', skip_paused = True, period = 'follow',
dividend_type = 'follow', count = -1)
 open -- 开盘价(str:numpy.float64);
high -- 最高价(str:numpy.float64);
low --最低价(str:numpy.float64);
close -- 收盘价(str:numpy.float64);
volume -- 交易量(str:numpy.float64);
money -- 交易金额(str:numpy.float64);
price -- 最新价(str:numpy.float64);
preclose -- 昨收盘价(str:numpy.float64)(仅日线返回);
high_limit -- 涨停价(str:numpy.float64)(仅日线返回);
low_limit -- 跌停价(str:numpy.float64)(仅日线返回);
unlimited -- 判断查询日是否无涨跌停限制(1:该日无涨跌停限制;0:该日有涨跌停限制)(str:numpy.float64)(仅日线返回);
 
在fields里面指定只获取close价格即可。

QMT测试代码如下:(需要的也可以后台留言回复获取)

[vscode里面的代码,需要复制到qmt里面执行]

把代码复制到QMT里面,然后切换到模型交易,在中间切换到实盘模式,就会运行上面代码。

注意,这里需要第一次运行上面的代码来计算时间,因为QMT会有个cache缓存机制,它会把曾经跑过的历史数据自动下载下来,保存到你的电脑硬盘里,从而加快QMT后续的读取速度,同样的数据没有必要每次再去网络上拉。

大部分情况下网络IO都会是任何一个量化交易系通最大的性能瓶颈。

运行得到下面的结果:







上面运行时间是22秒。不要惊讶哦,首次获取历史行情数据都是挺慢的。如果你的电脑网速够快,或者但在阿里云,腾讯云之类的云服务上跑,获取历史行情速度会有所提高。

在你运行了上面的代码之后,QMT会在某个时刻,在后台把数据下载到本地QMT安装目录下。








文件按照股票代码作为文件名存储。当然里面不是txt格式,而是QMT做了相应的封装的。上面按照修改日期排序,4月11日多了很多新的DAT数据文件,显然是刚刚生成的。

QMT在获取历史行情数据后,会有个触发器,在后台一次性保存大量的文件,所以QMT会在某一个瞬间,界面会出现卡顿,甚至无响应,而看任务管理器会看到内存飙升甚至爆满100%,有些新人菜鸟就认为QMT太占内存,太垃圾的结论,这也是片面的。实际上在数据完备的情况下,QMT需要的内存4GB就够的了。如果你经常会有扫描全市场股票代码历史数据的话,内存还是尽量选大一点的。如果无法避免内存突然飙升,可以每次把获取行情的股票代码列表减少,细分多几批获取,用时间换空间。

当然 QMT也提供了一个下载历史数据的一个菜单入口,用于在图形界面下手动下载历史行情,从而加速历史行情读取速度。








等数据下载完成后,

第二次跑上面的同一个代码,运行时间明显快了。








但用时还是要7.9秒,反复测试几次,获取时间依然是在6-8秒之间波动。 因为程序读取历史行情数据的一个个独立的文件,所以这里硬盘的性能因素对获取行情影响还是很大的。

笔者感觉7.9秒这个速度还是很慢的,换了台性能好一点的的windows机子,下载了历史数据后再跑了一次:







但用时依然在6秒左右。

所以个人是不推荐大家在tick策略里面,在盘中去获取历史数据的,这个动作应该在盘前就应该完成,把数据保存到内存列表或者dataframe变量中,盘中用的时候去取就可以了。 当然低频策略就无所谓啦。

Ptrade

操作上ptrade相对而言更加简洁,容易上手。

它的API设计和它对应的API文档更加规范,可读性更好。

直接把代码复制到量化->策略,新建策略,然后在交易里面添加策略,直接启动策略。代码设置定时运行,在启动策略后的一分钟后运行。








同样获取沪深300的日线数据,2022年1月到2023年4月10日。
get_price - 获取历史数据 get_price(security, start_date=None, end_date=None, frequency='1d', fields=None, fq=None, count=None)
运行 







上面的结果显示,Ptrade获取同样的历史数据耗时只有700毫秒,0.7秒左右。测试多几次,获取时间基本每次都比较平稳,在0.6-0.8秒之间。(下面打印的306不是沪深300的个数,而是获取到的日期的天数,它返回的结构虽然都是panel,但和QMT的轴有点不同)。

结论

总的来说,获取历史行情数据的速度,Ptrade是秒杀了QMT的,不在一个量级上的。

本来想继续对比实时行情,下单延时对比等等,但开盘时间有限,写了一下时间就不够用了。所以把教程拆分为多个系列,下一篇再对比QMT和PTrade的实时行情数据,下单回调等等啦。


如果想要自己测试文中的数据,可以获取代码,公众号 后台回复: 历史行情数据代码

参考API接口文档:

Ptrade: http://ptradeapi.com/

QMT: http://qmt.ptradeapi.com/
 
公众号: 查看全部
众所周知(狗头),QMT是在你本地电脑运行的,包括行情获取,计算指标,选股选债,下单都在你的本地电脑执行。行情数据通过网络去券商服务器或者迅投(QMT)服务器获取,拿到数据在你的本地电脑处理,比如计算涨速,量比,然后再使用下单接口把下单指令通过网络提交到券商柜台,券商柜台接到QMT的委托指令后,再提交给交易所。

Ptrade(恒生电子)则是在券商部署的服务器上执行,你下载的Ptrade在你的本地电脑,只是负责写代码,把代码部署到券商服务器,然后在券商服务其执行你的策略,当然你的代码在券商服务器运行时是被加密的。行情获取,计算指标,下单委托都在券商机房内部执行,属于云策略的类型,策略部署好了,就不需要开着本地电脑观察它的状态。

对比环境均为同一个券商下的QMT和Ptrade,均为生产环境的实盘版本。(PS:温馨提示,平时少用模拟版本,bug多,交易不准,还浪费时间。我平时调试都直接在实盘上调试的,要对自己的策略有信心哈,至少回测过了的嘛O(∩_∩)O~~)

历史行情数据获取

目标:获取2022年到昨天的沪深300所有股票的日线收盘价数据。

QMT

获取行情数据 使用这个函数:ContextInfo.get_market_data()
用法: ContextInfo.get_market_data(fields, stock_code = , start_time = '', 
end_time = '', skip_paused = True, period = 'follow',
dividend_type = 'follow', count = -1)

 
open -- 开盘价(str:numpy.float64);
high -- 最高价(str:numpy.float64);
low --最低价(str:numpy.float64);
close -- 收盘价(str:numpy.float64);
volume -- 交易量(str:numpy.float64);
money -- 交易金额(str:numpy.float64);
price -- 最新价(str:numpy.float64);
preclose -- 昨收盘价(str:numpy.float64)(仅日线返回);
high_limit -- 涨停价(str:numpy.float64)(仅日线返回);
low_limit -- 跌停价(str:numpy.float64)(仅日线返回);
unlimited -- 判断查询日是否无涨跌停限制(1:该日无涨跌停限制;0:该日有涨跌停限制)(str:numpy.float64)(仅日线返回);

 
在fields里面指定只获取close价格即可。

QMT测试代码如下:(需要的也可以后台留言回复获取)

[vscode里面的代码,需要复制到qmt里面执行]

把代码复制到QMT里面,然后切换到模型交易,在中间切换到实盘模式,就会运行上面代码。

注意,这里需要第一次运行上面的代码来计算时间,因为QMT会有个cache缓存机制,它会把曾经跑过的历史数据自动下载下来,保存到你的电脑硬盘里,从而加快QMT后续的读取速度,同样的数据没有必要每次再去网络上拉。

大部分情况下网络IO都会是任何一个量化交易系通最大的性能瓶颈。

运行得到下面的结果:


20230411015.jpg


上面运行时间是22秒。不要惊讶哦,首次获取历史行情数据都是挺慢的。如果你的电脑网速够快,或者但在阿里云,腾讯云之类的云服务上跑,获取历史行情速度会有所提高。

在你运行了上面的代码之后,QMT会在某个时刻,在后台把数据下载到本地QMT安装目录下。


20230411014.jpg



文件按照股票代码作为文件名存储。当然里面不是txt格式,而是QMT做了相应的封装的。上面按照修改日期排序,4月11日多了很多新的DAT数据文件,显然是刚刚生成的。

QMT在获取历史行情数据后,会有个触发器,在后台一次性保存大量的文件,所以QMT会在某一个瞬间,界面会出现卡顿,甚至无响应,而看任务管理器会看到内存飙升甚至爆满100%,有些新人菜鸟就认为QMT太占内存,太垃圾的结论,这也是片面的。实际上在数据完备的情况下,QMT需要的内存4GB就够的了。如果你经常会有扫描全市场股票代码历史数据的话,内存还是尽量选大一点的。如果无法避免内存突然飙升,可以每次把获取行情的股票代码列表减少,细分多几批获取,用时间换空间。

当然 QMT也提供了一个下载历史数据的一个菜单入口,用于在图形界面下手动下载历史行情,从而加速历史行情读取速度。


20230411017.jpg



等数据下载完成后,

第二次跑上面的同一个代码,运行时间明显快了。


20230411018.jpg



但用时还是要7.9秒,反复测试几次,获取时间依然是在6-8秒之间波动。 因为程序读取历史行情数据的一个个独立的文件,所以这里硬盘的性能因素对获取行情影响还是很大的。

笔者感觉7.9秒这个速度还是很慢的,换了台性能好一点的的windows机子,下载了历史数据后再跑了一次:


20230411019.jpg


但用时依然在6秒左右。

所以个人是不推荐大家在tick策略里面,在盘中去获取历史数据的,这个动作应该在盘前就应该完成,把数据保存到内存列表或者dataframe变量中,盘中用的时候去取就可以了。 当然低频策略就无所谓啦。

Ptrade

操作上ptrade相对而言更加简洁,容易上手。

它的API设计和它对应的API文档更加规范,可读性更好。

直接把代码复制到量化->策略,新建策略,然后在交易里面添加策略,直接启动策略。代码设置定时运行,在启动策略后的一分钟后运行。


20230411016.jpg



同样获取沪深300的日线数据,2022年1月到2023年4月10日。
get_price - 获取历史数据 get_price(security, start_date=None, end_date=None, frequency='1d', fields=None, fq=None, count=None)
运行 

20230411013.jpg



上面的结果显示,Ptrade获取同样的历史数据耗时只有700毫秒,0.7秒左右。测试多几次,获取时间基本每次都比较平稳,在0.6-0.8秒之间。(下面打印的306不是沪深300的个数,而是获取到的日期的天数,它返回的结构虽然都是panel,但和QMT的轴有点不同)。

结论

总的来说,获取历史行情数据的速度,Ptrade是秒杀了QMT的,不在一个量级上的。

本来想继续对比实时行情,下单延时对比等等,但开盘时间有限,写了一下时间就不够用了。所以把教程拆分为多个系列,下一篇再对比QMT和PTrade的实时行情数据,下单回调等等啦。


如果想要自己测试文中的数据,可以获取代码,公众号 后台回复: 历史行情数据代码

参考API接口文档:

Ptrade: http://ptradeapi.com/

QMT: http://qmt.ptradeapi.com/
 
公众号:

Ptrade QMT实盘策略记录 - 不定期更新

量化交易李魔佛 发表了文章 • 0 个评论 • 1909 次浏览 • 2023-04-03 15:27 • 来自相关话题

简单记录当前使用Ptrade和QMT编写策略的情况。(只记录大体的意思,不透露具体策略细节,除非是那种烂大街的策略,什么macd,均线,双低,小市值等等)
写出来的是已经实现且实盘稳定运行的;
涨停板;依赖ptrade的高速行情自动配合手动;两融账户的股票日内做T,持有底仓;股票小市值轮动+多因子可转债多因子(有N个版本+不同的排除因子 组合)可转债日内高频股票趋势动量ETF轮动套利脉冲卖出扫描
 
 
纯粹自己做的记录,便于自己平时复盘。






有兴趣的朋友可以关注公众号交流。 查看全部
简单记录当前使用Ptrade和QMT编写策略的情况。(只记录大体的意思,不透露具体策略细节,除非是那种烂大街的策略,什么macd,均线,双低,小市值等等)
写出来的是已经实现且实盘稳定运行的;
  1. 涨停板;依赖ptrade的高速行情自动配合手动;
  2. 两融账户的股票日内做T,持有底仓;
  3. 股票小市值轮动+多因子
  4. 可转债多因子(有N个版本+不同的排除因子 组合)
  5. 可转债日内高频
  6. 股票趋势动量
  7. ETF轮动套利
  8. 脉冲卖出扫描

 
 
纯粹自己做的记录,便于自己平时复盘。

20230403001.jpg


有兴趣的朋友可以关注公众号交流。

ptrade担保品买卖,融资买入,融券卖出,卖券还款,买券还券 下单后回调函数里面的结构

Ptrade李魔佛 发表了文章 • 0 个评论 • 1096 次浏览 • 2023-03-31 21:44 • 来自相关话题

【ptrade的稳定性,获取行情速度,实盘交易,回测速度无意不秒杀QMT的。
而对于不能安装第三方库的原因,不少菜鸟转而选择了QMT。有点可惜了ptrade。ptrade其实也可以联通外部数据。
ptrade软件设计层面和体验是企业级的,而QMT就呵呵哒,0售后技术支持,软件bug层出不穷。里面的某个别的工程师(袁姓)素质也是底下,我星球上的代码他也抄过去,抄过去后呢 放到他自己付费星球,而且还不止一篇。】
而ptrade相对而言,恒生电子的工程师服务就很到位,发送日志给他们,会在一天内分析结果告知你哪些出现问题了。
 
题外话说多了。
 
ptrade支持两融账户的量化操作。
如:担保品买卖,融资买入,融券卖出,卖券还款,买券还券margin_trade - 担保品买卖

margincash_open - 融资买入

margincash_close - 卖券还款

margincash_direct_refund - 直接还款

marginsec_open - 融券卖出

marginsec_close - 买券还券




它们之间的参数都比较相近:

margin_xxxx(security, amount, limit_price=None)

security:股票代码(str);

amount:交易数量,输入正数(int);

limit_price:买卖限价(float);
 
而用它们进行买卖操作后,在on_trade_response回调函数里面的机构提如下:
 
担保品买入:2023-03-31 14:41:02 - INFO - 生成订单,订单号:cd25d27f39854721aac99db13c9e9b73股票代码:601328.SS 数量:信用买入1000
2023-03-31 14:41:02 - INFO - {'error_info': '', 'stock_code': '601328.SS', 'order_id': 'cd25d27f39854721aac99db13c9e9b73', 'status': '2', 'price': 5.1, 'entrust_type': '9', 'amount': 1000, 'business_amount': 0.0, 'entrust_prop': '0', 'entrust_no': '1', 'order_time': '2023-03-31 14:35:53.776'}
2023-03-31 14:41:02 - INFO - {'business_amount': 1000, 'order_id': 'cd25d27f39854721aac99db13c9e9b73', 'stock_code': '601328.SS', 'entrust_bs': '1', 'entrust_no': '1', 'status': '8', 'business_balance': 5100.0, 'business_price': 5.1, 'business_id': '2', 'business_time': '2023-03-31 14:39:17'} 
 
 
  
 融资买入:2023-03-31 14:52:00 - INFO - 生成订单,订单号:01b7851d37014709bde3ec6ebe9e89c3股票代码:601328.SS 数量:融资买入100
2023-03-31 14:52:00 - INFO - {'price': 5.1, 'entrust_prop': '0', 'status': '2', 'entrust_type': '6', 'stock_code': '601328.SS', 'business_amount': 0.0, 'entrust_no': '3', 'order_time': '2023-03-31 14:46:51.620', 'error_info': '', 'amount': 100, 'order_id': '01b7851d37014709bde3ec6ebe9e89c3'}
2023-03-31 14:52:00 - INFO - {'business_id': '4', 'business_balance': 509.99999999999994, 'business_price': 5.1, 'order_id': '01b7851d37014709bde3ec6ebe9e89c3', 'business_time': '2023-03-31 14:50:14', 'status': '8', 'entrust_bs': '1', 'business_amount': 100, 'entrust_no': '3', 'stock_code': '601328.SS'} 
 
卖券还款2023-03-31 14:58:20 - INFO - start
2023-03-31 14:59:00 - INFO - 生成订单,订单号:20cef28ec52c4d41b09c80fc49167497股票代码:600269.SS 数量:卖券还款-200
2023-03-31 14:59:00 - INFO - {'business_amount': 0.0, 'amount': -200, 'stock_code': '600269.SS', 'error_info': '', 'order_time': '2023-03-31 14:53:51.375', 'price': 3.38, 'entrust_type': '6', 'status': '2', 'order_id': '20cef28ec52c4d41b09c80fc49167497', 'entrust_prop': '0', 'entrust_no': '5'}
2023-03-31 14:59:00 - INFO - {'status': '8', 'business_time': '2023-03-31 14:57:14', 'stock_code': '600269.SS', 'entrust_bs': '2', 'business_id': '6', 'business_balance': -676.0, 'business_amount': -200, 'order_id': '20cef28ec52c4d41b09c80fc49167497', 'business_price': 3.38, 'entrust_no': '5'}
返回的结构体和那个普通账户交易的回调函数基本一致的。
 
  查看全部

【ptrade的稳定性,获取行情速度,实盘交易,回测速度无意不秒杀QMT的。
而对于不能安装第三方库的原因,不少菜鸟转而选择了QMT。有点可惜了ptrade。ptrade其实也可以联通外部数据。
ptrade软件设计层面和体验是企业级的,而QMT就呵呵哒,0售后技术支持,软件bug层出不穷。里面的某个别的工程师(袁姓)素质也是底下,我星球上的代码他也抄过去,抄过去后呢 放到他自己付费星球,而且还不止一篇。】
而ptrade相对而言,恒生电子的工程师服务就很到位,发送日志给他们,会在一天内分析结果告知你哪些出现问题了。
 
题外话说多了。
 
ptrade支持两融账户的量化操作。
如:担保品买卖,融资买入,融券卖出,卖券还款,买券还券
margin_trade - 担保品买卖

margincash_open - 融资买入

margincash_close - 卖券还款

margincash_direct_refund - 直接还款

marginsec_open - 融券卖出

marginsec_close - 买券还券




它们之间的参数都比较相近:

margin_xxxx(security, amount, limit_price=None)

security:股票代码(str);

amount:交易数量,输入正数(int);

limit_price:买卖限价(float);
 
而用它们进行买卖操作后,在on_trade_response回调函数里面的机构提如下:
 
担保品买入:
2023-03-31 14:41:02 - INFO - 生成订单,订单号:cd25d27f39854721aac99db13c9e9b73股票代码:601328.SS 数量:信用买入1000
2023-03-31 14:41:02 - INFO - {'error_info': '', 'stock_code': '601328.SS', 'order_id': 'cd25d27f39854721aac99db13c9e9b73', 'status': '2', 'price': 5.1, 'entrust_type': '9', 'amount': 1000, 'business_amount': 0.0, 'entrust_prop': '0', 'entrust_no': '1', 'order_time': '2023-03-31 14:35:53.776'}
2023-03-31 14:41:02 - INFO - {'business_amount': 1000, 'order_id': 'cd25d27f39854721aac99db13c9e9b73', 'stock_code': '601328.SS', 'entrust_bs': '1', 'entrust_no': '1', 'status': '8', 'business_balance': 5100.0, 'business_price': 5.1, 'business_id': '2', 'business_time': '2023-03-31 14:39:17'}
 
 
 
  
 融资买入:
2023-03-31 14:52:00 - INFO - 生成订单,订单号:01b7851d37014709bde3ec6ebe9e89c3股票代码:601328.SS 数量:融资买入100
2023-03-31 14:52:00 - INFO - {'price': 5.1, 'entrust_prop': '0', 'status': '2', 'entrust_type': '6', 'stock_code': '601328.SS', 'business_amount': 0.0, 'entrust_no': '3', 'order_time': '2023-03-31 14:46:51.620', 'error_info': '', 'amount': 100, 'order_id': '01b7851d37014709bde3ec6ebe9e89c3'}
2023-03-31 14:52:00 - INFO - {'business_id': '4', 'business_balance': 509.99999999999994, 'business_price': 5.1, 'order_id': '01b7851d37014709bde3ec6ebe9e89c3', 'business_time': '2023-03-31 14:50:14', 'status': '8', 'entrust_bs': '1', 'business_amount': 100, 'entrust_no': '3', 'stock_code': '601328.SS'}
 
 
卖券还款
2023-03-31 14:58:20 - INFO - start
2023-03-31 14:59:00 - INFO - 生成订单,订单号:20cef28ec52c4d41b09c80fc49167497股票代码:600269.SS 数量:卖券还款-200
2023-03-31 14:59:00 - INFO - {'business_amount': 0.0, 'amount': -200, 'stock_code': '600269.SS', 'error_info': '', 'order_time': '2023-03-31 14:53:51.375', 'price': 3.38, 'entrust_type': '6', 'status': '2', 'order_id': '20cef28ec52c4d41b09c80fc49167497', 'entrust_prop': '0', 'entrust_no': '5'}
2023-03-31 14:59:00 - INFO - {'status': '8', 'business_time': '2023-03-31 14:57:14', 'stock_code': '600269.SS', 'entrust_bs': '2', 'business_id': '6', 'business_balance': -676.0, 'business_amount': -200, 'order_id': '20cef28ec52c4d41b09c80fc49167497', 'business_price': 3.38, 'entrust_no': '5'}

返回的结构体和那个普通账户交易的回调函数基本一致的。
 
 

Ptrade融资融券双均线 代码 讲解

Ptrade李魔佛 发表了文章 • 0 个评论 • 1326 次浏览 • 2023-03-31 02:08 • 来自相关话题

因为一些融资融券的函数只能在交易模块使用,所以如果需要模拟的话,可以使用模拟端进行交易。
 
def initialize(context):
# 初始化策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = "600300.SS"
set_universe(g.security)

def before_trading_start(context, data):
# 买入标识
g.order_buy_flag = False
# 卖出标识
g.order_sell_flag = False

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
# 得到十日历史价格
df = get_history(10, "1d", "close", g.security, fq=None, include=False)
# 得到五日均线价格
ma5 = round(df["close"][-5:].mean(), 3)
# 得到十日均线价格
ma10 = round(df["close"][-10:].mean(), 3)
# 取得昨天收盘价
price = data[g.security]["close"]
# 如果五日均线大于十日均线
if ma5 > ma10:
if not g.order_buy_flag:
# 获取最大可融资数量
amount = get_margincash_open_amount(g.security).get(g.security)
# 进行融资买入操作
margincash_open(g.security, amount)
# 记录这次操作
log.info("Buying %s Amount %s" % (g.security, amount))
# 当日已融资买入
g.order_buy_flag = True

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(g.security).amount > 0:
if not g.order_sell_flag:
# 获取标的卖券还款最大可卖数量
amount = get_margincash_close_amount(g.security).get(g.security)
# 进行卖券还款操作
margincash_close(g.security, -amount)
# 记录这次操作
log.info("Selling %s Amount %s" % (g.security, amount))
# 当日已卖券还款
g.order_sell_flag = True  查看全部
因为一些融资融券的函数只能在交易模块使用,所以如果需要模拟的话,可以使用模拟端进行交易。
 
def initialize(context):
# 初始化策略
# 设置我们要操作的股票池, 这里我们只操作一支股票
g.security = "600300.SS"
set_universe(g.security)

def before_trading_start(context, data):
# 买入标识
g.order_buy_flag = False
# 卖出标识
g.order_sell_flag = False

#当五日均线高于十日均线时买入,当五日均线低于十日均线时卖出
def handle_data(context, data):
# 得到十日历史价格
df = get_history(10, "1d", "close", g.security, fq=None, include=False)
# 得到五日均线价格
ma5 = round(df["close"][-5:].mean(), 3)
# 得到十日均线价格
ma10 = round(df["close"][-10:].mean(), 3)
# 取得昨天收盘价
price = data[g.security]["close"]
# 如果五日均线大于十日均线
if ma5 > ma10:
if not g.order_buy_flag:
# 获取最大可融资数量
amount = get_margincash_open_amount(g.security).get(g.security)
# 进行融资买入操作
margincash_open(g.security, amount)
# 记录这次操作
log.info("Buying %s Amount %s" % (g.security, amount))
# 当日已融资买入
g.order_buy_flag = True

# 如果五日均线小于十日均线,并且目前有头寸
elif ma5 < ma10 and get_position(g.security).amount > 0:
if not g.order_sell_flag:
# 获取标的卖券还款最大可卖数量
amount = get_margincash_close_amount(g.security).get(g.security)
# 进行卖券还款操作
margincash_close(g.security, -amount)
# 记录这次操作
log.info("Selling %s Amount %s" % (g.security, amount))
# 当日已卖券还款
g.order_sell_flag = True
 

Ptrade担保品买入卖出

Ptrade李魔佛 发表了文章 • 0 个评论 • 1089 次浏览 • 2023-03-31 01:31 • 来自相关话题

担保品卖出指的是融资融券交易当中,用自有资金进行买卖的行为

 
实际上是买卖股票,但在信用账户上,用只有资金买卖股票。
 
ptrade支持两融操作。
 
比如下面的示例代告诉我们,担保品买入股票的3个不同参数的效果:def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
# 以系统最新价委托
margin_trade(g.security, 100)
# 以72块价格下一个限价单
margin_trade(g.security, 100, limit_price=72)
# 以最优五档即时成交剩余撤销委托
margin_trade(g.security, 200, market_type=4) security:股票代码(str);

amount:交易数量,正数表示买入,负数表示卖出(int);

limit_price:买卖限价(float);

market_type:市价委托类型,上证非科创板股票支持参数1、4,上证科创板股票支持参数0、1、2、4,深证股票支持参数0、2、3、4、5(int);

0:对手方最优价格;
1:最优五档即时成交剩余转限价;
2:本方最优价格;
3:即时成交剩余撤销;
4:最优五档即时成交剩余撤销;
5:全额成交或撤单; 查看全部


担保品卖出指的是融资融券交易当中,用自有资金进行买卖的行为


 
实际上是买卖股票,但在信用账户上,用只有资金买卖股票。
 
ptrade支持两融操作。
 
比如下面的示例代告诉我们,担保品买入股票的3个不同参数的效果:
def initialize(context):
g.security = '600570.SS'
set_universe(g.security)

def handle_data(context, data):
# 以系统最新价委托
margin_trade(g.security, 100)
# 以72块价格下一个限价单
margin_trade(g.security, 100, limit_price=72)
# 以最优五档即时成交剩余撤销委托
margin_trade(g.security, 200, market_type=4)
 
security:股票代码(str);

amount:交易数量,正数表示买入,负数表示卖出(int);

limit_price:买卖限价(float);

market_type:市价委托类型,上证非科创板股票支持参数1、4,上证科创板股票支持参数0、1、2、4,深证股票支持参数0、2、3、4、5(int);

0:对手方最优价格;
1:最优五档即时成交剩余转限价;
2:本方最优价格;
3:即时成交剩余撤销;
4:最优五档即时成交剩余撤销;
5:全额成交或撤单;