前言:KDJ又称随机指标,属于短期波动性技术指标。D低于20时,属于超卖,D大于80时,属于超买。当K指标在超买区间上穿D指标时,意味着短期出现上涨的概率高,买入标的;当K指标在超卖区间下穿D指标时,意味着出现下跌的概率高,卖出标的。
KDJ指标怎么计算?
KDJ指标的计算比较复杂,首先需要计算周期的RSV值,然后计算K、D、J值等。以周期为n的KDJ指标计算为例:
其中,Closen表示第n日收盘价,min(Lown)表示n日内的最低价,max(Highn)表示n日内的最高价。
然后,计算K和D值,
当日K值=2/3*前一日K值+1/3*当日RSV
当日D值=2/3*前一日D值+1/3*当日K值
J值=3*当日K值-2*当日K值
我去~~~,是不是看着很复杂,告诉你一个计算KDJ方便的python库–talib。
k,d=talib.STOCH(high,low,close,fastk_period=9,slowk_period=3,slowd_period=3)
下图时数字资产BINANCE.BTCUSDT KD图,没有画出J指标(因为一般之判断K和D即可),可以看出指标在0-100之间不断波动,不断的出现金叉和死叉。不要问在哪里找数字资产的行情数据,去币宽哦(币宽-数字货币量化)。
KDJ真的有效吗?
下面进行第一个KDJ策略(超买区K、D金叉买入,超买区K、D死叉时卖出)。回测交易币对BTC/USDT,回测平台是币宽,不了解怎么使用币宽的朋友可以访问“”进行学习。以下默认您已经初步学会如何使用币宽(www.nextfintech.io)平台了。
策略相关说明:
回测时间:2018-01-01至2018-07-01
K线频率:60s
初始资金:10000 USDT
交易手续费率:0.2%
KDJ参数:9,3,3
回测交易所和币对:BINANCE的BTC/USDT
策略代码如下:
# -*- coding: utf-8 -*-
from __future__ import print_function, absolute_import
from nf.api import *
import talib as ta
import pandas as pd
def init():
global exchange #交易所
global front #交易币对前项币
global base #交易币对后项币
global symbol #交易标的
global freq #频率
global count
global fastk
global slowk
global slowd
global trade
exchange='BINANCE'
front='btc'
base='usdt'
symbol=get_symbol(market=exchange,front=front,rear=base)
freq='60s'
fastk=9
slowk=3
slowd=3
count=fastk+slowd+2
trade=False
#订阅函数
print(symbol)
print('----------------------------------------------------------')
subscribe(symbols=symbol,frequency=freq,count=count,wait_group=True)
def on_bar(bars):
global exchange #交易所
global front #交易币对前项币
global base #交易币对后项币
global symbol #交易标的
global freq #频率
global count
global fastk
global slowk
global slowd
global trade
records=context.data(symbol,freq,count)
k,d=ta.STOCH(records['high'],records['low'],records['close'],fastk_period=fastk,slowk_period=slowk,slowd_period=slowd)
if len(records)==count:
if trade==False and k.iloc[-2] 2] and k.iloc[-1] >d.iloc[-1] and d.iloc[-2]<=20:
if get_positions(exchange,base)[0]['available'] > records['close'].iloc[-1]:
vol_buy=get_positions(exchange,base)[0]['available']/records['close'].iloc[-1]*0.7
print(bars[0]['eob'],'买入%.4f个'%vol_buy,front)
order_buy=order_volume(symbol,vol_buy,side=1,order_type=2)
trade=True
if trade==True and k.iloc[-1]>=80 and k.iloc[-2]>d.iloc[-2] and k.iloc[-1]1] :
if len(get_positions(exchange,front))!=0:
print(bars[0]['eob'],'清仓',front)
order_buy=order_volume(symbol,get_positions(exchange,front)[0]['available'],side=2,order_type=2)
trade=False
def on_execution_report(execrpt):
print('打印交易回执:',execrpt)
def on_error(code,info):
print('错误代码:',code,'错误代码说明:',info)
def on_backtest_finished(indicator):
print('回测结果显示:',indicator)
if __name__ == '__main__':
run(strategy_id='f35bf0f6-a69e-11e8-8643-00ffa9185dbb',
filename='main.py',
mode=MODE_LIVE,
token='6778ebc60a3b004bcc7286a5566a28df')
回测结果如下(所有结果按每日公允汇率币/USD结算):
累计收益率:-55.05%
年化收益率:-66.85%
基准收益率:-79.03%
最大回撤:49.90%
Alpha:-0.60
Beta:0.12
从回测结果可以看出,相对于基准BTC/USD来说,KDJ策略实现了超额收益,但是绝对收益不佳。这是因为价格短期波动太剧烈时,KD值容易出现高位或者低位钝化,也就是说快速上涨时,K值在超卖区出现钝化,但是上涨趋势并没有结束,这是会出现“卖的早”现象。价格下跌时,K值在超买区出现钝化,但是下跌趋势并没有结束,这是会出现“卖的早”现象。
思考优化:由于数字资产价格波动剧烈,能否通过频率较慢的价格进行KDJ策略?基于此,在3600s频率的行情中进行回测。回测结果如下(所有结果按每日公允汇率币/USD结算):
累计收益率:-29.63%
年化收益率:-44.80%
基准收益率:-79.03%
最大回撤:33.49%
Alpha:-0.31
Beta:0.20
从回测结果可以看出,策略的超额收益有了明显的提高,最大回撤也明显降低,虽然绝对收益有所回升,但是仍然取得了比较差的收益。
小结:KDJ策略容易收到短期价格剧烈波动的影响,同时存在“钝化”现象,因此单纯使用KDJ指标进行交易风险时很大的,需要结合其他方法减少误信号和钝化的影响。读者有兴趣可以自己回测以下其他的频率下KDJ策略结果。
声明:本文主要用于共同探讨和学习,请勿直接用于实盘交易。
后续将推出更多系列的量化策略,欢迎大家关注,共同交流。