Python获取本地通达信软件的股票信息(一)
说明
在量化计算中,经常需要取得类似最新的股票代码表等相关的股票信息。虽然可以网络上可以很容易获得这些信息,但当处于离线或网络状况不佳状态时,我们可以从诸如《通达信金融终端》之类的本地数据中获得此类信息。
后面的一系列随笔,都是记录如何从本地通达信软件中取得相关的股票信息。
(一) 读取股票代码
数据文件
一般通达信的股票代码文件,位于"通达信软件的安装目录/T0002/hq_cache/"下。由 shm.tnf 和 szm.tnf 两个文件分别保存沪市和深市的股票代码信息。其中包括了在相应市场上的所有交易产品的代码和名称(股票AB,指数,基金等)。每个文件中的信息条目超过2万。文件格式
数据文件是二进制字节格式,由文件头和数据体构成。
-- 文件头:包含 50 个Byte,其中
[ 0:40] -> 40个Byte,IPv4地址,记录软件最后登陆的行情主站IP地址,不足的字节由"\x00"填充,以"\x01'"结束;
[40:42] -> 2个Byte,端口号;
[42:46] -> 4个Byte,日期(YYYYMMDD);
[46:50] -> 4个Byte,时间(Hmmss);
-- 数据体:每个股票信息记录在 314 个Byte的数据块内,其中
[ 0: 6] -> 6个Byte,股票代码;
[23:41] -> 18个Byte,股票名称,不足的字节由"\x00"填充;
[276:280] -> 4个Byte,昨收盘价;
[285:293] -> 4个Byte,股票名称拼音字头
这个数据块内,其他位置有一些数据,比如 [86:90] 4个Byte不知道是什么含义,[76:78] 2个Byte永远都是"\xcbB",好像是表示 200Byte?之后有数据。
Python 代码
# -*- coding: utf-8 -*-
"""
Created on Sat Apr 2 17:04:16 2022
读取本地通达信股票文件
d:/new_tdx/T0002/hq_cache/shm.tnf,,szm.tnf
:文件头(<40sH2I) 50字节,IP-40字节,端口号-2字节,日期-4字节,时间-4字节
:股票或指数代码 314字节
@author: starleex
"""
import struct
import pandas as pd
def get_stock_name_shm(mkt ='sz'):
file = f'd:/new_tdx/T0002/hq_cache/{mkt}m.tnf'
with open(file,'rb') as f :
buff = f.read()
data = buff[50:]
l = len(data) // 314
fx =lambda x : str(x,encoding='gbk').strip('\x00')
sm = {'sz':('00','30'),'sh':('60','68')}
stocks =[]
for x in [data[i*314 :(i+1)*314] for i in range(l)] :
code = fx(x[:6])
if code.startswith(sm[mkt]) :
name = fx(x[23:41])
lclose =round(struct.unpack('<f',x[276:280])[0],2)
attr = fx(x[285:293])
stocks +=[ [code,name,lclose,attr] ]
data_head = buff[:50]
return data_head,stocks
if __name__ == "__main__":
d,s = get_stock_name_shm()
df = pd.DataFrame(s,columns=['代码','名称','前收盘','简码'])
# hd = struct.unpack('<40sH2I', d)
# print(hd)
Python获取本地通达信软件的股票信息(一)的更多相关文章
- python获取本地时间戳
import time print(time.time())#获当前时间的时间戳 print(time.localtime())#获取本地时间 print(time.strftime('%Y-%m-% ...
- python获取本地时间
python本地时间 import time # 格式化成2016-03-20 11:45:39形式 now = time.strftime("%Y-%m-%d %H:%M:%S" ...
- python获取本地ip地址的方法
#_*_coding:utf8_*_ #以下两种方法可以在ubuntu下或者windows下获得本地的IP地址 import socket # 方法一 localIP = socket.gethost ...
- python 获取本地语言和编码的代码
#! /usr/bin/env python # encoding=utf8 import locale language, encoding = locale.getdefaultlocale() ...
- Python学习笔记(十五)用Python获取本地数据
f1 = open(r'E:\Python\Data\data1.txt') #读取data1.txt文件,使用系统默认缓冲区大小, 为了读取快点,使用缓存吧! f = open(r'E:\Pytho ...
- 在有多个网卡,配置了多个IP的情况下,python 获取本地网卡的主IP
如图所示有多个网卡 本地网卡配置了多个IP class Public_IPOp: @staticmethod def GetLocalIP(): rt = [False] # 根节点 reg_root ...
- Python 获取本地主机信息
import wmi c = wmi.WMI() for sys in c.Win32_OperatingSystem(): #系统信息 print(sys.Caption) #系统版本号 print ...
- python获取本地时间,时间戳与日期格式相互转换
附上代码与运行结果截图: import time # 获取当前时间 now = time.localtime() # 格式化日期 now_ = time.strftime('%Y-%m-%d %H:% ...
- python获取网络时间和本地时间
今天我们来看一下如何用python获取网络时间和本地时间,直接上代码吧,代码中都有注释. python获取网络时间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
- python 获取本机的IP
python 获取本地的IP import socket import fcntl import struct def get_ip_address(ifname): s = socket.socke ...
随机推荐
- es实现规格分组分析
es里面的规格是重复的,页面显示则是不重复
- (原创)odoo14下qweb模板的前端与后端语法区别
1.后端(qweb打包) 后端使用t-inherit 指定继承的模板,使用t-inherit-mode 指定继承的模式,使用xpath定位标记,使用position指定扩展位置. 2.前端 前端仍旧使 ...
- 牛客算法进阶——树形dp
1. 小G有一个大树(求树的重心) 删除该点后最大连通块的节点数最小 设f[x]表示以x为根的子树大小,那么删除x之后的各子树大小为f[to]和n-f[x] 求max(max(f[to]),n-f[x ...
- vue 添加代理
1.跟目录下新建vue.config.js文件,添加内容: module.exports = { assetsDir: 'static', parallel: false, publicP ...
- 解决linux系统中对两个不同的网络连接http访问
项目5G 问题背景:调用网络端的服务器服务,对本地机器人进行控制,以实现机器人应执行的任务. 需求:主机需要访问外网的API,同时在本地局域网与机器人的API进行通信. 问题:要解决HTTP请求发送到 ...
- 实验1task1
<实验结论> #include <stdio.h> #include <stdlib.h> int main() { printf(" O \n&qu ...
- py06
元祖tuple 与列表类似可以存多个值,但是不同的是元祖本身不能被修改 #一:基本使用:tuple# 1 用途:记录多个值,当多个值没有改的需求,此时用元组更合适 # 2 定义方式:在()内用逗号分隔 ...
- 设置cudnn日志
主要分为两个步骤,分别设置两个环境变量. 第一步,设置日志级别. # 三种级别,设置环境变量为1为开启,设置为0关闭. # CUDNN_LOGINFO_DBG # CUDNN_LOGWARN_DBG ...
- 【Quartus系列】实验一: 3-8译码器(原理图输⼊设计)
实验一: 3-8译码器(原理图输⼊设计) ⼀:实验⽬的 1. 了解3-8译码器的电路原理,掌握组合逻辑电路的设计⽅法 2. 掌握QuartusII软件原理图输⼊设计的流程 ⼆:实验内容 2.1设计输⼊ ...
- mysql 创建账号并授权
1.mysql查看所有账号信息 mysql> select user,host from mysql.user; 2.创建账号 mysql> creat user 'glasssix' I ...