KDJ金叉测试

# -*- coding: utf-8 -*-
import os import pandas as pd # ========== 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表stock_code_list stock_code_list = [] for root, dirs, files in os.walk('stock data'):# 注意:这里请填写数据文件在您电脑中的路径 if files: for f in files: if '.csv' in f: stock_code_list.append(f.split('.csv')[0]) # ========== 根据上一步得到的代码列表,遍历所有股票,将这些股票合并到一张表格all_stock中 all_stock = pd.DataFrame() # 遍历每个创业板的股票 for code in stock_code_list: print(code) # 从csv文件中读取该股票数据 stock_data = pd.read_csv('stock data/' + code + '.csv', parse_dates=[1])# 注意:这里请填写数据文件在您电脑中的路径 stock_data.sort('date', inplace=True)# 对数据按照【date】交易日期从小到大排序 # 计算KDJ指标 low_list = pd.rolling_min(stock_data['low'], 9) low_list.fillna(value=pd.expanding_min(stock_data['low']), inplace=True) high_list = pd.rolling_max(stock_data['high'], 9) high_list.fillna(value=pd.expanding_max(stock_data['high']), inplace=True) rsv = (stock_data['close'] - low_list) / (high_list - low_list) * 100 stock_data['KDJ_K'] = pd.ewma(rsv, com=2) stock_data['KDJ_D'] = pd.ewma(stock_data['KDJ_K'], com=2) stock_data['KDJ_J'] = 3 * stock_data['KDJ_K'] - 2 * stock_data['KDJ_D'] # 计算KDJ指标金叉、死叉情况 stock_data['KDJ_金叉死叉'] = '' kdj_position = stock_data['KDJ_K'] > stock_data['KDJ_D'] stock_data.loc[kdj_position[(kdj_position == True) & (kdj_position.shift() == False)].index, 'KDJ_金叉死叉'] = '金叉' stock_data.loc[kdj_position[(kdj_position == False) & (kdj_position.shift() == True)].index, 'KDJ_金叉死叉'] = '死叉' # 通过复权价格计算接下来几个交易日的收益率 for n in [1, 2, 3, 5, 10, 20]: stock_data['接下来'+str(n)+'个交易日涨跌幅'] = stock_data['adjust_price'].shift(-1*n) / stock_data['adjust_price'] - 1.0 stock_data.dropna(how='any', inplace=True)# 删除所有有空值的数据行 # 筛选出KDJ金叉的数据,并将这些数据合并到all_stock中 stock_data = stock_data[(stock_data['KDJ_金叉死叉'] == '金叉')] if stock_data.empty: continue all_stock = all_stock.append(stock_data, ignore_index=True) # ========== 根据上一步得到的所有股票KDJ金叉数据all_stock,统计这些股票在未来交易日中的收益情况 #print print('历史上所有股票出现KDJ金叉的次数为%d,这些股票在:' %all_stock.shape[0]) #print for n in [1, 2, 3, 5, 10, 20]: print("金叉之后的%d个交易日内," % n) print("平均涨幅为%.2f%%," % (all_stock['接下来'+str(n)+'个交易日涨跌幅'].mean() * 100)) print("其中上涨股票的比例是%.2f%%。" % (all_stock[all_stock['接下来'+str(n)+'个交易日涨跌幅'] > 0].shape[0]/float(all_stock.shape[0]) * 100)) #print

以上是pandas0.17版本。

以下是pandas0.19版本。

import os
import pandas as pd

# 从csv文件中读取该股票数据
stock_data = pd.read_csv('000078.csv',parse_dates=[1],encoding='gbk')
stock_data.sort_values('日期', inplace=True)

# 计算KDJ指标
low_list=stock_data['最低价'].rolling(window=9).min()
low_list.fillna(value=stock_data['最低价'].expanding().min(), inplace=True)
high_list = stock_data['最高价'].rolling(window=9).max()
high_list.fillna(value=stock_data['最高价'].expanding().max(), inplace=True)

rsv = (stock_data['收盘价'] - low_list) / (high_list - low_list) * 100
stock_data['KDJ_K'] = rsv.ewm(com=2).mean()
stock_data['KDJ_D'] = stock_data['KDJ_K'].ewm(com=2).mean()
stock_data['KDJ_J'] = 3 * stock_data['KDJ_K'] - 2 * stock_data['KDJ_D']

# 计算KDJ指标金叉、死叉情况
stock_data['KDJ_金叉死叉'] = ''
kdj_position = stock_data['KDJ_K'] > stock_data['KDJ_D']
stock_data.loc[kdj_position[(kdj_position == True) & (kdj_position.shift() == False)].index, 'KDJ_金叉死叉'] = '金叉'
stock_data.loc[kdj_position[(kdj_position == False) & (kdj_position.shift() == True)].index, 'KDJ_金叉死叉'] = '死叉'

# 计算接下来几个交易日的收益率
for n in [1, 2, 3, 5, 10, 20]:
    stock_data['接下来'+str(n)+'个交易日涨跌幅'] = stock_data['收盘价'].shift(-1*n) / stock_data['收盘价'] - 1.0

# 删除所有有空值的数据行
stock_data.dropna(how='any', inplace=True)
# 筛选出KDJ金叉的数据,并将这些数据合并到all_stock中
stock_data = stock_data[(stock_data['KDJ_金叉死叉'] == '金叉')]

print('历史上股票出现KDJ金叉的次数为%d,这些股票在:' %stock_data.shape[0])
for n in [1, 2, 3, 5, 10, 20]:
    print('金叉之后的%d个交易日内,' % n)
    print('平均涨幅为%.2f%%,' % (stock_data['接下来'+str(n)+'个交易日涨跌幅'].mean()*100))
    print('其中上涨股票的比例是%.2f%%。' % 
          (stock_data[stock_data['接下来'+str(n)+'个交易日涨跌幅'] > 0].shape[0]/float(stock_data.shape[0]) * 100))
原文地址:https://www.cnblogs.com/wumac/p/6076345.html