avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Quantitative Handelsstrategie - KDJ-Indikator

Erstellt in: 2017-01-16 15:00:09, aktualisiert am: 2019-08-01 09:22:39
comments   0
hits   3915

Quantitative Handelsstrategie - KDJ-Indikator

Die am häufigsten verwendeten technischen Analyse-Tools in den Futures- und Aktienmärkten sind die Stochastics, die von Dr. George Lane entwickelt wurden. Die Stochastics kombinieren die Dynamik der Dynamik mit den Vorteilen der Schwachstellen. Die KDJ-Index wird als Basisdaten berechnet, indem die relativen Beziehungen zwischen den höchsten und niedrigsten Preisen, den Preisen und den Schließpreisen in einer bestimmten Periode berechnet werden.

  • #### Berechnungsmethode: Zuerst berechnen Sie den RSV-Wert für den Zyklus, dann den K-Wert, den D-Wert und den J-Wert.

RSVt=(Ct-L9)/(H9-L9)*100 (Ct = Schlusskurs am Tag; L9 = niedrigster Preis in 9 Tagen; H9 = höchster Preis in 9 Tagen)

K-Wert ist der RSV-Wert des 3-Tage-Gleichlaufdurchschnitts mit der Formel: Kt = RSVt/3+2*t-13

Dt = Kt/3+2 ist ein 3-Tage-Schleifenmittelwert mit K-Wert*Dt-13

J ist 3 mal K minus 2 mal D. Jt = 3*Dt-2*Kt

Einige wichtige Aspekte, die bei der Anwendung des KDJ-Wertes zu beachten sind:

  1. Die Bewertung von K und D liegt im Bereich von 0 bis 100, 80 oder mehr sind überkauft, 20 oder weniger sind überverkauft.

  2. Kaufsignal: K-Wert im Aufwärtstrend D-Wert, wenn die K-Linie die D-Linie nach unten durchbricht.

  3. Aktien, die nicht aktiv gehandelt werden und nur geringe Umsätze aufweisen, sind nicht für den KD-Index geeignet, während die Genauigkeit für Großbörsen und beliebte Großbörsen hoch ist.

  4. Bei einer Abweichung von der Kursrichtung bei hohen oder niedrigen KDs ist dies ein Signal zum Handeln.

  5. J mit einer Wertschätzung von > 100 als Überkauf und < 0 als Überverkauf, alle in der abnormalen Zone des Preises.

  6. Kurzfristige Trendwarnsignale: K- und D-Werte steigen oder fallen langsamer, die Neigung verlangsamt sich

Normalerweise sind die drei Werte K, D und J zwischen 20 und 80 und es ist gut zu beobachten, dass der stärkste Wert in Bezug auf die Empfindlichkeit der J ist, der zweite der K, der langsamste der D, und in Bezug auf die Sicherheit ist es genau das Gegenteil.

  • #### Strategie-Code (nicht vom Erfinder quantifiziert)
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

Veröffentlicht von Programmierte Händler