avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada Pesan pribadi
4
fokus pada
1271
Pengikut

Strategi perdagangan kuantitatif - Indikator KDJ

Dibuat di: 2017-01-16 15:00:09, diperbarui pada: 2019-08-01 09:22:39
comments   0
hits   3915

Strategi perdagangan kuantitatif - Indikator KDJ

Instrumen analisis teknis yang paling umum digunakan di pasar berjangka dan saham adalah indikator KDJ, yang dikenal sebagai indikator acak (Stochastics), yang diciptakan oleh Dr. George Lane. Indikator KDJ menggabungkan konsep dinamika, indikator kuat dan lemah dengan beberapa keunggulan. Indikator KDJ dihitung sebagai data dasar melalui hubungan proporsional antara tiga harga tertinggi, terendah, harga, dan harga penutupan yang terjadi dalam periode tertentu.

  • #### Metode perhitungan: Pertama menghitung nilai RSV dari siklus, kemudian menghitung nilai K, nilai D, nilai J. Sebagai contoh, KDJ dari siklus 9 hari:

RSVt=(Ct-L9)/(H9-L9)*100 (Ct = harga penutupan hari; L9 = harga terendah dalam 9 hari; H9 = harga tertinggi dalam 9 hari)

Nilai K adalah nilai RSV rata-rata bergerak rata-rata selama 3 hari, dengan rumus: Kt = RSVt / 3 + 2*t-13

Rata-rata bergerak 3 hari dengan nilai D adalah nilai K, dengan rumus: Dt = Kt / 3 + 2*Dt-13

Nilai J adalah tiga kali nilai K dikurangi dua kali nilai D, dengan rumus: Jt = 3*Dt-2*Kt

Ada beberapa hal yang perlu dipertimbangkan saat menerapkan indikator KDJ:

  1. Nilai K dan D, kisaran 0-100; 80 atau lebih menunjukkan fenomena overbought dan 20 atau lebih menunjukkan fenomena oversold.

  2. sinyal beli: K nilai di uptrend D nilai, K garis ke bawah ketika menembus D garis.

  3. Saham yang tidak aktif diperdagangkan, tidak banyak diterbitkan tidak berlaku untuk indikator KD, dan akurasi untuk pasar besar dan pasar besar populer sangat tinggi.

  4. Pada KD di posisi tinggi atau rendah, jika ada deviasi dari arah harga saham, itu adalah sinyal untuk bertindak.

  5. Nilai J > 100 adalah overbought, < 0 adalah oversold, semuanya berada di area harga yang tidak normal.

  6. Sinyal peringatan tren jangka pendek: K dan D nilai naik atau turun lebih lambat, kemiringan cenderung mereda

Biasanya K, D, dan J berada di antara 20-80, dan ini bagus untuk dilihat, J adalah yang paling kuat dalam hal sensitivitas, diikuti oleh K, dan yang paling lambat adalah D, dan sebaliknya dalam hal keamanan.

  • #### Kode Kebijakan (kode non-penemu)
import numpy as np
import pandas as pd
from pandas import DataFrame
import talib as ta

start = '2006-01-01'                        # 回测起始时间
end = '2015-08-17'                          # 回测结束时间
benchmark = 'HS300'                         # 策略参考标准
universe = set_universe('HS300')
capital_base = 100000                        # 起始资金
refresh_rate = 1                           # 调仓频率,即每 refresh_rate 个交易日执行一次 handle_data() 函数
longest_history=20
MA=[5,10,20,30,60,120]                       #移动均线参数

def initialize(account):
    account.kdj=[]
    
def handle_data(account):  
   
    # 每个交易日的买入卖出指令
    
    sell_pool=[]
    hist = account.get_history(longest_history)
        #data=DataFrame(hist['600006.XSHG'])
    stock_pool,all_data=Get_all_indicators(hist)
    pool_num=len(stock_pool)
    if account.secpos==None:
        print 'null'
        for i in stock_pool:
            buy_num=int(float(account.cash/pool_num)/account.referencePrice[i]/100.0)*100 
            order(i, buy_num)
    else:
        
        for x in account.valid_secpos:
            if all_data[x].iloc[-1]['closePrice']<all_data[x].iloc[-1]['ma1'] and (all_data[x].iloc[-1]['ma1']-all_data[x].iloc[-1]['closePrice'])/all_data[x].iloc[-1]['ma1']>0.05 :
                sell_pool.append(x)
                order_to(x, 0)
        
        
        
        if account.cash>500 and pool_num>0:
            
            try:
                sim_buy_money=float(account.cash)/pool_num
                for l in stock_pool:
                    #print sim_buy_money,account.referencePrice[l]
            
                    buy_num=int(sim_buy_money/account.referencePrice[l]/100.0)*100
           
                    #buy_num=10000
                    order(l, buy_num)
            except Exception as e:
                #print e
                pass
           

        
def Get_kd_ma(data):
    indicators={}
    #计算kd指标
    indicators['k'],indicators['d']=ta.STOCH(np.array(data['highPrice']),np.array(data['lowPrice']),np.array(data['closePrice']),\
    fastk_period=9,slowk_period=3,slowk_matype=0,slowd_period=3,slowd_matype=0)
    indicators['ma1']=pd.rolling_mean(data['closePrice'], MA[0])
    indicators['ma2']=pd.rolling_mean(data['closePrice'], MA[1])
    indicators['ma3']=pd.rolling_mean(data['closePrice'], MA[2])
    indicators['ma4']=pd.rolling_mean(data['closePrice'], MA[3])
    indicators['ma5']=pd.rolling_mean(data['closePrice'], MA[4])
    indicators['closePrice']=data['closePrice']
    indicators=pd.DataFrame(indicators)
    return indicators

def Get_all_indicators(hist):
    stock_pool=[]
    all_data={}
    for i in hist:
        try:
            indicators=Get_kd_ma(hist[i])
            all_data[i]=indicators
        except Exception as e:
            #print 'error:%s'%e
            pass
        if indicators.iloc[-2]['k']<indicators.iloc[-2]['d'] and indicators.iloc[-1]['k']>indicators.iloc[-2]['d']:
            stock_pool.append(i)
        elif indicators.iloc[-1]['k']>=10 and indicators.iloc[-1]['d']<=20 and indicators.iloc[-1]['k']>indicators.iloc[-2]['k'] and indicators.iloc[-2]['k']<indicators.iloc[-3]['k']:
            stock_pool.append(i)
    return stock_pool,all_data

Dikutip dari Programmed Trader