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

本文介绍了如何在VNPY交易平台中使用Python和Ta-lib库实现KDJ指标,并基于此制定交易策略。策略包括在K值上穿D值时买入,在K值下穿D值时卖出,同时考虑J值的极端情况作为辅助判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


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

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

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


点击(此处)折叠或打开

  1. def kdj(self, fastk_period, slowk_period, slowk_matype ,slowd_period ,slowd_matype, array=False):
  2.         """KDJ指标"""

  3.         slowk, slowd = talib.STOCH(self.high,self.low,self.close,fastk_period, slowk_period,
  4.                                          slowk_matype, slowd_period ,slowd_matype)

  5.         # 求出J值,J = (3 * D) - (2 * K)
  6.         slowj = list(map(lambda x,y: 3 * x - 2 * y, slowk, slowd))
  7.         if array:
  8.             return slowk, slowd, slowj
  9.         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
bb

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快速增大则平仓。
代码如下:


点击(此处)折叠或打开

  1. # encoding: UTF-8

  2. """
  3. 这里的Demo是一个kdj策略实现
  4. """

  5. from __future__ import division

  6. from vnpy.trader.vtConstant import EMPTY_STRING, EMPTY_FLOAT
  7. from vnpy.trader.app.ctaStrategy.ctaTemplate import (CtaTemplate,
  8.                                                      BarGenerator,
  9.                                                      ArrayManager)
  10. from talib import MA_Type


  11. ########################################################################
  12. class KDJStrategy(CtaTemplate):
  13.     """KDJ策略Demo"""
  14.     className = 'KDJStrategy'
  15.     author = u'BillyZhang'

  16.     # 策略参数
  17.     fastk_period = 9
  18.     slowk_period = 3
  19.     slowk_matype = MA_Type.EMA
  20.     slowd_period = 3
  21.     slowd_matype = MA_Type.EMA
  22.     kdlimit = 20
  23.     jlimit = 10
  24.     initDays = 10
  25.     fixedSize = 1
  26.     barmins = 15

  27.     # 策略变量
  28.     k = 0
  29.     d = 0
  30.     j = 0

  31.     # 参数列表,保存了参数的名称
  32.     paramList = ['name',
  33.                  'className',
  34.                  'author',
  35.                  'vtSymbol',
  36.                  'fastk_period',
  37.                  'slowk_period',
  38.                  'slowk_matype',
  39.                  'slowd_period',
  40.                  'slowd_matype',
  41.                  'fixedSize'
  42.                  'barmins'
  43.                  ]

  44.     # 变量列表,保存了变量的名称
  45.     varList = ['inited'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值