avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Strategi perdagangan kuantitatif - penunjuk KDJ

Dicipta dalam: 2017-01-16 15:00:09, dikemas kini pada: 2019-08-01 09:22:39
comments   0
hits   3915

Strategi perdagangan kuantitatif - penunjuk KDJ

Instrumen analisis teknikal yang paling biasa digunakan di pasaran niaga hadapan dan pasaran saham ialah penunjuk KDJ, penunjuk rawak penuh nama ((Stochastics), yang dicipta oleh Dr. George Lane. Penunjuk KDJ menggabungkan konsep dinamik, penunjuk kuat dan lemah dengan beberapa kelebihan, dengan hubungan perkadaran antara tiga harga tertinggi, terendah, harga, dan harga penutupan yang berlaku dalam tempoh tertentu dikira sebagai data asas, nilai K, nilai D dan nilai J yang dihasilkan dihubungkan ke dalam grafik kurva, membentuk penunjuk KDJ yang mencerminkan trend turun naik harga.

  • #### Kaedah pengiraan: Pertama, kira nilai RSV bagi kitaran, kemudian kira nilai K, nilai D, nilai J. Sebagai contoh, KDJ bagi kitaran 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 3 hari rata-rata bergerak rata-rata, formula adalah: Kt = RSVt / 3 + 2*t-13

D adalah purata bergerak 3 hari dengan nilai K, dengan formula: Dt = Kt / 3 + 2*Dt-13

J bernilai tiga kali nilai K tolak dua kali nilai D, dengan formula: Jt = 3*Dt-2*Kt

Beberapa aspek penting yang perlu dipertimbangkan semasa menggunakan KDJ:

  1. Pengharaman K dan D, julat 0-100; 80 atau lebih menunjukkan fenomena overbuy dan 20 atau lebih menunjukkan fenomena oversell.

  2. isyarat beli: K nilai dalam trend naik D nilai, K garis ke bawah memecahkan D garis.

  3. Saham yang tidak aktif didagangkan dan tidak banyak dikeluarkan tidak sesuai untuk Indeks KD, dan keakuratan untuk pasaran besar dan pasaran popular sangat tinggi.

  4. Pada KD di kedudukan tinggi atau rendah, jika terdapat percanggahan dari arah harga saham, ia adalah isyarat untuk bertindak.

  5. J bernilai >100 untuk overbuy dan untuk oversell, semuanya berada dalam kawasan harga yang tidak normal.

  6. isyarat amaran perubahan jangka pendek: K dan D nilai naik atau turun perlahan, kemiringan cenderung perlahan

Biasanya K, D, dan J berada di antara 20-80, dan ia adalah baik untuk dilihat, J adalah yang paling kuat dari segi kepekaan, diikuti oleh K, dan D adalah yang paling perlahan, dan sebaliknya dari segi keselamatan.

  • #### Kode Strategi (Kode Kuantitatif Bukan Pencipta)
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

Dipetik daripada Program Trader