数字货币量化通用策略研究系列---技术指标之KDJ

标签: 数字货币  量化交易  程序化交易  区块链

这里写图片描述
前言: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] <d.iloc[-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]<d.iloc[-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策略结果。

声明:本文主要用于共同探讨和学习,请勿直接用于实盘交易。

后续将推出更多系列的量化策略,欢迎大家关注,共同交流。

原文链接:加载失败,请重新获取