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.
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-1⁄3
Rata-rata bergerak 3 hari dengan nilai D adalah nilai K, dengan rumus: Dt = Kt / 3 + 2*Dt-1⁄3
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:
Nilai K dan D, kisaran 0-100; 80 atau lebih menunjukkan fenomena overbought dan 20 atau lebih menunjukkan fenomena oversold.
sinyal beli: K nilai di uptrend D nilai, K garis ke bawah ketika menembus D garis.
Saham yang tidak aktif diperdagangkan, tidak banyak diterbitkan tidak berlaku untuk indikator KD, dan akurasi untuk pasar besar dan pasar besar populer sangat tinggi.
Pada KD di posisi tinggi atau rendah, jika ada deviasi dari arah harga saham, itu adalah sinyal untuk bertindak.
Nilai J > 100 adalah overbought, < 0 adalah oversold, semuanya berada di area harga yang tidak normal.
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.
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