Python将不规则股票分钟数据转换为5/15分钟OHLC数据的实现方案
实现思路及代码示例
第一步:预处理原始数据
- 按
SYMBOL和DATE字段去重,同一只股票同一时间的重复数据仅保留第一条即可 - 将
DATE字段转换为datetime类型,CLOSE、VOLUME转换为数值类型 - 按
SYMBOL、DATE升序排序,保证数据时间顺序正确
第二步:时间窗口对齐
根据你需要的粒度(5分钟/15分钟),将每条数据的时间向下取整到所属的时间窗口节点,例如13:11:49属于5分钟粒度的13:10:00窗口、15分钟粒度的13:00:00窗口。
注意:因为你的VOLUME是累计成交量,不能直接分组求和,需要用窗口结束时的累计值减去窗口开始前的累计值,才能得到当前窗口的实际成交量
第三步:分组计算OHLC指标
每个时间窗口内按如下规则计算指标:
- OPEN:窗口内第一条数据的CLOSE值
- HIGH:窗口内所有CLOSE的最大值
- LOW:窗口内所有CLOSE的最小值
- CLOSE:窗口内最后一条数据的CLOSE值
- VOLUME:窗口最后一条的VOLUME 减去 窗口第一条数据的上一条数据的VOLUME(若窗口是首段无前置数据,差值直接填0即可)
如果需要补全无数据的空窗口,可以选择用前一个窗口的CLOSE填充OHLC四值,VOLUME填0即可。
Python实现代码(基于Pandas)
import pandas as pd # 读取原始数据,你也可以根据自己的数据来源调整读取逻辑 df = pd.read_csv("你的数据文件路径.csv", sep="\s+") # 你的样例数据是空格分隔,所以用sep="\s+"匹配 # 预处理 df["DATE"] = pd.to_datetime(df["DATE"]) df = df.drop_duplicates(subset=["SYMBOL", "DATE"], keep="first") df = df.sort_values(by=["SYMBOL", "DATE"]).reset_index(drop=True) def calc_ohlc(df, time_freq): """ 计算指定粒度的OHLC数据 :param df: 预处理后的原始数据 :param time_freq: 时间粒度,5分钟传'5T',15分钟传'15T' :return: 对应粒度的OHLC数据 """ # 生成所属时间窗口标签 df["time_window"] = df["DATE"].dt.floor(time_freq) # 提前计算每条数据的上一条累计成交量 df["pre_volume"] = df.groupby("SYMBOL")["VOLUME"].shift(1) # 按股票+时间窗口分组聚合 ohlc_df = df.groupby(["SYMBOL", "time_window"], as_index=False).agg( OPEN=("CLOSE", "first"), HIGH=("CLOSE", "max"), LOW=("CLOSE", "min"), CLOSE=("CLOSE", "last"), start_pre_vol=("pre_volume", "first"), end_vol=("VOLUME", "last") ) # 计算窗口内实际成交量 ohlc_df["VOLUME"] = (ohlc_df["end_vol"] - ohlc_df["start_pre_vol"]).fillna(0) # 剔除临时计算列 ohlc_df = ohlc_df.drop(columns=["start_pre_vol", "end_vol"]) return ohlc_df # 生成5分钟OHLC ohlc_5min = calc_ohlc(df, "5T") # 生成15分钟OHLC ohlc_15min = calc_ohlc(df, "15T")
内容的提问来源于stack exchange,提问作者FCTURKEY
相关产品推荐
相关产品推荐

