Python调用Binance API计算15分钟RSI与官网数值不符的问题
解决RSI计算与Binance官网不一致的问题
核心原因
你的代码计算出的RSI和官网不符,主要是两个问题:
- 包含未闭合K线:当前时间的15分钟K线还在运行,收盘价实时变动,但Binance官网的RSI仅使用已完全闭合的K线收盘价计算。
- 时间范围未对齐K线柱:直接用当前时间减固定分钟数,无法精准匹配Binance的15分钟K线时间周期(K线结束时间为00/15/30/45分整),导致获取的K线范围或数量错误。
修正步骤
1. 精准获取已闭合的K线数据
调整代码,只获取已完成的15分钟K线,避免包含未闭合的当前周期数据:
import datetime as dt import numpy as np import talib from binance.client import Client client = Client(api_key="你的API密钥", api_secret="你的API密钥") # 获取UTC当前时间,对齐到最近的15分钟周期起始点(即当前未闭合K线的开始时间) now_utc = dt.datetime.now(dt.timezone.utc) current_15min_start = now_utc - dt.timedelta( minutes=now_utc.minute % 15, seconds=now_utc.second, microseconds=now_utc.microsecond ) # 计算起始时间:往前推15个完整的15分钟周期,确保获取15个已闭合收盘价(计算14周期RSI需要15个价格) start_str = (current_15min_start - dt.timedelta(minutes=15*15)).isoformat() end_str = current_15min_start.isoformat() # 获取指定时间范围内的已闭合K线 trades = client.get_historical_klines( symbol='BTCUSDT', interval=Client.KLINE_INTERVAL_15MINUTE, start_str=start_str, end_str=end_str )
2. 计算RSI并验证
提取收盘价后计算RSI,此时数据与官网一致:
# 提取已闭合K线的收盘价 closes = [float(row[4]) for row in trades] # 确保获取到15个收盘价(用于计算14周期RSI) if len(closes) != 15: print("警告:获取的K线数量异常,请检查时间范围") c = np.array(closes) rsi = talib.RSI(c, timeperiod=14) print("计算的RSI值:", rsi[-1])
替代方案:通过Limit参数获取
也可以直接用get_klines的limit参数获取最近的K线,再剔除未闭合的最后一根:
# 获取最近16根K线(包含1根未闭合的当前周期) trades = client.get_klines( symbol='BTCUSDT', interval=Client.KLINE_INTERVAL_15MINUTE, limit=16 ) # 剔除最后一根未闭合的K线,得到15个已闭合收盘价 completed_trades = trades[:-1] closes = [float(row[4]) for row in completed_trades] c = np.array(closes) rsi = talib.RSI(c, timeperiod=14) print("计算的RSI值:", rsi[-1])
WebSocket后续处理建议
用WebSocket更新RSI时,需监听K线闭合的推送事件(如kline_15m频道的kline.is_final字段),当收到已闭合的新K线时:
- 从收盘价列表中移除最旧的一个价格
- 添加新的闭合收盘价
- 重新计算RSI,确保始终用最新的15个已闭合收盘价计算
内容的提问来源于stack exchange,提问作者barteloma
相关产品推荐
相关产品推荐

