OHLC无Volume列的计算方法及代码修正咨询
OHLC成交量计算问题及解决
问题描述
OHLC全称是Open(开盘价)、High(最高价)、Low(最低价)、Close(收盘价)。现有OHLC数据缺少Volume(成交量)列,尝试用Jupyter Notebook编写代码计算,但运行后Volume列全为0,原代码如下:
import pandas as pd # 原代码遗漏pandas导入,补充完整 ohlc_data = { 'DateTime': ['2023-10-05 08:31:00', '2023-10-05 08:32:00', '2023-10-05 08:33:00', '2023-10-05 08:34:00', '2023-10-05 08:35:00'], 'Open': [0.5945, 0.59445, 0.59427, 0.59427, 0.59439], 'High': [0.5945, 0.59448, 0.59433, 0.59445, 0.59452], 'Low': [0.5945, 0.5943, 0.59423, 0.59425, 0.59435], 'Close': [0.5944, 0.5943, 0.5943, 0.5944, 0.59448], } ohlc_data = pd.DataFrame(ohlc_data) ohlc_data Vol = pd.DataFrame(ohlc_data,columns = ['Volume']) Volume = pd.concat([ohlc_data,Vol],axis = 1) Volume = Volume.set_index('DateTime') Volume.index = pd.to_datetime(Volume.index, format='%Y-%m-%d %H:%M:%S', utc=True) Volume.Volume = Volume.Volume.resample('1T').sum() Volume
原代码错误分析
- Volume列初始化无效:创建
Vol时,原ohlc_data中不存在Volume列,生成的Vol是全NaN的DataFrame,拼接后Volume列全为缺失值。 - 重采样逻辑无意义:原数据本身就是1分钟频率(每行对应1分钟),用
resample('1T').sum()重采样不会改变数据,且直接赋值会引发索引对齐问题,最终显示为0或NaN。
关键说明
仅靠OHLC四价无法计算真实成交量——成交量是市场中实际发生的交易数量,必须依赖逐笔交易数据(tick数据)或分笔成交数据,通过汇总对应时间区间内的成交量得到。如果没有这类原始数据,只能生成模拟值,无法得到真实成交量。
正确实现代码
场景1:有逐笔交易数据,汇总为1分钟Volume
假设你有逐笔交易数据tick_data,包含每笔交易的时间和成交量,可按以下代码汇总为1分钟级别的OHLC+Volume:
import pandas as pd # 模拟逐笔交易数据 tick_data = pd.DataFrame({ 'DateTime': [ '2023-10-05 08:31:02', '2023-10-05 08:31:15', '2023-10-05 08:31:40', '2023-10-05 08:32:05', '2023-10-05 08:32:22', '2023-10-05 08:33:10', '2023-10-05 08:33:35', '2023-10-05 08:34:08', '2023-10-05 08:34:20', '2023-10-05 08:34:50', '2023-10-05 08:35:12' ], 'Price': [ 0.5945, 0.59445, 0.5944, 0.59445, 0.5943, 0.59427, 0.5943, 0.59427, 0.59435, 0.5944, 0.59448 ], 'Volume': [100, 200, 150, 300, 250, 180, 220, 100, 150, 200, 280] }) # 转换时间索引 tick_data['DateTime'] = pd.to_datetime(tick_data['DateTime'], utc=True) tick_data = tick_data.set_index('DateTime') # 重采样为1分钟OHLC+Volume ohlc_with_volume = tick_data.resample('1T').agg({ 'Price': ['first', 'max', 'min', 'last'], 'Volume': 'sum' }) # 重命名列 ohlc_with_volume.columns = ['Open', 'High', 'Low', 'Close', 'Volume'] ohlc_with_volume.reset_index(inplace=True) print(ohlc_with_volume)
场景2:无原始交易数据,生成模拟Volume(仅作演示,非真实数据)
如果没有逐笔数据,可基于价格波动模拟成交量,比如用当日价格波动幅度乘以固定系数:
import pandas as pd ohlc_data = { 'DateTime': ['2023-10-05 08:31:00', '2023-10-05 08:32:00', '2023-10-05 08:33:00', '2023-10-05 08:34:00', '2023-10-05 08:35:00'], 'Open': [0.5945, 0.59445, 0.59427, 0.59427, 0.59439], 'High': [0.5945, 0.59448, 0.59433, 0.59445, 0.59452], 'Low': [0.5945, 0.5943, 0.59423, 0.59425, 0.59435], 'Close': [0.5944, 0.5943, 0.5943, 0.5944, 0.59448], } ohlc_df = pd.DataFrame(ohlc_data) ohlc_df['DateTime'] = pd.to_datetime(ohlc_df['DateTime'], utc=True) # 基于价格波动幅度模拟成交量(示例系数为1e6,可自行调整) ohlc_df['Volume'] = (ohlc_df['High'] - ohlc_df['Low']) * 1_000_000 ohlc_df['Volume'] = ohlc_df['Volume'].round().astype(int) print(ohlc_df)
内容的提问来源于stack exchange,提问作者vikr6001
相关产品推荐
相关产品推荐

