You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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())

如何验证你的代码正确性

如果你已经写了代码,可以通过以下步骤验证:

  1. 手动计算对比:取前15天的收盘价,手动计算前14天的平均涨幅、跌幅,然后算出第一个RSI值,和代码输出对比
  2. 和权威工具对比:比如用TradingView、Yahoo Finance上的BTC 14日RSI数据,截取完全一致的时间段,和你的代码计算结果对比(注意时区要统一)
  3. 边界情况测试
    • 连续14天上涨:RSI应该接近100
    • 连续14天下跌:RSI应该接近0
    • 涨跌交替的情况:计算RSI是否符合预期

要是能把你的代码贴出来,我可以帮你更精准地排查问题~

内容的提问来源于stack exchange,提问作者Injector Pca

火山引擎 最新活动