写在前面:
1. 本文中提到的“股票策略校验工具”的具体使用操作请查看该博文;
2. 文中知识内容来自书籍《同花顺炒股软件从入门到精通》
3. 本系列文章是用来学习技法,文中所得内容都仅仅只是作为演示功能使用
目录
解说
策略代码
结果
KDJ随机指标,是威廉指标的一种延伸工具,最早起源于期货市场,由乔治·莱恩首创。它通过计算当日或最近几日最高价、最低价及收盘价等价格波动的幅度,来反映价格趋势的强弱,及超买超卖的状态。
随机指标在图表上共有3根线,K线、D线和J线。随机指标在计算中考虑了计算周期内的最高随机指标价、最低价,兼顾了股价波动中的随机振幅,因而随机指标更能真实地反映股价的波动,其提示作用更加明显。随机指标KD线中,K为快速指标,D为慢速指标。当K线向上突破D线时,表示为上升趋势,可以买进;当K线向下突破D线时,可以卖出。又当KD值升到90以上时表示偏高,跌到20以下时表示偏低。太高就有下跌的可能,而太低就有上涨的机会。
KDJ随机指标对买点的应用原则如下。
1)K值在50以下的低水平,并且呈现上涨的趋势,并且K线由下向上和D线有交叉现象,此时为买点,后期股票会产生大的上涨行情。
2)K线由下向上交叉D线失败转而向下探底后,K线再次向上交叉D线,两线所夹的空间叫做向上反转风洞。当出现向上反转风洞时股价将上涨。
3)当K值小于20时,股价极容易短期内上涨,此时一般为较好的买点。
4)在一般情况下,D值小于20时,股价很容易短期内回弹。如果D值继续减少到15时,股价会在极短时间内快速上涨,但这只是短期回弹上涨,这种瞬间回档或反弹不代表行情已经反转。
5)J线信号一般不出现,一旦出现,可靠性最强。当J值小于0时,代表股价已经见底,是较好的买点。

def excute_strategy(base_data,data_dir):'''指标买点分析技法 - 运用KDJ随机指标选择买点解析:1. K值在50以下的低水平,并且呈现上涨的趋势,并且K线由下向上和D线有交叉现象,此时为买点,后期股票会产生大的上涨行情2. K线由下向上交叉D点失败转而向下探底后,K线再次向上交叉D线,两线所夹的空间叫做向上反转风洞。当出现向上反转风洞时股价将上涨3. 当K值小于20时,股价极容易短期内上涨,此时一般为较好的买点。4. 在一般情况下,D值小于20时,股价很容易短期内回弹。如果D值继续减少到15时,股价会在极短时间内快速上涨,但这只是短期回弹上涨,这种瞬间回档或反弹不代表行情已经反转。5. J线信号一般不出现,一旦出现,可靠性最强。当J值小于0时,代表股价已经见底,是较好的买点通俗翻译:1. K线上穿D线,且K<502. 比较麻烦,本策略不实现3. K线上穿204. 本策略不实现5. J线上穿0自定义:1. 买入时点 =》 走势确定后下一交易日2. 胜 =》 买入后第三个交易日收盘价上升,为胜只计算最近两年的数据:param base_data:股票代码与股票简称 键值对:param data_dir:股票日数据文件所在目录:return:'''import pandas as pdimport numpy as npimport talib,osfrom datetime import datetimefrom dateutil.relativedelta import relativedeltafrom tools import stock_factor_caculatedef res_pre_two_year_first_day():pre_year_day = (datetime.now() - relativedelta(years=2)).strftime('%Y-%m-%d')return pre_year_daycaculate_start_date_str = res_pre_two_year_first_day()dailydata_file_list = os.listdir(data_dir)total_count = 0total_win = 0check_count = 0list_list = []detail_map = {}factor_list = ['KDJ']ma_list = []for item in dailydata_file_list:item_arr = item.split('.')ticker = item_arr[0]secName = base_data[ticker]file_path = data_dir + itemdf = pd.read_csv(file_path,encoding='utf-8')# 删除停牌的数据df = df.loc[df['openPrice'] > 0].copy()df['o_date'] = df['tradeDate']df['o_date'] = pd.to_datetime(df['o_date'])df = df.loc[df['o_date'] >= caculate_start_date_str].copy()# 保存未复权收盘价数据df['close'] = df['closePrice']# 计算前复权数据df['openPrice'] = df['openPrice'] * df['accumAdjFactor']df['closePrice'] = df['closePrice'] * df['accumAdjFactor']df['highestPrice'] = df['highestPrice'] * df['accumAdjFactor']df['lowestPrice'] = df['lowestPrice'] * df['accumAdjFactor']if len(df)<=0:continue# 开始计算for item in factor_list:df = stock_factor_caculate.caculate_factor(df,item)for item in ma_list:df = stock_factor_caculate.caculate_factor(df,item)df.reset_index(inplace=True)df['i_row'] = [i for i in range(len(df))]df['three_chg'] = round(((df['close'].shift(-3) - df['close']) / df['close']) * 100, 4)df['three_after_close'] = df['close'].shift(-3)# kdj_k kdj_d kdj_jdf['target_yeah'] = 0df.loc[(df['kdj_k']<50) & (df['kdj_k'].shift(1)=df['kdj_d']),'target_yeah'] = 1df.loc[(df['kdj_k'].shift(1)<20) & (df['kdj_k']>=20),'target_yeah'] = 1df.loc[(df['kdj_j'].shift(1)<0) & (df['kdj_j']>=0),'target_yeah'] = 1i_row_list = df.loc[df['target_yeah']==1]['i_row'].values.tolist()node_count = 0node_win = 0duration_list = []table_list = []for i,row0 in enumerate(i_row_list):row = row0 + 1if row >= len(df):continuedate_str = df.iloc[row]['tradeDate']cur_close = df.iloc[row]['close']three_after_close = df.iloc[row]['three_after_close']three_chg = df.iloc[row]['three_chg']table_list.append([i,date_str,cur_close,three_after_close,three_chg])duration_list.append([row-2,row+3])node_count += 1if three_chg<0:node_win +=1passlist_list.append({'ticker':ticker,'secName':secName,'count':node_count,'win':0 if node_count<=0 else round((node_win/node_count)*100,2)})detail_map[ticker] = {'table_list': table_list,'duration_list': duration_list}total_count += node_counttotal_win += node_wincheck_count += 1passdf = pd.DataFrame(list_list)results_data = {'check_count':check_count,'total_count':total_count,'total_win':0 if total_count<=0 else round((total_win/total_count)*100,2),'start_date_str':caculate_start_date_str,'df':df,'detail_map':detail_map,'factor_list':factor_list,'ma_list':ma_list}return results_data


本文校验的数据是随机抽取的81个股票
下一篇:形容美女和江南风景的诗句