如何用Python 3.x计算RSI?求验证BTC14日RSI计算代码正确性
如何用Python 3.x计算RSI
首先得明确RSI(相对强弱指标)的核心计算逻辑,这是验证你代码正确性的基础:
RSI的计算步骤(以14日周期为例):
- 第一步:计算每日收盘价的变化值(当日收盘价 - 前一日收盘价)
- 第二步:把变化值拆分上涨幅度(仅保留正的变化值,负的记为0)和下跌幅度(仅保留负变化值的绝对值,正的记为0)
- 第三步:计算前14天的平均涨幅(简单算术平均)和平均跌幅(简单算术平均)
- 第四步:从第15天开始,用平滑移动平均更新平均涨幅和跌幅:
今日平均涨幅 = (昨日平均涨幅 * 13 + 今日涨幅) / 14今日平均跌幅 = (昨日平均跌幅 * 13 + 今日跌幅) / 14 - 第五步:计算相对强度RS = 平均涨幅 / 平均跌幅
- 第六步:RSI = 100 - (100 / (1 + RS))
注意:如果平均跌幅为0,说明14天内没有下跌,RSI直接取100;如果平均涨幅为0,RSI取0
正确的Python实现示例
下面是基于pandas的实现,方便处理BTC的价格数据(假设你已经有了包含收盘价的DataFrame):
import pandas as pd def calculate_rsi(data: pd.DataFrame, period: int = 14) -> pd.Series: # 计算每日价格变化 delta = data['close'].diff() # 拆分上涨和下跌幅度 gain = delta.where(delta > 0, 0) loss = -delta.where(delta < 0, 0) # 计算初始平均涨幅和跌幅(简单平均) avg_gain = gain.rolling(window=period).mean() avg_loss = loss.rolling(window=period).mean() # 从第period+1天开始,用平滑移动平均更新 for i in range(period, len(avg_gain)): avg_gain.iloc[i] = (avg_gain.iloc[i-1] * (period - 1) + gain.iloc[i]) / period avg_loss.iloc[i] = (avg_loss.iloc[i-1] * (period - 1) + loss.iloc[i]) / period # 计算RS和RSI rs = avg_gain / avg_loss rsi = 100 - (100 / (1 + rs)) # 处理初始period天的NaN值,以及避免除以0的情况 rsi = rsi.fillna(0) rsi[avg_loss == 0] = 100 rsi[avg_gain == 0] = 0 return rsi # 示例用法:假设你的BTC数据存在btc_data中,包含'close'列 # btc_data = pd.read_csv('btc_price.csv') # btc_data['rsi_14'] = calculate_rsi(btc_data) # print(btc_data[['close', 'rsi_14']].tail())
如何验证你的代码正确性
如果你已经写了代码,可以通过以下步骤验证:
- 手动计算对比:取前15天的收盘价,手动计算前14天的平均涨幅、跌幅,然后算出第一个RSI值,和代码输出对比
- 和权威工具对比:比如用TradingView、Yahoo Finance上的BTC 14日RSI数据,截取完全一致的时间段,和你的代码计算结果对比(注意时区要统一)
- 边界情况测试:
- 连续14天上涨:RSI应该接近100
- 连续14天下跌:RSI应该接近0
- 涨跌交替的情况:计算RSI是否符合预期
要是能把你的代码贴出来,我可以帮你更精准地排查问题~
内容的提问来源于stack exchange,提问作者Injector Pca




