```
import talib
def KDJ(security_list, fastk_period=5, slowk_period=3, fastd_period=3) :
def SMA_CN(close, timeperiod) :
close = np.nan_to_num(close)
return reduce(lambda x, y: ((timeperiod - 1) * x + y) / timeperiod, close)
# 修复传入为单只股票的情况
if isinstance(security_list, str):
security_list = [security_list]
# 计算 KDJ
n = max(fastk_period, slowk_period, fastd_period)
k = {}; d = {}; j = {}
for stock in security_list:
security_data = attribute_history(stock, n*2,'1d',fields=['high', 'low', 'close'], df=False)
nan_count = list(np.isnan(security_data['close'])).count(True)
if nan_count == len(security_data['close']):
log.info("股票 %s 输入数据全是 NaN,该股票可能已退市或刚上市,返回 NaN 值数据。" %stock)
k[stock] = np.nan
d[stock] = np.nan
j[stock] = np.nan
else:
high = security_data['high']
low = security_data['low']
close = security_data['close']
kValue, dValue = talib.STOCHF(high, low, close, fastk_period, fastd_period, fastd_matype=0)
kValue = np.array(map(lambda x : SMA_CN(kValue[:x], slowk_period), range(1, len(kValue) + 1)))
dValue = np.array(map(lambda x : SMA_CN(kValue[:x], fastd_period), range(1, len(kValue) + 1)))
jValue = 3 * kValue - 2 * dValue
func = lambda arr : np.array([0 if x < 0 else (100 if x > 100 else x) for x in arr])
k[stock] = func(kValue)
d[stock] = func(dValue)
j[stock] = func(jValue)
return k, d, j
```
k, d, j=KDJ(["000001.XSHG"], fastk_period=5, slowk_period=3, fastd_period=3)
TypeError: len() of unsized object
心累,哪里错了?函数原封不动保留,用大盘指数来测试,结果还能报错??
2020-06-07