avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Stratégie de trading quantitative - Indicateur KDJ

Créé le: 2017-01-16 15:00:09, Mis à jour le: 2019-08-01 09:22:39
comments   0
hits   3915

Stratégie de trading quantitative - Indicateur KDJ

L’indicateur KDJ, le plus utilisé dans les marchés à terme et les marchés boursiers, est un outil d’analyse technique appelé Stochastics, créé par le Dr George Lane. Il combine la notion de dynamique et certains des avantages des indicateurs de force et de faiblesse. L’indicateur KDJ est calculé comme une donnée de base en utilisant le rapport proportionnel entre les prix les plus élevés, les plus bas, les prix et les prix de clôture sur une période donnée.

  • #### Méthode de calcul: Calculez d’abord la valeur RSV du cycle, puis la valeur K, la valeur D et la valeur J. Prenons l’exemple de la KDJ du cycle de 9 jours:

RSVt=(Ct-L9)/(H9-L9)*100 (Ct = prix de clôture du jour; L9 = prix le plus bas en 9 jours; H9 = prix le plus élevé en 9 jours)

K est la valeur de la moyenne mobile lisse de 3 jours de RSV, avec la formule: Kt = RSVt/3+2*t-13

Une moyenne mobile à 3 jours dont la valeur de D est la valeur de K, avec la formule: Dt = Kt/3+2*Dt-13

La valeur de J est 3 fois la valeur de K moins 2 fois la valeur de D, avec la formule: Jt = 3*Dt-2*Kt

Voici quelques aspects importants à prendre en compte lors de l’application du KDJ:

  1. La valorisation de K et de D est de 0 à 100 et plus de 80 sont des transactions de surachat et moins de 20 sont des transactions de surachat.

  2. Signaux d’achat: valeur de K dans une tendance à la hausse < valeur de D, lorsque la ligne de K a franchi la ligne de D vers le haut; Signaux de vente: valeur de K dans une tendance à la baisse > valeur de D, lorsque la ligne de K a franchi la ligne de D vers le bas.

  3. L’indicateur KD ne s’applique pas aux actions peu actives et peu émises, alors que la précision est élevée pour les grands marchés et les grands marchés populaires.

  4. En KD, en position haute ou basse, un écart par rapport à la direction du cours est un signal d’action.

  5. La valeur de J > 100 est une survente et < 0 est une survente, toutes deux étant des zones anormales de prix.

  6. Signaux d’alerte de courte durée: la vitesse de montée ou de descente des valeurs K et D diminue, la pente tend à s’apaiser

En règle générale, les trois valeurs K, D et J se situent entre 20 et 80, ce qui est intéressant de voir, en termes de sensibilité, la valeur J est la plus forte, suivie de K, et la plus lente est D, et en termes de sécurité, c’est tout le contraire.

  • #### Code de stratégie (Code de quantification non inventé par l’inventeur)
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

Il y a des gens qui ne sont pas d’accord avec moi.