iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >VNPY中基于Ta-lib的KDJ策略怎样实现
  • 470
分享到

VNPY中基于Ta-lib的KDJ策略怎样实现

2023-06-05 10:06:46 470人浏览 安东尼
摘要

本篇文章给大家分享的是有关VNPY中基于Ta-lib的KDJ策略怎样实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。VNPY自带演示策略中,没有kdj策略,作为一个国内常用策

本篇文章给大家分享的是有关VNPY中基于Ta-lib的KDJ策略怎样实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

VNPY自带演示策略中,没有kdj策略,作为一个国内常用策略,这里讲讲怎么实现。

首先,Ta-lib这个python库里面并没有提供kdj策略,估计主要因为这个策略主要在流行,不过ta-lib提供了类似的方法STOCH()。可以实现KD效果。

那么首先为class ArrayManager新增一个方法kdj,来输出KDJ值。我是直接修改ctaTemplate.py 文件,更合适方法是继承class ArrayManager。


  • def kdj(self, fastk_period, slowk_period, slowk_matype ,slowd_period ,slowd_matype, array=False):

  •         """KDJ指标"""

  •         slowk, slowd = talib.STOCH(self.high,self.low,self.close,fastk_period, slowk_period,

  •                                          slowk_matype, slowd_period ,slowd_matype)

  •         # 求出J值,J = (3 * D) - (2 * K)

  •         slowj = list(map(lambda x,y: 3 * x - 2 * y, slowk, slowd))

  •         if array:

  •             return slowk, slowd, slowj

  •         return slowk[-1], slowd[-1], slowj[-1]

上面是新增的kdj功能,首先是利用SHOCH计算出kd,在利用kd算出j,输出kdj三个指标。
SHOCH计算需要每条k线中的最高值,最低值,和结束值参数,作为list数列提供;这个直接使用ArraManger提供值;然后是fastK_period, slowk_period和slowd_period, 这个就是kdj设定中常见的N,M1,M2三个窗口参数, 通常设置是(9,3,3)。
然后是slowk_matype, slowd_matype就是平均算法类型,这里可以用SMA滑动平均或EMA指数平滑移动平均等。为了和文华一致,用了SMA。

#MA_Type: 0=SMA, 1=EMA, 2=WMA, 3=DEMA, 4=TEMA, 5=TRIMA, 6=KAMA, 7=MAMA, 8=T3 (Default=SMA)

这个后来发现不是一回事,Ta-lib中的SMA中S是simple简单的意思,SMA是简单移动平均。和文华SMA不一样,文华SMA是指数加权移动平均线,这样的化用EWMA更合适。但是Ta-lib本身并不提供提供EWMA;按照下图发现默认权重为1; EMA或者较为合适,不过此时权重为2。
后来看着此文又不是一回事,以后有空填这个坑。
https://www.joinquant.com/post/7920
VNPY中基于Ta-lib的KDJ策略怎样实现
VNPY中基于Ta-lib的KDJ策略怎样实现
j值不提供直接只算,直接用kd值,用3*k-2*d算出j值。对了这些返回都是一堆kdj组list,就是可以画成一个线。如果是array是false就返回一个点的kdj值。


好了上面就是对 ArrayManager增加一个kdj方法,在下来就是继承CtaTemplate, 生成策略,这里基本就是
买入思想就是k或d小于某个阈值时候为超卖,当k大于d,就是描述里面K线上穿d线时候,开多单。反之k或d值大于阈值多超买,那么此时k小于d,开空单。。
如果持有多头,那么因为j更加敏感,用j值来做平仓指标. 如果持有多单,,如果j小于d,即j线下穿d线时候卖出多单,或者j值快速下降,下降幅度大于定好的jlimit。。
如果持有空头,同理,如果j大于d,或者j快速增大则平仓。
代码如下:


  • # encoding: UTF-8

  • """

  • 这里的Demo是一个kdj策略实现

  • """

  • from __future__ import division

  • from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT

  • from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate,

  •                                                      BarGenerator,

  •                                                      ArrayManager)

  • from talib import MA_Type

  • ########################################################################

  • class KDjstrategy(CtaTemplate):

  •     """KDJ策略Demo"""

  •     className = 'KDJStrategy'

  •     author = u'BillyZhang'

  •     # 策略参数

  •     fastk_period = 9

  •     slowk_period = 3

  •     slowk_matype = MA_Type.EMA

  •     slowd_period = 3

  •     slowd_matype = MA_Type.EMA

  •     kdlimit = 20

  •     jlimit = 10

  •     initDays = 10

  •     fixedSize = 1

  •     barmins = 15

  •     # 策略变量

  •     k = 0

  •     d = 0

  •     j = 0

  •     # 参数列表,保存了参数的名称

  •     paramList = ['name',

  •                  'className',

  •                  'author',

  •                  'vtSymbol',

  •                  'fastk_period',

  •                  'slowk_period',

  •                  'slowk_matype',

  •                  'slowd_period',

  •                  'slowd_matype',

  •                  'fixedSize'

  •                  'barmins'

  •                  ]

  •     # 变量列表,保存了变量的名称

  •     varList = ['inited',

  •                'pos',

  •                'k',

  •                'd',

  •                'j']

  •     # 同步列表,保存了需要保存到数据库的变量名称

  •     syncList = ['pos']

  •     # ----------------------------------------------------------------------

  •     def __init__(self, ctaEngine, setting):

  •         """Constructor"""

  •         super(KDJStrategy, self).__init__(ctaEngine, setting)

  •         self.bg = BarGenerator(self.onBar, self.barmins, self.onXminBar)

  •         self.am = ArrayManager()

  •         # 注意策略类中的可变对象属性(通常是list和dict等),在策略初始化时需要重新创建,

  •         # 否则会出现多个策略实例之间数据共享的情况,有可能导致潜在的策略逻辑错误风险,

  •         # 策略类中的这些可变对象属性可以选择不写,全都放在__init__下面,写主要是为了阅读

  •         # 策略时方便(更多是个编程习惯的选择)

  •     # ----------------------------------------------------------------------

  •     def onInit(self):

  •         """初始化策略(必须由用户继承实现)"""

  •         self.writeCtaLog(u'KDJ策略初始化')

  •         initData = self.loadBar(self.initDays)

  •         for bar in initData:

  •             self.onBar(bar)

  •         self.putEvent()

  •     # ----------------------------------------------------------------------

  •     def onStart(self):

  •         """启动策略(必须由用户继承实现)"""

  •         self.writeCtaLog(u'KDJ策略启动')

  •         self.putEvent()

  •     # ----------------------------------------------------------------------

  •     def onStop(self):

  •         """停止策略(必须由用户继承实现)"""

  •         self.writeCtaLog(u'KDJ策略停止')

  •         self.putEvent()

  •     # ----------------------------------------------------------------------

  •     def onTick(self, tick):

  •         """收到行情TICK推送(必须由用户继承实现)"""

  •         self.bg.updateTick(tick)

  •     # ----------------------------------------------------------------------

  •     def onBar(self, bar):

  •         """收到Bar推送(必须由用户继承实现)"""

  •         self.bg.updateBar(bar)

  •     # ----------------------------------------------------------------------

  •     def onXminBar(self, bar):

  •         """收到Bar推送(必须由用户继承实现)"""

  •         am = self.am

  •         am.updateBar(bar)

  •         if not am.inited:

  •             return

  •         # 计算kdj数值

  •         slowk, slowd, slowj = am.kdj(self.fastk_period, self.slowk_period, self.slowk_matype,

  •                                      self.slowd_period, self.slowd_matype, array=True)

  •         self.k = slowk[-1]

  •         self.d = slowd[-1]

  •         self.j = slowj[-1]

  •         self.jdif = slowj[-1] - slowj[-2]

  •         tradeindictor = 0

  •         if self.k > (100 - self.kdlimit) or self.d > (100 - self.kdlimit):

  •             tradeindictor = -1

  •         if self.k < self.kdlimit or self.d < self.kdlimit:

  •             tradeindictor = 1

  •         # 当前无仓位,发送开仓委托

  •         if self.pos == 0:

  •             self.intraTradeHigh = bar.high

  •             self.intraTradeLow = bar.low

  •             # 如果k值大于d值均线,开多单;反之,如果如果k值小于d值时候开空单

  •             if self.k > self.d and tradeindictor == 1:

  •                 self.buy(bar.close, self.fixedSize, False)

  •             elif self.k < self.d and tradeindictor == -1:

  •                 self.short(bar.close, self.fixedSize, False)

  •         # 持有多头仓位; 如果j小于d,或者j最近两个k线,j值下跌超过jlimi平仓, :

  •         elif self.pos > 0:

  •             if self.j < self.d or self.jdif < -1 *self.jlimit:

  •                 self.sell(bar.close * 1.03, abs(self.pos))

  •         # 持有空头仓位;如果j大于d,或j快速上扬 平仓;

  •         elif self.pos < 0:

  •             if self.j > self.d or self.jdif > self.jlimit:

  •                 self.cover(bar.close * 0.97, abs(self.pos))

  •         # 同步数据到数据库

  •         self.saveSyncData()

  •         # 发出状态更新事件

  •         self.putEvent()

  •     # ----------------------------------------------------------------------

  •     def onOrder(self, order):

  •         """收到委托变化推送(必须由用户继承实现)"""

  •         # 对于无需做细粒度委托控制的策略,可以忽略onOrder

  •         pass

  •     # ----------------------------------------------------------------------

  •     def onTrade(self, trade):

  •         """收到成交推送(必须由用户继承实现)"""

  •         # 对于无需做细粒度委托控制的策略,可以忽略onOrder

  •         pass

  •     # ----------------------------------------------------------------------

  •     def onStopOrder(self, so):

  •         """停止单推送"""

  •         pass

以上就是VNPY中基于Ta-lib的KDJ策略怎样实现,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: VNPY中基于Ta-lib的KDJ策略怎样实现

本文链接: https://www.lsjlt.com/news/242423.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • VNPY中基于Ta-lib的KDJ策略怎样实现
    本篇文章给大家分享的是有关VNPY中基于Ta-lib的KDJ策略怎样实现,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。VNPY自带演示策略中,没有kdj策略,作为一个国内常用策...
    99+
    2023-06-05
  • VNPY基于SAR和肯特纳的交易策略是怎样的
    VNPY基于SAR和肯特纳的交易策略是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。一个比较简单策略,主要是为了验证SAR出场指标的;然后和可以结合其他下单值,做的一...
    99+
    2023-06-02
  • 基于统计的交易策略简易实现VNPY的示例分析
    这篇文章将为大家详细讲解有关基于统计的交易策略简易实现VNPY的示例分析,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。交易思维是基于历史数据中,一组数据比如100天中,K线中最高点或者最低点...
    99+
    2023-06-02
  • VNPY单品种期货的网格交易策略的实现是怎样的
    这篇文章给大家介绍VNPY单品种期货的网格交易策略的实现是怎样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这里做了单品种期货网格交易策略实现。当bar.close在通道中时候,下个bar打到上轨开多单,打到下轨空单...
    99+
    2023-06-02
  • 详解基于redis实现的四种常见的限流策略
    目录一、引言二、固定时间窗口算法三、滑动时间窗口算法四、漏桶算法五、令牌桶算法一、引言 在web开发中功能是基石,除了功能以外运维和防护就是重头菜了。因为在网站运行期间可能...
    99+
    2024-04-02
  • C++中的策略模式怎么实现
    本文小编为大家详细介绍“C++中的策略模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++中的策略模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。策略模式主要解决在有多种算法相似的情况下,...
    99+
    2023-07-05
  • MySQL到HBase的迁移策略的研究与实现是怎样的
    今天就跟大家聊聊有关MySQL到HBase的迁移策略的研究与实现是怎样的,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。随着Web2.0的到来,互联网...
    99+
    2024-04-02
  • 基于Python怎样实现简单的定时器
    基于Python怎样实现简单的定时器,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。所谓定时器,是指间隔特定时间执行特定任务的机制。几乎所有的编程语言,都有定时器...
    99+
    2023-06-22
  • javascript设计模式中的策略模式怎么实现
    这篇文章主要讲解了“javascript设计模式中的策略模式怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“javascript设计模式中的策略模式怎么实现”吧!一. 认识策略模式策略...
    99+
    2023-06-26
  • MySQL中的循环数据迁移策略怎么实现
    在MySQL中,可以通过使用存储过程和游标来实现循环数据迁移的操作。下面是一个简单的示例: 首先,创建一个存储过程来循环遍历源表中的...
    99+
    2024-04-30
    MySQL
  • JavaSE 6基于JSR105的XML签名是怎样实现的
    这篇文章将为大家详细讲解有关JavaSE 6基于JSR105的XML签名是怎样实现的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们开始分析一个实际的XML签名示例应用程序。  一、 密码...
    99+
    2023-06-03
  • Python基于决策树算法的分类预测怎么实现
    今天小编给大家分享一下Python基于决策树算法的分类预测怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、决策树的...
    99+
    2023-06-26
  • Tungsten Fabric实战中基于K8s的部署是怎样的
    这期内容当中小编将会给大家带来有关Tungsten Fabric实战中基于K8s的部署是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Tungsten Fabric(原名opencontrail),...
    99+
    2023-06-03
  • 基于React封装组件的实现步骤是怎样的
    这篇文章将为大家详细讲解有关基于React封装组件的实现步骤是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言很多小伙伴在第一次尝试封装组件时会和我一样碰到许多问题,比如人家的组件会...
    99+
    2023-06-21
  • 基于MysqlConnector/C++的数据库连接池的实现是怎样的
    基于MysqlConnector/C++的数据库连接池的实现是怎样的,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。1.连接池的介绍:1.1...
    99+
    2024-04-02
  • 基于Java怎样实现一个简单的单词本Android App
    这篇文章跟大家分析一下“基于Java怎样实现一个简单的单词本Android App”。内容详细易懂,对“基于Java怎样实现一个简单的单词本Android App”感兴趣的朋友可以跟着小编的思路慢慢深入来阅读一下,希望阅...
    99+
    2023-06-29
  • 基于Python怎样实现一个简易的数据管理系统
    这期内容当中小编将会给大家带来有关基于Python怎样实现一个简易的数据管理系统,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。为了方便的实现记录数据、修改数据没有精力去做一个完整的系统去管理数据。因此,在...
    99+
    2023-06-22
  • 基于覆盖率的golang函数测试自动化怎样实现?
    基于覆盖率的 golang 函数测试自动化可确保函数在测试中完全执行。实现步骤包括:安装依赖项。创建测试文件。编写测试用例,使用 mock 依赖项。启用覆盖率收集。生成覆盖率报告。 基...
    99+
    2024-04-26
    测试自动化 golang git
  • 基于SSM试卷自动生成系统设计与实现是怎样的
    这篇文章将为大家详细讲解有关基于SSM试卷自动生成系统设计与实现是怎样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。功能点: 1.后台管理员能够对用户管理,用户批量导入,用户组管理,角色管...
    99+
    2023-06-02
  • 车载导航应用中基于Sketch UI主题定制方案的实现是怎么样的
    这篇文章将为大家详细讲解有关车载导航应用中基于Sketch UI主题定制方案的实现是怎么样的,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。1.导读关于应用的主题定制,相信大家或多或少都有接触...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作