基于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
相关产品推荐
相关产品推荐

