使用Python解析通达信本地lday数据结构

通达信软件中的vipdoc是一个存储股票行情数据的文件夹。在通达信软件的安装目录下,可以找到一个名为vipdoc的文件夹,里面存放着各个股票的分时、日线、周线、月线等行情数据文件。这些数据文件可以用于自定义分析和回测股票的走势和交易策略,前提要把加密的数据解析出来,才能调用,解析方法如下使用Python解析。

数据存放的位置,bj代表北交所,sh代表上海,sz代表深圳的股票

在这里插入图片描述
看日线就在通达信lday文件夹目录下去找,E:\zd_cjzq\vipdoc\sh\lday
在这里插入图片描述

{龙虎榜小红牛系统,官方微信公众号:GXZFP888}

#更多教程可以关住,我的Python教程官方微信公众号:wdPython

#01.通达信日线*.day文件的结构

文件名即股票代码,每32个字节为一个数据,其中每4个字节为一个字段,每个字段内低字节在前。

00 ~ 03 字节:年月日, 整型

04 ~ 07 字节:开盘价*1000, 整型

08 ~ 11 字节:最高价*1000,  整型

12 ~ 15 字节:最低价*1000,  整型

16 ~ 19 字节:收盘价*1000,  整型

20 ~ 23 字节:成交额(元),float型

24 ~ 27 字节:成交量(手),整型

28 ~ 31 字节:上日收盘*1000, 整型

#02.通达信5分钟线*.5数据结构:minline 文件夹:包含了股票和期货的分钟线数据文件,以 .lc1 扩展名结尾。每32个字节为一个5分钟数据,每字段内低字节在前。

00 ~ 01 字节:日期,整型,设其值为num,则日期计算方法为:

              year=floor(num/2048)+2004;

              month=floor(mod(num,2048)/100);

              day=mod(mod(num,2048),100);

02 ~ 03 字节:从0点开始至目前的分钟数,整型

04 ~ 07 字节:开盘价(分),整型

08 ~ 11 字节:最高价(分),整型

12 ~ 15 字节:最低价(分),整型

16 ~ 19 字节:收盘价(分),整型

20 ~ 23 字节:成交额(元),float型

24 ~ 27 字节:成交量(股)

28 ~ 31 字节:保留,一般都是0

以下是解析贵州茅台后的图片
在这里插入图片描述
600519csv数据文件在这里插入图片描述

import struct
import datetime
import os
# 1.新建一个文件夹,用于存放解析好的股票数据
os.makedirs('股票数据',exist_ok=True)

#区分沪深,北交所股票,找到对应股票的文件位置
def hs_stock(code):
    if code[0] == "6":
        str_code='sh/lday/sh' + code
    if code[0] == "3":
        str_code='sz/lday/sz'  + code
    if code[0] == "8" or code[0] == "4":
        str_code='bj/lday/bj' + code

    return str_code


#2.解析通达信日线数据
#F:\new_tdx\
def stock_csv(filepath,code,name):
    data = []
    filepath=filepath+hs_stock(code)+'.day'
    with open(filepath, 'rb') as f:
        file_object_path = '股票数据/' + name +'.csv'
        file_object = open(file_object_path, 'w+')
        while True:
            stock_date = f.read(4)
            stock_open = f.read(4)
            stock_high = f.read(4)
            stock_low= f.read(4)
            stock_close = f.read(4)
            stock_amount = f.read(4)
            stock_vol = f.read(4)
            stock_reservation = f.read(4)

            # date,open,high,low,close,amount,vol,reservation

            if not stock_date:
                break
            stock_date = struct.unpack("l", stock_date)     # 4字节 如20230812
            stock_open = struct.unpack("l", stock_open)     #开盘价*100
            stock_high = struct.unpack("l", stock_high)     #最高价*100
            stock_low= struct.unpack("l", stock_low)        #最低价*100
            stock_close = struct.unpack("l", stock_close)   #收盘价*100
            stock_amount = struct.unpack("f", stock_amount) #成交额
            stock_vol = struct.unpack("l", stock_vol)       #成交量
            stock_reservation = struct.unpack("l", stock_reservation) #保留值

            date_format = datetime.datetime.strptime(str(stock_date[0]),'%Y%M%d') #格式化日期
            list= date_format.strftime('%Y-%M-%d')+","+str(stock_open[0]/100)+","+str(stock_high[0]/100)+","+str(stock_low[0]/100)+","+str(stock_close[0]/100)+","+str(stock_vol[0]/100)+"\r"
            file_object.writelines(list)
        file_object.close()

        print(code+'股票数据解析完成!!')

stock_csv('E:/zd_cjzq/vipdoc/','600519', '贵州茅台')
### 如何使用 Python 读取通达信的日线数据 要实现通过 Python通达信获取日线数据的功能,可以按照以下方式操作。具体来说,可以通过解析通达信 `.day` 文件来提取其中的数据,并将其转化为 CSV 格式的文件以便后续处理。 #### 数据路径与结构说明 通达信的日线数据通常位于其安装目录下的 `vipdoc/sh/lday` 或者 `vipdoc/sz/lday` 路径下。这些文件是以二进制形式存储的 `.day` 文件,每条记录占用固定长度(32字节)。以下是各字段的具体含义: - **第0~3字节**:日期 (整数),表示为 YYYYMMDD 的格式。 - **第4~7字节**:开盘价 * 100 (整数)。 - **第8~11字节**:最高价 * 100 (整数)。 - **第12~15字节**:最低价 * 100 (整数)。 - **第16~19字节**:收盘价 * 100 (整数)。 - **第20~23字节**:成交金额 (单位:元,浮点型)。 - **第24~27字节**:成交量 (单位:股,整数)。 - **第28~31字节**:保留字段 (暂无实际意义)[^2]。 #### 解析逻辑 为了能够正确读取和解析这些数据,需要借助 Python 中的 `struct` 模块来进行二进制解码。下面是一个完整的代码示例,展示如何逐条读取 `.day` 文件的内容并将它们写入到 CSV 文件中。 ```python import os import struct import pandas as pd def parse_day_file(file_path): """解析单个 .day 文件""" records = [] with open(file_path, 'rb') as f: while True: buf = f.read(32) if not buf or len(buf) != 32: break # 使用 unpack 函数按指定格式拆分数据 a = struct.unpack('iiiiifii', buf) year_month_day = str(a[0]) date_str = '{}-{}-{}'.format(year_month_day[:4], year_month_day[4:6], year_month_day[6:]) open_price = round(a[1] / 100.0, 2) high_price = round(a[2] / 100.0, 2) low_price = round(a[3] / 100.0, 2) close_price = round(a[4] / 100.0, 2) amount = a[5] volume = a[6] record = { 'date': date_str, 'open': open_price, 'high': high_price, 'low': low_price, 'close': close_price, 'amount': amount, 'volume': volume } records.append(record) return records def save_to_csv(records, output_path): """将解析后的数据保存至 csv 文件""" df = pd.DataFrame(records) df.to_csv(output_path, index=False) # 主程序入口 if __name__ == '__main__': tdx_data_dir = r'C:\new_tdx\vipdoc' stock_code = 'sh600000' # 替换为目标股票代码 day_file_path = os.path.join(tdx_data_dir, stock_code[:2], 'lday', f'{stock_code}.day') parsed_records = parse_day_file(day_file_path) save_to_csv(parsed_records, './output.csv') ``` 此脚本实现了两个主要功能: 1. 定义了一个函数用于解析单一 `.day` 文件中的所有 K 线数据; 2. 将解析得到的结果存放到 Pandas DataFrame 对象中,并最终导出成标准的 CSV 文件[^3]。 ### 注意事项 当执行以上过程之前,请确保已经成功下载目标时间段内的全部历史行情数据,并确认对应的 `.day` 文件确实存在于预期位置之中。如果某些特定日子缺少相应记录,则可能是因为当天并未发生任何交易活动所致[^1]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值