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

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

原代码错误分析

  1. Volume列初始化无效:创建Vol时,原ohlc_data中不存在Volume列,生成的Vol是全NaN的DataFrame,拼接后Volume列全为缺失值。
  2. 重采样逻辑无意义:原数据本身就是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:08:24