如何在Pandas中为1分钟K线数据计算并添加Relative Volume Ratio指标列
实现Relative Volume Ratio指标计算步骤
1. 依赖安装与数据下载
先确保安装pandas和yfinance,然后下载AAPL的7天1分钟行情数据:
import pandas as pd import yfinance as yf # 下载AAPL 7天1分钟数据 symbol = "AAPL" symbol_df = yf.download(tickers=symbol, period="7d", interval="1m") # 重置索引并保留核心字段 symbol_df = symbol_df.reset_index()[["Datetime", "Volume"]]
2. 数据预处理:拆分日期与时段
将时间戳拆分为日期和精确到分钟的时段,方便后续匹配同一时段的历史数据:
# 提取日期和时分时段 symbol_df["Date"] = symbol_df["Datetime"].dt.date symbol_df["Time"] = symbol_df["Datetime"].dt.time
3. 计算当日截至当前时段的累计成交量
按日期分组,对成交量做累计求和,得到每个时段当日的累计成交量:
# 按日期分组计算累计成交量 symbol_df["Daily_Cum_Volume"] = symbol_df.groupby("Date")["Volume"].cumsum()
4. 计算过去5天同一时段的累计成交量均值
先将历史数据按日期和时段做透视对齐,再对每个时段的历史累计值取滚动5天均值:
# 构建透视表:行=日期,列=时段,值=当日该时段累计成交量 cum_volume_pivot = symbol_df.pivot(index="Date", columns="Time", values="Daily_Cum_Volume") # 对每个时段计算过去5天的滚动均值,min_periods=1避免前期无足够数据时全为空 rolling_mean = cum_volume_pivot.rolling(window=5, min_periods=1).mean() # 转回长格式并与原数据合并 rolling_mean_long = rolling_mean.unstack().reset_index(name="Historic_5d_Avg_Cum_Volume") symbol_df = symbol_df.merge(rolling_mean_long, on=["Date", "Time"], how="left")
5. 计算Relative Volume Ratio
用当日累计成交量除以历史均值得到指标,同时处理除以0的异常情况:
# 计算RVR,替换0值避免报错 symbol_df["Relative_Volume_Ratio"] = symbol_df["Daily_Cum_Volume"] / symbol_df["Historic_5d_Avg_Cum_Volume"].replace(0, pd.NA) # 查看结果示例 print(symbol_df[["Datetime", "Daily_Cum_Volume", "Historic_5d_Avg_Cum_Volume", "Relative_Volume_Ratio"]].head())
关键说明
- 若后续有10天完整数据,只需将
rolling(window=5)改为rolling(window=10)即可适配原需求。 - 拆分
Time时用dt.time保证精确到分钟,确保同一时段的匹配准确性。 - 用
pd.NA标记无效值,避免除以0导致的计算错误。
内容的提问来源于stack exchange,提问作者user23791331
相关产品推荐
相关产品推荐

