Python中如何读取大智慧6.0日线文件进行练手
https://github.com/chuchiring/stock
默认前复权支持全部倒出为 csv 供机器学习
写的不好的地方请指教
Python中如何读取大智慧6.0日线文件进行练手
有没有可以读取 /计算复权价格的?
要读取大智慧6.0的日线文件,你得先了解它的二进制格式。大智慧的数据文件通常以.day为后缀,结构比较固定。
每个.day文件包含多条日线记录,每条记录通常是32字节:
- 日期(4字节,可能是整数格式如YYYYMMDD)
- 开盘价(4字节,通常是float或整数)
- 最高价(4字节)
- 最低价(4字节)
- 收盘价(4字节)
- 成交量(4字节,可能是整数)
- 成交额(4字节,可能是float或整数)
- 保留字段(4字节)
下面是一个简单的读取示例:
import struct
import pandas as pd
from datetime import datetime
def read_dzh_day_file(filepath):
"""读取大智慧日线文件"""
records = []
with open(filepath, 'rb') as f:
while True:
# 读取32字节的一条记录
data = f.read(32)
if not data or len(data) < 32:
break
# 解析二进制数据
# 注意:大智慧的数据可能是小端或大端字节序,这里假设是小端
# 你可能需要根据实际数据调整格式字符串
try:
# 尝试解析日期为整数格式(如20231215)
date_int = struct.unpack('<I', data[0:4])[0]
# 将整数日期转换为datetime
# 注意:这里假设日期格式是YYYYMMDD
year = date_int // 10000
month = (date_int % 10000) // 100
day = date_int % 100
date = datetime(year, month, day)
# 解析价格数据(假设是float类型)
open_price = struct.unpack('<f', data[4:8])[0]
high = struct.unpack('<f', data[8:12])[0]
low = struct.unpack('<f', data[12:16])[0]
close = struct.unpack('<f', data[16:20])[0]
# 成交量和成交额
volume = struct.unpack('<I', data[20:24])[0] # 假设是无符号整数
amount = struct.unpack('<f', data[24:28])[0] # 假设是float
records.append({
'date': date,
'open': open_price,
'high': high,
'low': low,
'close': close,
'volume': volume,
'amount': amount
})
except struct.error as e:
print(f"解析错误: {e}")
break
# 转换为DataFrame
df = pd.DataFrame(records)
if not df.empty:
df.set_index('date', inplace=True)
df.sort_index(inplace=True)
return df
# 使用示例
if __name__ == "__main__":
# 替换为你的文件路径
file_path = "SH600000.day" # 示例文件名
try:
df = read_dzh_day_file(file_path)
print(f"成功读取 {len(df)} 条记录")
print(df.head())
except FileNotFoundError:
print(f"文件不存在: {file_path}")
except Exception as e:
print(f"读取失败: {e}")
几个关键点:
- 字节序问题:大智慧数据可能是小端(
<)或大端(>),如果上面的代码解析出来的数据不对,试试把格式字符串里的<换成>。 - 数据类型:价格可能是float,也可能是整数(比如乘以1000),需要根据实际情况调整。
- 日期格式:也可能是其他格式,比如从某个起始日期的天数偏移。
调试建议: 先用hex编辑器(如HxD)打开文件,看看前几条记录的实际二进制数据,确认具体的格式。
如果这个基础版本不工作,你可能需要根据实际的文件格式调整解析逻辑。有些大智慧文件可能有不同的版本或自定义格式。
一句话总结:先确认文件的具体二进制格式,再调整解析代码。
我代码里面就是读取原始价格和权息信息进行了前复权的
默认就是前复权?默认应该是原始数据好一点吧
如果默认价格复权,量不复权的话,会有问题的
最好是原始价格 & 复权价格或复权参数
从操盘来说,复权成交量没意义,更应该关注的是换手率吧
机器分析就有意义了
在 dataprovider_dzh 里面,找到
xr_daylines.append(StockDayLine(dayline.date,
round(dayline.open * price_factor + 0.001,2),
round(dayline.high * price_factor + 0.001,2),
round(dayline.low * price_factor + 0.001,2),
round(dayline.close * price_factor + 0.001,2),
dayline.vol, dayline.amount))
dayline.vol 改成 round(dayline.vol * price_factor,0) 即可
6
学习

