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

基于1分钟时间框架计算5日ADR与TradingView结果不符的问题

解决1分钟K线计算过去5天ADR与TradingView不一致的问题

问题根源

直接用固定数量的K线索引(比如[-390:])截取数据的方式不可靠,因为:

  • 不同交易日的交易分钟数可能不同(如包含盘前/盘后交易、节假日休市等)
  • 固定索引无法精准对应“过去5个自然日”的时间范围,导致数据截取偏差,最终计算结果和TradingView不一致。

解决方案

方案1:按你给定公式计算(过去5天内的最高-最低)

利用时间索引精准筛选过去5天的1分钟数据,再计算该区间的最高值和最低值:

from backtesting import Backtest, Strategy
import pandas as pd
from datetime import timedelta

def getADR(highs, lows):
    return highs.max() - lows.min()

class MyStrategy(Strategy):
    def init(self):
        pass
    
    def next(self):
        # 获取当前Bar的时间
        current_time = self.data.index[-1]
        # 计算5天前的时间点
        five_days_ago = current_time - timedelta(days=5)
        
        # 筛选过去5天内的所有1分钟数据
        mask = (self.data.index >= five_days_ago) & (self.data.index <= current_time)
        past_5d_highs = self.data.High[mask]
        past_5d_lows = self.data.Low[mask]
        
        # 计算ADR
        adr = getADR(past_5d_highs, past_5d_lows)
        # 可根据需求打印或使用ADR值
        # print(f"当前时间: {current_time}, 过去5天ADR: {adr}")

df = pd.read_csv('AAPL_Stock1m.csv', index_col='Timestamp', parse_dates=True)
# 确保索引是已排序的DatetimeIndex
df = df.sort_index()
bt = Backtest(df, MyStrategy, cash=50000)
print(bt.run())

方案2:计算标准ADR(平均日波幅,TradingView常用定义)

如果TradingView中你参考的ADR是过去N天的日波幅平均值(日波幅=当日最高-当日最低),需要先将1分钟数据聚合为日线数据,再计算平均值:

from backtesting import Backtest, Strategy
import pandas as pd

# 将1分钟数据转换为日线数据
def resample_to_daily(df):
    daily_df = df.resample('D').agg({
        'High': 'max',
        'Low': 'min',
        'Open': 'first',
        'Close': 'last',
        'Volume': 'sum'
    }).dropna()  # 删除无交易的日期
    return daily_df

# 计算标准ADR:过去5天日波幅的平均值
def get_standard_ADR(daily_highs, daily_lows, window=5):
    daily_ranges = daily_highs - daily_lows
    return daily_ranges.rolling(window=window).mean().iloc[-1]

class MyStrategy(Strategy):
    def init(self):
        # 初始化时转换日线数据
        self.daily_data = resample_to_daily(self.data.df)
    
    def next(self):
        # 确保当前时间对应的日线数据已更新
        current_date = self.data.index[-1].date()
        # 筛选到当前日期为止的过去5天日线数据
        recent_daily = self.daily_data[self.daily_data.index <= current_date].tail(5)
        
        if len(recent_daily) >=5:
            adr = get_standard_ADR(recent_daily['High'], recent_daily['Low'])
            # 可根据需求打印或使用ADR值
            # print(f"当前日期: {current_date}, 过去5天标准ADR: {adr}")

df = pd.read_csv('AAPL_Stock1m.csv', index_col='Timestamp', parse_dates=True)
df = df.sort_index()
bt = Backtest(df, MyStrategy, cash=50000)
print(bt.run())

关键注意事项

  • 确保你的1分钟数据索引是已排序的DatetimeIndex,否则时间筛选会出错
  • 若TradingView的ADR包含盘前/盘后数据,需确保你的1分钟数据也包含对应时段,保持数据范围一致
  • 标准ADR的计算可能会排除无交易的日期,需根据TradingView的规则调整日线聚合逻辑

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 21:31:15