首页 > 编程语言 >Python读取通达信本地数据

Python读取通达信本地数据

时间:2022-11-07 20:47:56浏览次数:64  
标签:读取 字节 Python read 通达信 整型 stock unpack struct

一、介绍

python获取股票数据的方法很多,其中 Tushare 财经数据接口包很好用,当然,也可以通过通达信本地的数据获取,这样更为方便。
日线数据存在这路径下 D:\通达信\vipdoc\sh\lday(我的通达信安装目录是D盘)

   
接着我们需要的就是解析这些数据,在分别存为 csv 格式的数据就行了,这样我们可以方便的用 pandas 或其他方法读取和分析。
通达信的日线数据格式如下:

 

  • 每32个字节为一天数据
  • 每4个字节为一个字段,每个字段内低字节在前
  • 00 ~ 03 字节:年月日, 整型
  • 04 ~ 07 字节:开盘价*100, 整型
  • 08 ~ 11 字节:最高价*100, 整型
  • 12 ~ 15 字节:最低价*100, 整型
  • 16 ~ 19 字节:收盘价*100, 整型
  • 20 ~ 23 字节:成交额(元),float型
  • 24 ~ 27 字节:成交量(股),整型
  • 28 ~ 31 字节:(保留)
   

打开一个 .day 的文件,发现是乱码,以二进制格式存储,那么我们只需按照上面存的字节数解析下就可以了。
先读取一天的数据

>>> f = open('D:/通达信/vipdoc/sh/lday/sh000001.day', 'rb')
>>> f.read(32)
b'\xa2\xde2\x01\x14\x9b\x03\x00\x0f\x9d\x03\x00\x8d\x91\x03\x00\xef\x93\x03\x00\xcb\xbc\x14Q\x9a\xfb|\x02-\x01Z\x02'

这应该就是一天的数据了,我们对这个数据进行解析,这里需要用到 struct 模块中的 unpack 方法

>>> import struct
>>> f = open('D:/通达信/vipdoc/sh/lday/sh000001.day', 'rb')
>>> li = f.read(32)
>>> data = struct.unpack('lllllfll', li)
>>> data
(20111010, 236308, 236815, 233869, 234479, 39926411264.0, 41745306, 39452973)
# 分别为日期,开盘,最高,最低,收盘,成交额,成交量,保留值

unpack用法: 前一个参数是格式,'lllllfii' 就是一个浮点数格式(f,这里对应日线数据中的成交额是float格式)和其他整形格式(i,这里对应日线数据中的其他数据是 int 格式)
那么剩下的问题不大了

二、完整代码

在 sh 目录下新建了个 pythondata 文件夹,注意文件路径分隔符是 /

import struct
import datetime


def stock_csv(filepath, name):
    data = []
    with open(filepath, 'rb') as f:
        file_object_path = 'D:/通达信/vipdoc/sh/pythondata/' + 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字节 如20091229
            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.0)+","+str(stock_low[0]/100.0)+","+str(stock_close[0]/100.0)+","+str(stock_vol[0])+"\r\n"
            file_object.writelines(list)
        file_object.close()

stock_csv('D:/通达信/vipdoc/sh/lday/sh000001.day', '1')

运行下,打开 1.CSV 文件


   

OK

三、批量解析

import os
import struct
import datetime


def stock_csv(filepath, name):
    data = []
    with open(filepath, 'rb') as f:
        file_object_path = 'D:/通达信/vipdoc/sh/pythondata/' + 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字节 如20091229
            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.0)+","+str(stock_low[0]/100.0)+","+str(stock_close[0]/100.0)+","+str(stock_vol[0])+"\r\n"
            file_object.writelines(list)
        file_object.close()


path = 'D:/通达信/vipdoc/sh/lday/'
listfile = os.listdir('D:/通达信/vipdoc/sh/lday/')
for i in listfile:
    stock_csv(path+i, i[:-4])

运行下


   

完美

作者:广大群众
链接:https://www.jianshu.com/p/9dd3ef74fe96
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。  

补充


一、通达信日线*.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, 整型


二、通达信5分钟线*.5文件
    每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 字节:(保留)

标签:读取,字节,Python,read,通达信,整型,stock,unpack,struct
From: https://www.cnblogs.com/yuyanc/p/16867362.html

相关文章

  • Python 爬虫之Beautiful Soup
    网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、......
  • python 正则表达式各种符号代表意义
    表达式全集字符描述\将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行......
  • 进入python的世界_day28_python基础—— 面向对象三大特性之封装、多态、反射
    一、要学会看源码了(略微)1.举例​ 比如说以前学的json,虽然知道是可以把字典转为json格式的数据,但是当时的字典K、V都是可以被转的类型,如果V不是json支持转的格式,转换时......
  • 【python】机器学习算法(KNN)入门——手写数字识别
    前言嗨喽~大家好呀,这里是魔王呐!最近邻(kNearestNeighbors,KNN)算法是一种分类算法1968年由Cover和Hart提出,应用场景有宁符识别、文本分类、图像识别等领域。手......
  • Python Ujson
    UJson主要记录其安装方式,能使用pipinstallujson进行安装不过好像有点慢,反正我等了很久,也可以使用Python命令进行安装会快一点,命令如下:python-mpipinstallujson ......
  • Python基础之面向对象:5、三大特征-多态
    面对对象之多态目录面对对象之多态一、多态1、多态的概念2、多态的实际应用1、自我约束2、abc模块一、多态1、多态的概念​ 多态在实际应用时较为抽象,指事物的多种形态......
  • Python基础之面向对象:6、三大特征-封装
    面向对象之封装目录面向对象之封装一、封装1、封装的概念2、为什么要封装3、封装的两个层面二、隐藏与调用的方法1、隐藏的方法2、调用与修改的方法三、伪装1、伪装的概念......
  • Python基础之面向对象:7、反射
    面向对象之反射目录面向对象之反射一、反射1、反射的定义2、使用的场景3、常用方法1.hasattr()2.getattr()3.setattr()4.delattr()4、反射的实际应用一、反射1、反射的......
  • Python ipython工具包
    ipython提供了丰富的工具包,用于建立Python的交互式操作,或许有用,在此处做一个标记!!!目前知道比较好用的就是支持magic函数,比如:%time这些,如果没有安装这个包,%会被视为错误语......
  • Python基础之面向对象:4、super方法实战
    派生方法实战​ 以上我们学习了通过super()的方法可以重写父类、额外添加父类中的数据,下面将通过实战案例来讲述super()方法来重写、添加父类中的功能代码需求:1、使用js......