使用守卫项目

本章节主要涉及 守卫项目 ,所谓的 守卫项目 是在当前工程之外的另一个RiskQuantLib数据工程。但它的独特之处在于它不进行任何的数据处理,它无法单独完成任何数据分析任务。它唯一的作用是向 被守卫项目 提供源代码,进行文件分发或控制文件输出。

为什么需要守卫项目

很多时候,一个数据工程除了数据处理逻辑,还有很多工具函数。这些工具函数和具体的数据处理方式无关,但又不可或缺。比如计算日期的函数,比如衍生品工程里计算波动率曲面插值的函数。当你有很多个衍生品数据工程的时候,每个工程都一个自己的日期计算函数当然满足了探索性数据分析的需要,但如果它形成了稳定的应用,每天都要运行,这么多相同的函数对于后期的维护就是是非常不便的。

所以很自然地,我们可以使用 守卫项目 ,一般来说,RiskQuantLib工程在编译的时候只会对自己的源代码进行生成和修改,但 守卫项目 可以对其他不同于自己的RiskQuantLib工程进行代码生成和修改。这样你就可以把那些在多个类似工程中都要用到的函数放在 守卫项目 里,通过编译 守卫项目 进行代码的分发。如果有后期更改的需求,那么只需要更改 守卫项目 ,然后重新编译。

比如你在进行一个多因子模型的研发,那么你可以分别有 回测寻参每日更新 三个数据工程。再新建一个 多因子守卫项目 ,把常用的日期函数,矩阵特征计算函数等工具函数都放入 守卫项目 ,然后统一进行控制,这是非常方便的做法。

当然,使用守卫项目会使得你每次更改工程的名称时,都需要对守卫项目进行相应的更改。在更换工程位置的时候也是如此。不过一旦守卫项目被编译,代码就会变成被守卫项目的本地代码,除非信道被更新覆盖,否则无论怎么改变文件的名称或者工程的目录,这些代码都是不会受到影响的。

如何使用守卫项目

在上一章节我们已经知道了 Src 文件夹可以将源代码汇聚在一处,以业务逻辑分类源代码,并且使用 注释控制语句 告诉RiskQuantLib应该把这些源代码插入到哪个源文件中。通常情况下, Src 文件夹位于当前的数据工程项目下。你使用 newRQL 命令创建工程的时候, Src 文件夹就被创建了。

但实际上, Src 文件夹可以位于任何位置,并不需要一定处于当前数据工程目录下。 Src 文件夹也可以有不同的名称。

如果你将 Src 文件夹放在输出工程文件夹之外,你需要在编译的时候指定 Src 文件夹的位置,使用 -r yourSrcPath 来告诉RiskQuantLib使用 yourSrcPath 这个文件夹作为组件文件夹,而不是默认的 Src 文件夹。具体的命令如下:

python build.py -r yourSrcPath

更关键的,同一个数据工程可以有不止一个组件文件夹。当有多于一个组件文件夹的时候,不同的组件通过不同的 信道 来对目标数据工程进行更改,编译时需要使用 -c 参数来指定信道的名称。

设想一下,你的数据工程 A 可能需要很多处理业务的逻辑,他们被你放在 A/Src 组件内。但同时,你的工程还需要很多工具函数,比如计算每个月的第三个星期五是哪一天的函数,等等。这些函数是你自己编写的,你把它们放在 B 工程下的 Src 组件文件夹里。

要让 A 工程正常运行,必须同时需要 A/SrcB/Src 中的代码。这时候,负责业务逻辑处理的 A 就被称为 被守卫项目 ,负责提供工具函数的 B 就被称为 守卫项目 。进入 A 项目目录,分别运行下方的两条命令,可以使得两个组件文件夹的代码同时起效:

python build.py
python build.py -r B/Src -c guardian

第一条命令的意思是使用默认的 A 工程下的 Src 文件夹,使用默认信道进行编译。第二条命令的意思是使用 B/Src 文件夹,使用 guardian 信道进行编译。

不同信道对同一个标签进行修改时,最后生效的信道会覆盖之前的信道。如果不同信道的组件对不同的标签进行修改,那么它们彼此互不影响。

如果你不清楚什么是 标签 ,你可以参考 使用组件文件夹