Python读取通达信日线数据(.day文件)

Python读取通达信日线数据(.day文件)

  • 1. day文件位置
  • 2. day文件内容的构成
  • 3. Python代码识别day文件
  • 4. 将识别结果输出为csv文件
  • 5. 最终结果展示
  • 在金融数据分析中,通达信软件提供的数据文件(如日线数据文件 .day)是非常宝贵的资源。本文将详细介绍如何使用Python读取和解析这些文件,并将解析结果输出为CSV文件,以便进行进一步的数据分析和处理。

    1. day文件位置

    通达信日线数据文件(.day文件)通常存储在通达信软件的安装目录下的vipdoc文件夹中。具体路径如下:
    上海证券交易所的日线数据:
    路径:[安装目录]\vipdoc\sh\lday
    示例:C:\new_tdx\vipdoc\sh\lday
    深圳证券交易所的日线数据:
    路径:[安装目录]\vipdoc\sz\lday
    示例:C:\new_tdx\vipdoc\sz\lday
    每个股票的日线数据文件名称格式为[市场代码][股票代码].day,例如,上证股票代码为600000的日线数据文件为sh600000.day,深证股票代码为000001的日线数据文件为sz000001.day

    2. day文件内容的构成

    通达信的日线数据文件(.day文件)是一种二进制文件,每条记录包含32字节的数据。每条记录的格式如下:

  • 日期(4字节,整数),格式YYYYMMDD
  • 开盘价(4字节,浮点数),需要除以100
  • 最高价(4字节,浮点数),需要除以100
  • 最低价(4字节,浮点数),需要除以100
  • 收盘价(4字节,浮点数),需要除以100
  • 成交额(4字节,整数)
  • 成交量(4字节,浮点数),需要除以100
  • 保留字段(4字节,整数)
  • 3. Python代码识别day文件

    以下是一个完整的Python脚本,用于读取和解析通达信的日线数据文件(.day文件):

    import struct
    from datetime import datetime
    
    def read_day_file(file_path):
        """
        读取日线文件并解析数据。
    
        参数:
        file_path (str): 日线文件的路径。
    
        返回值:
        tuple: 包含两个元素,第一个元素是解析后的数据列表,第二个元素是列名列表。
        """
        # 使用with语句打开文件,确保文件在读取后正确关闭
        with open(file_path, "rb") as ofile:
            # 读取文件内容
            buf = ofile.read()
    
        # 计算文件中记录的数量
        num_records = len(buf) // 32
        # 初始化数据列表和列名列表
        items = []
        cols = ["date", "open", "high", "low", "close", "amount", "vol"]
    
        # 遍历每条记录
        for i in range(num_records):
            # 计算当前记录的起始和结束位置
            b = i * 32
            e = b + 32
            # 解析当前记录的数据
            a = struct.unpack("IIIIIfII", buf[b:e])
    
            # 将整数日期转换为字符串格式
            date_int = a[0]
            date_str = datetime.strptime(str(date_int), "%Y%m%d").strftime("%Y-%m-%d")
    
            # 解析开盘价、最高价、最低价、收盘价等数据,并四舍五入保留两位小数
            _open = round(a[1] / 100.0, 2)
            _high = round(a[2] / 100.0, 2)
            _low = round(a[3] / 100.0, 2)
            _close = round(a[4] / 100.0, 2)
            _amount = a[5]
            _vol = a[6] / 100.0
    
            # 构建当前记录的数据字典
            item = {
                cols[0]: date_str,  # 日期
                cols[1]: str(_open),  # 开盘价
                cols[2]: str(_high),  # 最高价
                cols[3]: str(_low),  # 最低价
                cols[4]: str(_close),  # 收盘价
                cols[5]: str(_amount),  # 成交额
                cols[6]: str(_vol),  # 成交量
            }
            # 将当前记录的数据字典添加到数据列表中
            items.append(item)
    
        # 返回解析后的数据列表和列名列表
        return items, cols
    

    4. 将识别结果输出为csv文件

    解析完day文件后,我们可以将结果输出为csv文件,以便进行进一步的数据分析和处理。以下是一个将解析结果写入csv文件的函数:

    def write_to_csv(kline_data, cols, csv_file_path):
    	import csv
        # 打开CSV文件并写入数据
        with open(csv_file_path, "w", newline="") as csvfile:
            writer = csv.DictWriter(csvfile, fieldnames=cols)
            writer.writeheader()
            for kline in kline_data:
                writer.writerow(kline)
    

    5. 最终结果展示

    运行上述代码后,你将得到一个包含日线数据的csv文件。以下是一个示例输出(002354):

    date,open,high,low,close,amount,vol
    2025-01-13,5.7,5.96,5.43,5.6,1488412032.0,2638310.33
    2025-01-14,5.7,6.16,5.61,6.15,2165473792.0,3654233.28
    2025-01-15,6.2,6.77,6.12,6.55,2810684416.0,4333975.68
    2025-01-16,6.68,6.69,6.2,6.47,2689251840.0,4163141.44
    2025-01-17,6.26,6.3,5.98,6.01,1717530240.0,2810773.76
    ...
    

    作者:逝去的紫枫

    物联沃分享整理
    物联沃-IOTWORD物联网 » Python读取通达信日线数据(.day文件)

    发表回复