Python 量化投资实战教程(4) —KDJ 策略

2023-11-01

量化投资系列文章:

Backtrader 教程 — Python 量化投资实战教程(1)

Python 量化投资实战教程(2) —MACD策略(+26.9%)

Python 量化投资实战教程(3) —A股回测MACD策略

Github仓库:https://github.com/Ckend/pythondict-quant


今天我们来使用backtrader试试另一个量化投资策略:KDJ策略,KDJ是最常用的指标之一,其中文名叫“随机指标”。它通过统计学原理,识别N个交易日内最高价、最低价、最新收盘价三者之间的比例关系来计算随机值(RSV),然后再根据加权移动平均线(EMA)的方法来计算K值、D值、J值。

具体计算方法如下:

  • RSV = (收盘价-N周期最低价)/(N周期最高价-N周期最低价)*100
  • K值 = RSV的N周期加权移动平均值
  • D值 = K值的N周期加权移动平均值
  • J值 = 3_K-2_D

一般来说,RSV的N周期选择9,K和D的N周期选择3。

基本概念大家都懂了,那如何根据KDJ值决定买入和卖出呢?

当J值上穿K值的时候,是买入信号,此时买入。

当J值下穿K值的时候,是卖出信号,此时卖出。

这个策略有用吗?让我们来试试看。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端运行命令安装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南。

在终端输入以下命令安装我们所需要的依赖模块:

pip install backtrader

看到 Successfully installed xxx 则说明安装成功。

Backtrader基本使用请看我们前一篇文章:
backtrader教程—量化投资实战教程(1)

本文全部代码,请在Python实用宝典后台回复:量化投资4 进行下载。

2.单一KDJ策略

如果你以前没用过backtrader,请先看:

backtrader教程—量化投资实战教程(1)

进行学习,不然你会有点蒙。直接下载代码学习也是一种方式,但前提是你的自学本领够强。

首先我们需要先计算K、D、J三个值,前面我们也说过了他们的计算方式:

  • RSV = (收盘价-N周期最低价)/(N周期最高价-N周期最低价)*100
  • K值 = RSV的N周期加权移动平均值
  • D值 = K值的N周期加权移动平均值
  • J值 = 3_K-2_D

知道了计算方式,那之后的工作就简单了:

        # 9个交易日内最高价
        self.high_nine = bt.indicators.Highest(self.data.high, period=9)
        # 9个交易日内最低价
        self.low_nine = bt.indicators.Lowest(self.data.low, period=9)
        # 计算rsv值
        self.rsv = 100 * bt.DivByZero(
            self.data_close - self.low_nine, self.high_nine - self.low_nine, zero=None
        )
        # 计算rsv的3周期加权平均值,即K值
        self.K = bt.indicators.EMA(self.rsv, period=3)
        # D值=K值的3周期加权平均值
        self.D = bt.indicators.EMA(self.K, period=3)
        # J=3*K-2*D
        self.J = 3 * self.K - 2 * self.D

最后决定买入点和卖出点:

    # Python 实用宝典
    def next(self):
        self.log("Close, %.2f" % self.dataclose[0])
        if self.order:
            return

        if not self.position:
            # J - D 值
            condition1 = self.J[-1] - self.D[-1]
            condition2 = self.J[0] - self.D[0]
            if condition1 < 0 and condition2 > 0:
                self.log("BUY CREATE, %.2f" % self.dataclose[0])
                self.order = self.buy()

        else:
            condition = (self.dataclose[0] - self.bar_executed_close) / self.dataclose[0]
            if condition > 0.1 or condition < -0.1:
                self.log("SELL CREATE, %.2f" % self.dataclose[0])
                self.order = self.sell()

不过从卖出策略中可以看到,我暂时没有使用J下穿K值的方式来卖出股票,而是采用涨跌10%的限制性条件作为卖出信号,看看这样的策略表现如何。

这里和上篇文章一样,咱用10000元作为本金,对002859这只股票,回测其2010年1月1日至2020年4月21日期间的走势:

效果不是很好,本金10000元,最后剩余9892元,也就是还亏损了。从盈利和亏损点上来看,该策略确实亏损次数更多,比盈利次数多了一次。

不过这是我们基于限制性卖出的条件,如果是J值下穿K值作为卖出信号呢?

基于backtrader,我们做这样的买入卖出信号调整真的非常简单:

    # Python 实用宝典
    def next(self):
        self.log("Close, %.2f" % self.dataclose[0])
        if self.order:
            return

        condition1 = self.J[-1] - self.D[-1]
        condition2 = self.J[0] - self.D[0]
        if not self.position:
            # J - D 值
            if condition1 < 0 and condition2 > 0:
                self.log("BUY CREATE, %.2f" % self.dataclose[0])
                self.order = self.buy()

        else:
            if condition1 > 0 or condition2 < 0:
                self.log("SELL CREATE, %.2f" % self.dataclose[0])
                self.order = self.sell()

效果如何?

我勒个去,您这个不太靠谱啊,10000元本金只剩9029元了。

但是这样并没有足够证据否认这个策略的价值,接下来我们尝试将它和MACD策略结合在一起使用。

3.多策略回测

通过回测得到的图表,我发现,KDJ指标在决定买入信号的时候有很大的延迟,比MACD的买入信号延迟重得多,但是它的卖出信号却不错,很敏感。

所以我们可以考虑将MACD策略也引入进来,使用MACD决策买入,KDJ信号决策卖出。引入MACD策略相关变量:

        # MACD策略参数
        me1 = EMA(self.data, period=12)
        me2 = EMA(self.data, period=26)
        self.macd = me1 - me2
        self.signal = EMA(self.macd, period=9)
        bt.indicators.MACDHisto(self.data)

至于为什么MACD策略是这么计算的,请看我们上一篇文章:Python 量化投资实战教程(2) —MACD策略(+26.9%)。所以我们的文章是环环相扣的哦,如果没有阅读,请记得回头补上。

从上面两张图中,大家可以看到两条变化非常大的线,这是两条3日EMA的线。我们可以将其取消掉,因为它们没有太多价值。加一个plot=False参数即可让它们不显示:

        # 计算rsv的3周期加权平均值,即K值
        self.K = bt.indicators.EMA(self.rsv, period=3, plot=False)
        # D值=K值的3周期加权平均值
        self.D = bt.indicators.EMA(self.K, period=3, plot=False)

基于MACD策略的买入信号进行买入,KDJ策略的卖出信号进行卖出:

        if not self.position:
            # 买入基于MACD策略
            condition1 = self.macd[-1] - self.signal[-1]
            condition2 = self.macd[0] - self.signal[0]
            if condition1 < 0 and condition2 > 0:
                self.log('BUY CREATE, %.2f' % self.dataclose[0])
                self.order = self.buy()

        else:
            # 卖出基于KDJ策略
            condition1 = self.J[-1] - self.D[-1]
            condition2 = self.J[0] - self.D[0]
            if condition1 > 0 or condition2 < 0:
                self.log("SELL CREATE, %.2f" % self.dataclose[0])
                self.order = self.sell()

回测效果如下:

最终得到10057.06,赚了57块钱。。当然,总比单纯KDJ策略不赚的好。但是这个策略依然存在问题,它在很多能赚大钱的时候,过于保险地将股票卖出了,以至于其亏损的次数其实大于盈利的次数。

当然,单纯从一只股票上我们是无法看出这个策略的整体好坏的,下一篇量化投资文章(大约在2020/05/09),我们将在A股中随机取1000只股票,来验证这个复合策略的整体收益。敬请期待Python实用宝典的最新更新哦。

我们的文章到此就结束啦,如果你喜欢我们今天的Python 实战教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦,有任何问题都可以在下方留言区留言,我们都会耐心解答的!


Python实用宝典

不只是一个宝典

欢迎关注公众号:Python实用宝典

原文来自Python实用宝典:Python 量化投资实战教程(4) —KDJ 策略

Python实用宝典

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 量化投资实战教程(4) —KDJ 策略 的相关文章

随机推荐

  • 2020-09-06

    第二章 Nginx虚拟主机和负载均衡 1 虚拟主机 虚拟主机 英语 virtual hosting 或称 共享主机 shared web hosting 又称虚拟服务器 是一种在单一主机或主机群上 实现多网域服务的方法 可以运行多个网站或服
  • 水电图wp表示什么_装修水电工入门基础知识,刚入行不懂不用急?老师傅告诉你怎么做...

    装修水电工泛指室內装饰装潢水电安装工人 作为装修水电工 不但要懂得水电安装的基本技术规范 施工顺序 验收常识 在施工中 还得与硬装部分的木工 瓦工 腻子工等工种相互配合安装 及软装部分的壁纸工 布艺工等相互协作 装修水电工是技术性要求很强的
  • 11.测试代码

    测试函数 单元测试用于核实函数的某个方面没有问题 测试用例是一组单元测试 一起核实函数各种情形下的行为都符合要求 全覆盖式测试用例包含一整套单元测试 涵盖了各种可能的函数使用方式 为函数编写测试用例 可先导入模块unittest以及要测试的
  • 以下哪个不是python合法的标识符_哪个不是python合法标识符

    标识符是电脑语言中允许作为名字的有效字符串集合 Pyhon标识符规则 1 第一个字符必须是字母或是下划线 即不能以数字开 2 剩下的字符可以是字母 数字和下划线 即不能包含除了下划线以外的符号 空格 运算符 3 大小写敏感 4 Python
  • STM32单片机基础20——使用DAC输出任意指定电压

    本篇详细的记录了如何使用STM32CubeMX配置STM32L431RCT6的DAC外设 输出任意指定电压值 1 准备工作 硬件准备 开发板 首先需要准备一个开发板 这里我准备的是STM32L4的开发板 BearPi 万用表 软件准备 需要
  • kconfig常用语法,入门必看

    kconfig 1 kconfig简单介绍 Kconfig用来配置内核 它就是各种配置界面的源文件 内核的配置工具读取各个Kconfig文件 生成配置界面供开发人员配置内核 最后生成配置文件 config 2 kconfig和makefil
  • 自己用js做一个搜索栏,超级简单

    csdn很少上线 经常在掘金摸鱼 本文掘金链接https juejin cn post 7058602557987356708 言归正传 为什么要做这个小案例呢 首先我有极度严重的强迫症 对于设备交互界面的追求是越整洁越好 另外由于我的专业
  • 数分工作了三年,我干了件很酷的事情

    目录 1 开始组建微信群 2 寻找到知识星球 3 使用微信圈子 4 使用语雀 5 开始使用飞书 从17年毕业来 一直都在干数据分析的工作 和很多转行的小伙伴一样 没有对口的科班学习 摸不清数据分析具体情况 起初充满着很多迷茫 在刚开始的1年
  • System.Text.Encoding.Default.GetString()后面无法再添加字符

    项目场景 使用 System Text Encoding Default GetString 参数1 时 传入的参数1未填满空间大小 后面仍需添加字符串或字符 问题描述 当参数1未填满空间 System Text Encoding Defa
  • Android学习路线

    Android学习路线 第一阶段 Java面向对象编程 1 Java基本数据类型与表达式 分支循环 2 String和StringBuffer的使用 正则表达式 3 面向对象的抽象 封装 继承 多态 类与对象 对象初始化和回收 构造函数 t
  • 17.网络爬虫—Scrapy入门与实战

    网络爬虫 Scrapy入门与实战 Scrapy基础 Scrapy运行流程原理 Scrapy的工作流程 Scrapy的优点 Scrapy基本使用 豆瓣网为例 创建项目 创建爬虫 配置爬虫 运行爬虫 如何用python执行cmd命令 数据解析
  • 基于R语言的贝叶斯网络模型、现代贝叶斯统计学方法

    基于R语言的贝叶斯网络模型实践技术应用 贝叶斯网络不但能够统合已有的各种统计学方法 如混合回归模型 LASSO 自回归模型 隐马模型等等 而且在很大程度上能够弥补统计学模型不能够进行因果推断的缺憾 以开源的R语言为平台 通过理论和实践相结合
  • pikachu之不安全的文件下载概述

    不安全的文件下载概述 文件下载功能在很多web系统上都会出现 一般我们当点击下载链接 便会向后台发送一个下载请求 一般这个请求会包含一个需要下载的文件名称 后台在收到请求后 会开始执行下载代码 将该文件名对应的文件response给浏览器
  • 二元对数正态分布 (bivariate lognormal distribution) 的几个性质

    二元对数正态分布 bivariate lognormal distribution 的几个性质 摘要 对数正态分布 二元正态分布 bivariate normal distribution 对数正态分布的期望与方差 二元对数正态分布的协方差
  • eclipse写MAPREDUCE程序对HBase表进行操作之 IndexBuilder(对已有表建索引)

    eclipse写MAPREDUCE程序对HBase表进行操作之 IndexBuilder 对已有表建索引 开源 hbase的example mapreduce里有个类IndexBuilder是用来对已有表建索引的 其代码有一点点需要修改 j
  • ASP.NET Process Model之一:IIS 和 ASP.NET ISAPI

    ASP NET Process Model之一 IIS 和 ASP NET ISAPI 前几天有一个朋友在MSN上问我 ASP NET 从最初的接收到Http request到最终生成Response的整个流程到底是怎样的 我觉得这个问题涉
  • java中的CondVal_转载:do...while(0)的妙用

    MTK中有很多有关do while 0 的应用 刚开始可能有很多人不太明白为什么使用do while 0 似乎不加do while 0 该部分的代码也会只执行一次 其实do while 0 是出于优化代码考虑的 do while 0 并不是
  • C# 将ComboBox设置为禁止编辑的方法

    2018年5月8日14 53 21 将ComboBox的DropDownStyle 属性设置为 DropDownList即可 Simple 简单的下拉列表框 始终显示列表 DropDown 可以编辑 与有下拉列表 默认 DropDownLi
  • 对于随机森林的通俗理解

    原文 http blog csdn net mao xiao feng article details 52728164 对于随机森林的通俗理解 一 决策树 决策树是机器学习最基本的模型 在不考虑其他复杂情况下 我们可以用一句话来描述决策树
  • Python 量化投资实战教程(4) —KDJ 策略

    量化投资系列文章 Backtrader 教程 Python 量化投资实战教程 1 Python 量化投资实战教程 2 MACD策略 26 9 Python 量化投资实战教程 3 A股回测MACD策略 Github仓库 https githu