You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TR指标计算异常:首日TR2/TR3未显示NaN及数据范围疑问

调试TR指标计算异常问题

问题背景

数据起始日期为2024-03-27,该日期无前置交易日数据,按照TR指标逻辑,TR2和TR3应返回NaN,但实际输出了有效数值。要求严格基于当前展示的日期区间完成指标计算。

初步排查

  • 验证shift(-1)函数逻辑,计算结果符合预期,排除函数使用错误
  • 怀疑AlphaVantage API返回的数据超出了设定的4天范围,导致起始日期仍能获取到前置数据,进而使TR2、TR3计算出有效值

修改后的calculate_tr函数

def calculate_tr(df):
    high_shifted, close_shifted, low_shifted = (
        df["High"].shift(),
        df["Close"].shift(),
        df["Low"].shift(),
    )

    df["tr1"] = df["High"] - df["Low"]
    df["tr2"] = (high_shifted - close_shifted).abs()
    df["tr3"] = (low_shifted - close_shifted).abs()

输出结果

日期开盘价最高价最低价收盘价TR1TR2TR3
2024-04-015.91005.94005.55005.56000.390.070.29
2024-04-025.28005.45005.09005.38000.360.2950.0
2024-04-035.29005.34505.05005.05000.2950.530.17
2024-04-045.14005.80005.10005.27000.7nannan

原脚本

import requests
import pandas as pd
from datetime import datetime, timedelta
import time


# 计算每日历史数据的起止日期
end_date_daily = datetime.now().strftime('%Y-%m-%d')
start_date_daily = (datetime.now() - timedelta(days=4)).strftime('%Y-%m-%d')

# 构建每日历史数据的API请求URL
api_url_daily = f'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol={symbol}&apikey={API_KEY}&datatype=json&start_date={start_date_daily}&end_date={end_date_daily}'

# 获取并处理每日历史价格数据
response_daily = requests.get(api_url_daily)

if response_daily.status_code == 200:
    historical_data_daily = response_daily.json()['Time Series (Daily)']

    # 将每日历史数据转换为DataFrame
    df_daily = pd.DataFrame(historical_data_daily).T
    df_daily.index = pd.to_datetime(df_daily.index)

    # 反转DataFrame,使最早数据位于顶部
    df_daily = df_daily.sort_index(ascending=False)

    # 转换列类型为浮点型
    df_daily['High'] = df_daily['2. high'].astype(float)
    df_daily['Low'] = df_daily['3. low'].astype(float)
    df_daily['Close'] = df_daily['4. close'].astype(float)


    # 计算tr1、tr2、tr3的函数
    def calculate_tr(df):
        df['tr1'] = df['High'] - df['Low']
        df['tr2'] = abs(df['High'] - df['Close'].shift(-1))
        df['tr3'] = abs(df['Low'] - df['Close'].shift(-1))

    # 计算tr1、tr2、tr3
    calculate_tr(df_daily)

    # 输出计算后的DataFrame
    print("\n计算tr1、tr2、tr3后的DataFrame:")
    print("日期       开盘价  最高价  最低价  收盘价  TR1  TR2  TR3")
    for date in reversed(df_daily.head(4).index):
        row = df_daily.loc[date]
        tr1_rounded = round(row['tr1'], 4)
        tr2_rounded = round(row['tr2'], 4)
        tr3_rounded = round(row['tr3'], 4)
        print(f"{date.strftime('%Y-%m-%d')} {row['1. open']} {row['2. high']} {row['3. low']} {row['4. close']} {round(tr1_rounded, 3)} {round(tr2_rounded, 3)} {round(tr3_rounded, 3)}")

内容的提问来源于stack exchange,提问作者bob mcgee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 10:20:56