王圆圆圆圆 发表于 2017-11-3 11:42
我的回测怎么报错了.......IndexError: single positional indexer is out-of-bounds
这个问题我解决了~
问题始作俑者:如果有股票在stock_code_list里面,但是数据为空,那么在计算复权价格(cal_right_price)函数中就会报错“out-of-bounds”
解决办法:在获取股票数据(get_stock_data)函数的for循环中多加一个非零判断:
if(len(stock_data)>0):
加完之后代码:
# 获取股票数据
def get_stock_data():
# 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表
stock_code_list = []
# 此处为股票数据文件的本地路径,请自行修改
for root, dirs, files in os.walk('C:/Users/Administrator/Desktop/stock data'):
if files:
for f in files:
if '.csv' in f:
stock_code_list.append(f.split('.csv')[0])
all_stock = pd.DataFrame()
for code in stock_code_list:
# 此处为股票数据文件的本地路径,请自行修改
stock_data = pd.read_csv('C:/Users/Administrator/Desktop/stock data/' + code + '.csv', parse_dates=['date'])
if(len(stock_data)>0):
stock_data = stock_data[['code', 'date', 'open', 'close', 'change']].sort_values(by='date')
stock_data.reset_index(drop=True, inplace=True)
# 计算复权价
stock_data[['open', 'close']] = cal_right_price(stock_data, type='后复权')
# 判断每天开盘是否涨停
stock_data.loc[stock_data['open'] > stock_data['close'].shift(1) * 1.097, 'limit_up'] = 1
stock_data['limit_up'].fillna(0, inplace=True)
all_stock = all_stock.append(stock_data, ignore_index=True)
return all_stock[['code', 'date', 'change', 'limit_up']]