Python开发股票量化系统 - 读通达信的股票信息和历史数据

Python开发股票量化系统 - 读通达信的股票信息和历史数据,第1张


四、 再次读取股票信息

  • 1. 再次选择数据源
  • 2. 读取股票信息
    • 2.1 读取股票基本信息
    • 2.2 读取股票股本信息
  • 3. 读取股票历史数据
    • 3.1 通达信的日线数据格式
    • 3.2 历史数据入库
  • 4. 总结

1. 再次选择数据源

汲取教训,新的数据源必须有如下要求:

  • 必须是股票软件,可以将数据下载到本地
  • 股票数据必须分开保存,不能将所有数据包含在一个文件中,在一个文件中就是人家已经将数据数据库化了。


  • 数据文件不能少的太多了,尤其是免费用户可以下载所有的历史数据

最后在对比了大智慧、东方财富和通达信后,选择了通达信。


2. 读取股票信息 2.1 读取股票基本信息

根据starsky2006的“通达信V6.1股票代码文件格式分析”

CSDN博主「starsky2006」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。



原文链接:https://blog.csdn.net/starsky2006/article/details/5863438

直接上代码:

def readTnfFile(market):
    Path = 'C:\new_tdx\T0002\hq_cache\'
    DataPage = 314
    tndFile = Path + market +'m.tnf'
    file = open(tndFile,'rb')
    file.read(50)
    while True:
        data = file.read(DataPage)
        if(len(data)==DataPage):
            stockCode = data[0:6].decode()
            stockName = data[23:41].decode('GBK')
            stock2 = stockCode[0:2]
            stockType=0
            if market=='sh':
                if stock2 == '60':
                    stockType=1
                elif stock2 == '68':
                    stockType = 2
            elif market=='sz':
                if stock2 == '00':
                    stockType=1
                elif stock2 == '30':
                    stockType = 2     
            if stockType>0:
                paraTnf.append((stockCode,stockName[0:4],market,stockType))
        else:
            break
    file.close()

读取股票基本信息入库,OK!

2.2 读取股票股本信息

通达信的base.dbf文件格式如下:

typedef struct tdx_basedata_t {
	char	m_szMagic;
	char	m_szMarket;						// 市场 '0' 深圳 '1' 上海
	char	m_szCode[6];
	char	m_szDate_modified[8];			// 更新日期
	char	m_szShare_count_total[14];		// 总股本 10000
	char	m_szShare_count_national[14];	// 国家股 10000
	char	m_szShare_count_orig[14];		// 发起股 10000
	char	m_szShare_count_corp[14];		// 法人股 10000
	char	m_szShare_count_b[14];			// B股 10000
	char	m_szShare_count_h[14];			// H股 10000
	char	m_szShare_count_currency[14];	// 流通股 10000
	char	m_szShare_count_employ[14];		// 职工股 10000
	char	m_szUnkown1[14];				// 
	char	m_szAsset[14];					// 总资产 1000
	char	m_szAsset_currency[14];			// 流动资产 1000
	char	m_szAsset_capital[14];			// 固定资产 1000
	char	m_szAsset_imma[14];				// 无形资产 1000
	char	m_szInvest_long[14];			// 长期投资 1000
	char	m_szDebt_currency[14];			// 流动负债 1000
	char	m_szDebt_long[14];				// 长期负债 1000
	char	m_szAcc_fund[14];				// 公积金 1000
	char	m_szNet_asset[14];				// 净资产 1000
	char	m_szMain_income[14];			// 主营收入 1000
	char	m_szMain_profit[14];			// 主营利益 1000
	char	m_szOther_profit[14];			// 其他利益 1000
	char	m_szBusiness_profit[14];		// 营业利益 1000
	char	m_szInvest_profit[14];			// 投资收益 1000
	char	m_szAllow_profit[14];			// 补贴收入 1000
	char	m_szOut_profit[14];				// 业外收支 1000
	char	m_szProfit_regulate[14];		// 损益调整 1000
	char	m_szTotal_profit[14];			// 利润总额 1000
	char	m_szProfit_aftertax[14];		// 税后利益 1000
	char	m_szNet_profit[14];				// 净利益 1000
	char	m_szProfit_ud[14];				// 未分利润 1000
	char	m_szNet_asset_ps_regulate[14];	// 每股净资2
	char	m_szUnknown2[3];				// 
	char	m_szUnknown3[4];				// 
	char	m_szUnknown4[2];				//
	char	m_szDate_begin[8];				// 上市日期
	char	m_szUnknown5[3];				// 
	char	m_szUnknown6[11];				// 
}

暂时流通股和IPO有用,入库,上代码:

    baseFile = 'C:\new_tdx\T0002\hq_cache\base.dbf'
    DataPage = 481
    file = open(baseFile,'rb')
    file.read(1314)
    while True:
        data = file.read(DataPage)
        if(len(data)==DataPage):
            stockCode = data[1:7].decode()
            stockShare = int(float(data[99:113].decode().lstrip()))
            stockIPO = int(data[458:466].decode())
            paraBase.append((stockIPO,stockShare,stockCode))
        else:
            break
    file.close()
3. 读取股票历史数据 3.1 通达信的日线数据格式

通达信日线数据下载后,存放位置在:

  • 上证数据 vipdoc\sh\lday
  • 深证数据 vipdoc\sz\lday

每个股票对应一个文件。


每32个字节为一天数据:

  • 00 ~ 03 字节 年月日,整型;
  • 04 ~ 07 字节 开盘价*100,整型;
  • 08 ~ 11 字节 最高价*100, 整型;
  • 12 ~ 15 字节 最低价*100, 整型;
  • 16 ~ 19 字节 收盘价*100, 整型;
  • 20 ~ 23 字节 成交额(元),float型;
  • 24 ~ 27 字节 成交量(股),整型;
  • 28 ~ 31 字节 (保留)
3.2 历史数据入库

上代码:

self.file = open(self.FileName,'rb')
self.DataPage = 32
self.unpackStr = '5If2I'

while True:
    data = self.file.read(self.DataPage)
    if(len(data)==self.DataPage):
        data = struct.unpack(self.unpackStr,data)

        dataDate = data[0]
        if (dataDate>self.MAXDate):
            dataOpen = data[1] #*100
            dataHigh = data[2]  #*100
            dataLow = data[3]  #*100
            dataClose = data[4]  #*100
            dataAmount = data[5]//10000   #万
            dataVolume = data[6]//100    #手
            self.para.append((self.stockCode,dataDate,dataOpen,dataHigh,dataLow,dataClose,dataVolume,dataAmount))
4. 总结

感谢前人留下的信息,终于可以得到全部数据了。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/589715.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-13
下一篇 2022-04-13

发表评论

登录后才能评论

评论列表(0条)

保存