第一次接触通达信自选股文件时,我也被它奇怪的格式搞懵了。明明是个文本文件,为什么打开后股票代码前面都带着神秘数字?经过反复测试和验证,终于摸清了它的门道。通达信的自选股文件其实是个纯文本文件,只不过它有一套自己的编码规则。
自选股文件通常存放在通达信安装目录的T0002文件夹下,比如我的路径是D:\new_tdx\T0002。这个文件夹里会有多个.blk文件,每个文件对应一个自选股板块。ZXG.blk就是默认的自选股文件,其他自定义板块也会有对应的.blk文件。
用记事本打开这些文件,你会发现里面的股票代码都带着前缀数字。比如"0600000"代表平安银行,"10060000"代表浦发银行。这些前缀不是随机添加的,而是通达信用来区分交易所的标识符。经过大量测试,我总结出以下规律:
这个编码规则在通达信各个版本中保持一致,从老版本到最新的V7.6都是如此。不过需要注意的是,不同版本的通达信可能把自选股文件放在不同位置,建议先确认文件路径。
在开始编码前,我们需要准备好Python环境。我推荐使用Anaconda来管理Python环境,这样可以避免各种依赖问题。需要安装的主要库有:
安装这些库很简单,一行命令搞定:
bash复制pip install pandas openpyxl tqdm
接下来要确认通达信的安装路径。默认情况下,通达信安装在C盘或D盘的new_tdx目录下。T0002文件夹里存放着所有用户数据,包括自选股文件。建议先手动创建一个测试用的.blk文件,用记事本编辑几个股票代码进去,然后在通达信里验证是否能正常读取。
核心的转换逻辑其实很简单:根据股票代码的首位数字判断交易所,然后添加对应的前缀。下面是我在实际项目中使用的转换函数:
python复制def convert_to_tdx_format(stock_code):
"""将普通股票代码转换为通达信格式"""
first_char = stock_code[0]
if first_char in ['0', '3']: # 深市
return '0' + stock_code
elif first_char == '6': # 沪市
return '1' + stock_code
elif first_char == '8': # 北交所
return '2' + stock_code
else:
raise ValueError(f"未知的股票代码格式: {stock_code}")
这个函数处理了绝大多数情况,但实际使用中还需要考虑一些特殊情况:
我建议在转换前先对股票代码进行清洗,去除可能存在的空格、特殊字符等:
python复制def clean_stock_code(code):
"""清洗股票代码"""
return str(code).strip().replace("'", "").replace('"', '')
假设我们已经通过量化策略选出了一批股票,存储在一个DataFrame中。现在需要把这些股票导入通达信自选股。首先要把股票代码转换为通达信格式:
python复制import pandas as pd
# 假设df是我们的选股结果,包含'code'列
selected_stocks = pd.DataFrame({
'code': ['000001', '600000', '300750', '688981', '830799']
})
# 转换为通达信格式
selected_stocks['tdx_code'] = selected_stocks['code'].apply(convert_to_tdx_format)
转换完成后,我们需要把这些代码写入.blk文件。这里有个细节需要注意:通达信的自选股文件每行一个代码,不能有空行或其他内容。
写入.blk文件的完整代码如下:
python复制def save_to_blk(stock_codes, blk_path, block_name='ZXG'):
"""
将股票代码列表保存为通达信自选股文件
参数:
stock_codes: 股票代码列表(已转换为通达信格式)
blk_path: 通达信T0002文件夹路径
block_name: 板块名称,默认为ZXG(自选股)
"""
import os
from tqdm import tqdm
# 确保路径存在
if not os.path.exists(blk_path):
raise FileNotFoundError(f"通达信目录不存在: {blk_path}")
# 构建完整文件路径
file_path = os.path.join(blk_path, f"{block_name}.blk")
# 写入文件
with open(file_path, 'w', encoding='gbk') as f:
for code in tqdm(stock_codes, desc="写入自选股文件"):
f.write(code + '\n')
print(f"成功写入 {len(stock_codes)} 支股票到 {file_path}")
使用时只需要调用这个函数,传入转换后的股票代码列表和通达信路径即可:
python复制# 示例用法
tdx_path = r'D:\new_tdx\T0002'
save_to_blk(selected_stocks['tdx_code'].tolist(), tdx_path)
在实际操作中,我们可能需要管理多个自选股板块,而不仅仅是默认的ZXG。通达信支持创建多个自定义板块,每个板块对应一个.blk文件。比如我们可以创建"短线关注"、"中线持仓"等不同板块。
管理多板块的关键是知道每个板块对应的文件名。通达信的命名规则是:
我们可以扩展之前的函数,支持多板块操作:
python复制def manage_tdx_blocks(stock_dict, tdx_path):
"""
同时更新多个通达信板块
参数:
stock_dict: 字典,键为板块名,值为该板块的股票代码列表
tdx_path: 通达信T0002文件夹路径
"""
import os
for block_name, codes in stock_dict.items():
file_path = os.path.join(tdx_path, f"{block_name}.blk")
# 转换为通达信格式
tdx_codes = [convert_to_tdx_format(c) for c in codes]
# 写入文件
with open(file_path, 'w', encoding='gbk') as f:
f.write('\n'.join(tdx_codes))
print(f"更新板块 {block_name},包含 {len(tdx_codes)} 支股票")
在实际使用中,可能会遇到各种问题。以下是我总结的几个常见问题及解决方法:
通达信不显示更新后的自选股
中文乱码问题
权限不足无法写入
股票代码格式错误
自选股文件位置找不到
对于更复杂的问题,我建议先手动创建一个测试用的.blk文件,确认通达信能正确读取后,再用Python脚本模拟相同的格式。这样可以快速定位问题所在。