900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > Python 量化投资实战教程(4) —KDJ 策略

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

时间:2021-03-19 08:53:43

相关推荐

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

量化投资系列文章:

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

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

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

Github仓库:/Ckend/pythondict-quant

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

具体计算方法如下:

RSV = (收盘价-N周期最低价)/(N周期最高价-N周期最低价)*100K值 = 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周期最低价)*100K值 = 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*Dself.J = 3 * self.K - 2 * self.D

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

# Python 实用宝典def next(self):self.log("Close, %.2f" % self.dataclose[0])if self.order:returnif 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这只股票,回测其1月1日至4月21日期间的走势:

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

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

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

# Python 实用宝典def next(self):self.log("Close, %.2f" % self.dataclose[0])if self.order:returncondition1 = 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 - me2self.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策略不赚的好。但是这个策略依然存在问题,它在很多能赚大钱的时候,过于保险地将股票卖出了,以至于其亏损的次数其实大于盈利的次数。

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

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

Python实用宝典

不只是一个宝典

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。