文件结构解析
-
文件头(32字节)
- 前4字节:文件标识(固定为
0x0E) - 后续28字节:保留字段(通常为
0x00)
- 前4字节:文件标识(固定为
-
K线记录(每笔40字节)
- 时间戳(4字节):小端序整型,需转换为时间格式
- 开盘价(4字节):小端序浮点数
- 最高价(4字节):小端序浮点数
- 最低价(4字节):小端序浮点数
- 收盘价(4字节):小端序浮点数
- 成交量(4字节):小端序整型
- 成交额(8字节):小端序双精度浮点数
- 预留字段(8字节)
Python解析代码
python
import struct
import datetime
def read_lc1_file(file_path):
data = []
with open(file_path, 'rb') as f:
# 跳过文件头
f.read(32)
# 逐条读取K线记录
while True:
chunk = f.read(40)
if not chunk:
break
# 解析二进制数据
timestamp, open_price, high, low, close, volume, turnover, _ = struct.unpack('<Iffffd8x', chunk)
# 转换时间戳(通达信时间戳为自1990-01-01的秒数)
dt = datetime.datetime(1990, 1, 1) + datetime.timedelta(seconds=timestamp)
data.append({
'datetime': dt,
'open': open_price,
'high': high,
'low': low,
'close': close,
'volume': int(volume),
'turnover': turnover
})
return data
# 示例调用
kline_data = read_lc1_file('path/to/data.lc1')
关键说明
- 字节序 :所有字段均为小端序 (
<符号在struct.unpack中指定) - 时间戳转换: $$ \text{时间} = \text{1990-01-01} + \text{时间戳(秒)} $$
- 精度处理:成交量需转为整数(原始数据为浮点存储的整数)
输出数据结构
返回结果为字典列表,每条记录包含:
python
{
'datetime': datetime.datetime(2023, 5, 17, 10, 30), # 时间
'open': 15.23, # 开盘价
'high': 15.45, # 最高价
'low': 15.20, # 最低价
'close': 15.40, # 收盘价
'volume': 51200, # 成交量(手)
'turnover': 785920.0 # 成交额(元)
}
注意事项
- 不同版本的通达信可能存在细微格式差异,建议先验证文件头标识。
- 成交额字段(
turnover)为双精度浮点数,可精确表示较大数值。