Phemex加密货币Ichimoku指标计算出现NaN值问题求助
解决Ichimoku云指标计算中Senkou云及Chikou Span显示NaN的问题
问题根源
你的代码里有两个关键错误,直接导致了Senkou云和Chikou Span全为NaN:
- 滚动低点计算错误:所有
low10/low30/low60都误用了ohlcv.high列取最小值,完全不符合Ichimoku指标的计算逻辑,应该用ohlcv.low列计算滚动低点。 - 数据量不足:设置的
limit=50太小,Senkou B需要60周期的滚动极值,加上Senkou系列要向后偏移26行、Chikou要向前偏移26行,50行数据根本不够,移位后直接超出数据范围产生NaN。
修正后的代码
import pandas as pd import ccxt import nocompartir import onecall # 连接Phemex交易所 phe = ccxt.phemex({ 'enableRatelimit': True, 'apiKey': nocompartir.xP_key, 'secret': nocompartir.secret, }) # 获取OHLCV数据,增加数据量到100行(满足60周期滚动+移位需求) timeframe = '4h' limit = 100 # 至少需要60+26=86行,设100留冗余 symbol ='uBTCUSD' ohlcv = pd.DataFrame( phe.fetch_ohlcv(symbol=symbol, timeframe=timeframe, limit=limit), columns=['time', 'open', 'high', 'low', 'close', 'volume'] ) # 修正:用high列算滚动高点,low列算滚动低点 high10 = ohlcv.high.rolling(10).max() high30 = ohlcv.high.rolling(30).max() high60 = ohlcv.high.rolling(60).max() low10 = ohlcv.low.rolling(10).min() low30 = ohlcv.low.rolling(30).min() low60 = ohlcv.low.rolling(60).min() # 计算Ichimoku全指标 ohlcv['tenkan_sen'] = (high10 + low10) / 2 ohlcv['kijun_sen'] = (high30 + low30) / 2 ohlcv['senkou_A'] = ((ohlcv.tenkan_sen + ohlcv.kijun_sen) / 2).shift(26) ohlcv['senkou_B'] = ((high60 + low60) / 2).shift(26) ohlcv['chikou'] = ohlcv.close.shift(-26) # 过滤掉前60行(因为60周期滚动指标需要60个数据点才会有有效值) ohlcv = ohlcv.iloc[60:] print(ohlcv)
关键修改说明
- 修复滚动列错误:把所有计算低点的代码从
ohlcv.high.rolling().min()改成ohlcv.low.rolling().min(),这是确保指标逻辑正确的核心。 - 扩容数据量:将
limit提升到100,保证有足够数据支撑60周期滚动和两次移位操作,避免因数据不足产生NaN。 - 调整过滤起始行:从第60行开始取数据,因为60周期的滚动指标(high60/low60)需要前60个数据点才能生成第一个有效值,这样输出的所有指标列都会有正常数值。
内容的提问来源于stack exchange,提问作者Insert Cheese
相关产品推荐
相关产品推荐

