Python中如何读取大智慧6.0日线文件进行练手

https://github.com/chuchiring/stock
默认前复权支持全部倒出为 csv 供机器学习

写的不好的地方请指教
Python中如何读取大智慧6.0日线文件进行练手

9 回复

有没有可以读取 /计算复权价格的?


要读取大智慧6.0的日线文件,你得先了解它的二进制格式。大智慧的数据文件通常以.day为后缀,结构比较固定。

每个.day文件包含多条日线记录,每条记录通常是32字节:

  • 日期(4字节,可能是整数格式如YYYYMMDD)
  • 开盘价(4字节,通常是float或整数)
  • 最高价(4字节)
  • 最低价(4字节)
  • 收盘价(4字节)
  • 成交量(4字节,可能是整数)
  • 成交额(4字节,可能是float或整数)
  • 保留字段(4字节)

下面是一个简单的读取示例:

import struct
import pandas as pd
from datetime import datetime

def read_dzh_day_file(filepath):
    """读取大智慧日线文件"""
    records = []
    
    with open(filepath, 'rb') as f:
        while True:
            # 读取32字节的一条记录
            data = f.read(32)
            if not data or len(data) < 32:
                break
                
            # 解析二进制数据
            # 注意:大智慧的数据可能是小端或大端字节序,这里假设是小端
            # 你可能需要根据实际数据调整格式字符串
            try:
                # 尝试解析日期为整数格式(如20231215)
                date_int = struct.unpack('<I', data[0:4])[0]
                
                # 将整数日期转换为datetime
                # 注意:这里假设日期格式是YYYYMMDD
                year = date_int // 10000
                month = (date_int % 10000) // 100
                day = date_int % 100
                date = datetime(year, month, day)
                
                # 解析价格数据(假设是float类型)
                open_price = struct.unpack('<f', data[4:8])[0]
                high = struct.unpack('<f', data[8:12])[0]
                low = struct.unpack('<f', data[12:16])[0]
                close = struct.unpack('<f', data[16:20])[0]
                
                # 成交量和成交额
                volume = struct.unpack('<I', data[20:24])[0]  # 假设是无符号整数
                amount = struct.unpack('<f', data[24:28])[0]  # 假设是float
                
                records.append({
                    'date': date,
                    'open': open_price,
                    'high': high,
                    'low': low,
                    'close': close,
                    'volume': volume,
                    'amount': amount
                })
                
            except struct.error as e:
                print(f"解析错误: {e}")
                break
    
    # 转换为DataFrame
    df = pd.DataFrame(records)
    if not df.empty:
        df.set_index('date', inplace=True)
        df.sort_index(inplace=True)
    
    return df

# 使用示例
if __name__ == "__main__":
    # 替换为你的文件路径
    file_path = "SH600000.day"  # 示例文件名
    
    try:
        df = read_dzh_day_file(file_path)
        print(f"成功读取 {len(df)} 条记录")
        print(df.head())
    except FileNotFoundError:
        print(f"文件不存在: {file_path}")
    except Exception as e:
        print(f"读取失败: {e}")

几个关键点:

  1. 字节序问题:大智慧数据可能是小端(<)或大端(>),如果上面的代码解析出来的数据不对,试试把格式字符串里的<换成>
  2. 数据类型:价格可能是float,也可能是整数(比如乘以1000),需要根据实际情况调整。
  3. 日期格式:也可能是其他格式,比如从某个起始日期的天数偏移。

调试建议: 先用hex编辑器(如HxD)打开文件,看看前几条记录的实际二进制数据,确认具体的格式。

如果这个基础版本不工作,你可能需要根据实际的文件格式调整解析逻辑。有些大智慧文件可能有不同的版本或自定义格式。

一句话总结:先确认文件的具体二进制格式,再调整解析代码。

我代码里面就是读取原始价格和权息信息进行了前复权的

默认就是前复权?默认应该是原始数据好一点吧
如果默认价格复权,量不复权的话,会有问题的
最好是原始价格 & 复权价格或复权参数

从操盘来说,复权成交量没意义,更应该关注的是换手率吧


机器分析就有意义了



在 dataprovider_dzh 里面,找到

xr_daylines.append(StockDayLine(dayline.date,
round(dayline.open * price_factor + 0.001,2),
round(dayline.high * price_factor + 0.001,2),
round(dayline.low * price_factor + 0.001,2),
round(dayline.close * price_factor + 0.001,2),
dayline.vol, dayline.amount))

dayline.vol 改成 round(dayline.vol * price_factor,0) 即可

学习

回到顶部