4. 档案命名规范与目录结构

多板块轮动研究档案的归档难点,往往不在于“存不存得下”,而在于“半年后还能不能找得到、看得懂、对得上”。当研究覆盖多个板块(如新能源、半导体、消费、医药)、每个板块下又并行多种策略(趋势跟随、均值回归、事件驱动),如果命名随意、目录扁平,档案很快会退化成难以检索的文件堆。本节要解决的核心问题是:用一套可扩展的命名规则锁定“单个文件是什么”,用一套分层目录结构锁定“文件应该放在哪里”,两者配合,使档案在板块和策略数量增长时仍然有序。

一、命名规则:用固定字段表达可变信息

可扩展命名规则的实质,是把文件名拆成若干语义字段,用统一分隔符连接,并规定每个字段的取值格式。推荐采用“下划线连接字段、连字符连接复合词”的约定,字段顺序固定为:日期—板块—策略—对象类型—版本—备注。其中日期统一用 YYYYMMDD,避免不同系统排序错乱;板块与策略使用预先登记的短代码(如 NEV 表示新能源、SEMI 表示半导体、TREND 表示趋势跟随、MR 表示均值回归);对象类型用固定枚举值,如 DATA(原始数据)、SIG(信号)、BT(回测结果)、RPT(研究报告)、CFG(参数配置);版本用 v01、v02 递增;备注只允许简短英文或拼音缩写,禁止空格与中文标点。

例如,2024 年 3 月 15 日新能源板块趋势跟随策略的第二版回测结果,命名为:

20240315_NEV_TREND_BT_v02.csv
20240315_SEMI_MR_SIG_v01.parquet
20240315_CONS_EVENT_RPT_v03.md
20240315_MED_TREND_CFG_v01.yaml

这套规则的可扩展性体现在两点:新增板块或策略时,只需在代码登记表中追加短代码,字段结构不变;新增对象类型时,只需扩充枚举值,历史文件不受影响。需要特别强调的是,短代码必须集中登记、唯一且不复用,否则“同名不同义”会直接破坏检索。建议维护一张代码登记表,字段包括代码、全称、所属层级、启用日期、停用日期,停用代码不得再分配给新对象。

命名中的日期应表示“该档案所描述内容的基准日”,而不是文件生成日。例如回测结果描述的是截至 3 月 15 日的区间表现,即使文件在 3 月 18 日导出,日期字段仍写 20240315,生成时间可放入文件内部元数据或备注字段。

二、目录结构:三层主干加一层归档

目录组织要与命名规则形成互补:命名回答“是什么”,目录回答“归哪类”。推荐采用“板块—策略—对象类型”三层主干,再加一层按年度归档的冷区。顶层为板块目录,第二层为该板块下启用的策略,第三层按对象类型分目录存放,使同类档案天然聚集,便于批量处理和版本比对。

多板块多策略档案目录结构(三层主干 + 年度归档) archive/ 研究档案根目录 NEV/ 新能源 SEMI/ 半导体 CONS/ 消费 MED/ 医药 TREND/ MR/ EVENT/ DATA SIG BT 20240315_NEV_TREND_BT_v02.csv 层级职责 第 1 层 板块:按研究覆盖的行业板块划分,代码唯一登记 第 2 层 策略:该板块下实际启用的策略,未启用不建目录 第 3 层 对象类型:DATA / SIG / BT / RPT / CFG 固定枚举 文件层:严格套用命名规则,字段顺序与分隔符不可变 扩展方式:新增板块/策略只加目录与代码,不改层级结构 年度归档冷区 archive/_frozen/ 每年初将上一年度已结题板块的档案整体移入 _frozen/2023/、_frozen/2024/ 归档时保留原三层相对路径,仅在最前增加年度层,保证引用关系不失效 活跃区只保留当年与跨年未结题档案,检索范围更小、响应更快

上图展示了目录主干与文件层的对应关系。需要说明的是,第三层的对象类型目录应保持固定枚举,不要因为临时需求随意新增;若确有新类型,先更新枚举登记表,再统一建目录,避免同一类档案散落在多个名称相近的目录中。年度归档层是可选但强烈建议的扩展:每年初把上一年度已结题板块的档案整体移入 _frozen/年份/,保留原有相对路径,使活跃区只保留当年与跨年未结题内容,检索范围更小、响应更快。

三、命名与目录的联动校验

规则设计完成后,必须建立联动校验,否则命名与目录会各自漂移。校验逻辑可以概括为三条:文件名中的板块代码必须与所在板块目录一致;策略代码必须与所在策略目录一致;对象类型必须与所在类型目录一致。这三条可以用一个简单脚本在归档提交时自动检查。以下为示例校验逻辑(Python 伪代码,仅示意判断关系):

import os, re
PATTERN = re.compile(r"^(\d{8})_([A-Z]+)_([A-Z]+)_(DATA|SIG|BT|RPT|CFG)_v(\d{2})\.(\w+)$")

def check(path):
    name = os.path.basename(path)
    m = PATTERN.match(name)
    if not m:
        return "命名不符合规则"
    date, sector, strategy, obj, ver, ext = m.groups()
    parts = path.replace("\\", "/").split("/")
    if sector != parts[-4]: return "板块代码与目录不一致"
    if strategy != parts[-3]: return "策略代码与目录不一致"
    if obj != parts[-2]: return "对象类型与目录不一致"
    return "通过"

这段校验的价值在于把“规范”变成可执行的约束。实际落地时,建议在归档入口设置一道检查:不通过的文件不允许进入主干目录,先放入 _inbox/ 待修正区。这样既保护了主干结构,也让问题文件有明确去处,而不是被随手塞进某个目录。

四、版本与备注字段的使用边界

版本字段 v01、v02 用于同一对象在同一基准日下的迭代,例如参数调整后重跑的回测结果。不同基准日应使用不同日期字段,而不是靠版本号区分,否则时间序列会被打乱。备注字段只用于区分同日期同版本下的并行产物,例如不同参数组的回测,可写 _p1、_p2,但必须在同目录的说明文件中登记参数含义。备注字段不应承载业务解释,解释性内容放入报告或元数据文件,避免文件名过长且语义混乱。

常见错误是把“文件生成时间”写进日期字段,或把板块中文名直接写进文件名。前者会破坏按基准日检索的一致性,后者会在跨系统传输时引发编码问题。统一使用基准日与登记短代码,是保证长期可检索的底线。

五、一份可直接套用的落地清单

为便于执行,可将本节方案整理为以下检查项,归档时逐条核对:

检查项合格标准不合格处理
日期字段8 位数字,表示内容基准日改为基准日,生成时间移入元数据
板块/策略代码已在登记表中,且与目录一致补登记或修正目录
对象类型属于固定枚举更新枚举表后统一建目录
版本号两位数字递增,同基准日同对象唯一重命名并检查是否覆盖
备注字段简短、无空格、已在说明文件登记精简或移入元数据
目录层级板块—策略—对象类型三层完整移入 _inbox/ 待修正

把命名规则、目录主干、联动校验和落地清单四件事固定下来,档案体系就具备了随板块与策略数量增长而平稳扩展的能力。后续新增板块时,只需登记代码、建立目录、套用同一套命名与校验,而不需要重新设计归档方案。