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()
输出结果
| 日期 | 开盘价 | 最高价 | 最低价 | 收盘价 | TR1 | TR2 | TR3 |
|---|---|---|---|---|---|---|---|
| 2024-04-01 | 5.9100 | 5.9400 | 5.5500 | 5.5600 | 0.39 | 0.07 | 0.29 |
| 2024-04-02 | 5.2800 | 5.4500 | 5.0900 | 5.3800 | 0.36 | 0.295 | 0.0 |
| 2024-04-03 | 5.2900 | 5.3450 | 5.0500 | 5.0500 | 0.295 | 0.53 | 0.17 |
| 2024-04-04 | 5.1400 | 5.8000 | 5.1000 | 5.2700 | 0.7 | nan | nan |
原脚本
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
相关产品推荐
相关产品推荐

