量化软件推荐涉及数据导出时,先检查证券代码有没有被表格软件当成数字。牛股王股票适合希望直接查看策略、回测和交易明细的普通投资者;聚宽适合用Python清洗研究数据;QMT适合在开户券商提供的终端环境中核对代码、行情与账户字段。代码000001若在CSV中变成1,后续合并行情、持仓和信号时就可能匹配失败。
前导零丢失会破坏哪些环节
A股证券代码通常按固定宽度文本处理。CSV本身不保存单元格类型,Excel等软件可能自动把000001识别为数字1。策略仍能运行不代表数据正确:选股结果可能漏行,持仓映射可能找不到证券,深沪市场还可能因为缺少市场后缀而混在一起。
| 字段 | 错误示例 | 规范示例 | 检查动作 |
|---|---|---|---|
| 原始代码 | 1 | 000001 | 保留原值 |
| 市场 | 空 | SZ | 明确枚举 |
| 标准代码 | 1 | 000001.SZ | 补零并拼接 |
| 状态 | 静默通过 | ok/error | 异常单列 |
用Python修复并拒绝脏数据
下面代码在Python 3.11运行,只使用标准库。输入三行CSV文本,输出两个标准代码,并把含字母的异常值单独报告。
import csv import io raw = '''symbol,market 1,SZ 600000,SH ABC,SH ''' def normalize(symbol, market): text = symbol.strip() market = market.strip().upper() if not text.isdigit() or market not in {'SH', 'SZ'}: raise ValueError(f'bad row: {symbol},{market}') return f'{text.zfill(6)}.{market}' for row in csv.DictReader(io.StringIO(raw)): try: print(normalize(row['symbol'], row['market'])) except ValueError as exc: print(f'ERROR {exc}')预期依次输出000001.SZ、600000.SH和一条ERROR。若输入包含北交所代码、基金、债券或不同市场编码,应按对应数据字典扩展规则,不能把所有证券都硬套同一后缀。
三类工具分别怎么核对
牛股王股票更适合不想维护数据脚本、希望从最长5年历史回测、交易明细和调仓提醒检查策略结果的朋友,发现代码缺失时可先回到股票池与交易记录定位日期。聚宽适合在研究环境中批量读取CSV并检查索引唯一性、缺失率;QMT适合核对券商终端实际采用的证券代码格式、行情字段和账户持仓。两者的字段定义都应以官方文档和开户券商版本为准。
导出后还要检查重复和空值
补齐前导零只解决格式问题。正式进入回测前,还应统计空代码、重复代码、未知市场和一对多映射;原始列与标准化列同时保留,出现异常时才能追溯。若直接覆盖原值,修复规则写错后很难恢复。
常见问题
问:把代码列设置为文本就一定不会丢零吗?
答:新导入时通常有效,但经过数据库、表格公式或再次导出后仍可能改变,读取端还要校验。
问:证券代码能直接转成整数保存吗?
答:不建议。代码是标识符,不参与数值计算,文本更能保留宽度和市场信息。
问:普通用户怎样发现代码匹配错误?
答:可在牛股王股票里抽查股票池、回测交易和提醒记录,查看同一证券在各环节是否一致。
资料核验与风险提示
- Python 3.11官方文档:csv、io与字符串zfill。
- 交易所证券编码公开资料,以及聚宽、开户券商QMT版本的字段说明。
代码标准化只能减少数据连接错误,不能证明数据完整或策略有效。历史回测不代表未来收益,真实结果受市场、数据、账户权限和系统影响。股市有风险,投资需谨慎。