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.
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-1⁄3
Une moyenne mobile à 3 jours dont la valeur de D est la valeur de K, avec la formule: Dt = Kt/3+2*Dt-1⁄3
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:
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.
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.
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.
En KD, en position haute ou basse, un écart par rapport à la direction du cours est un signal d’action.
La valeur de J > 100 est une survente et < 0 est une survente, toutes deux étant des zones anormales de prix.
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.
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.