AI 原生量化投研平台AI-native quantitative research platform
正在加载…Loading…
页面仍在加载,可以继续等待,或重新加载。The page is still loading. You can keep waiting or reload.
部分页面资源未能加载,请重新加载。Some page resources could not load. Please reload.
设备当前处于离线状态,恢复连接后可以继续等待或重新加载。Your device is offline. Once connected, you can keep waiting or reload.
本文介绍开源软件包 BeforeIT.jl:一个基于 Julia 的高性能宏观经济主体建模平台,能够构建、模拟、校准和扩展大规模宏观主体模型。报告展示了其多主体经济结构、模块化运行机制、多国预测流程、模型变体构建方法及自动微分能力。基准测试表明,BeforeIT 相比原始 Matlab 实现显著提速,并在大规模模拟中优于 Matlab 生成的 C 代码;自动微分还能够以近似固定的计算成本处理高维参数梯度,为宏观模型校准、敏感性分析和政策模拟提供了可扩展工具 。
n_banks = 1 时可还原基础模型。Model(parameters, initial_conditions) 初始化模型;模型对象由七类主体对象以及 prop、data、agg 三个辅助对象组成。run! 按季度循环调用 step! 并收集数据,ensemblerun! 则支持多组独立 Monte Carlo 模拟;默认追踪 32 个变量,其中五个变量可按银行分别记录。| 实现方式 | 规模1:1000,单核耗时(秒) | 规模1:1000,4核耗时(秒) | 规模1:1,单核耗时(秒) | 规模1:1,4核耗时(秒) |
|---|---|---|---|---|
| MATLAB | 0.365 | — | 1996.2 | — |
| Matlab 生成的 C 代码 | 0.079 | 0.027 | 574.7 | 210.1 |
| HPC 实现 | — | — | 91.7 | 22.9 |
| BeforeIT.jl | 0.018 | 0.006 | 46.7 | 21.6 |
shock 对象,在每个模拟步开始时修改模型的任意属性,从而实现消费、政策或其他复杂经济冲击。@object 宏、抽象类型和 Julia 多重派发,研究者可以继承原有主体属性并只重写特定行为,例如建立具有新利率规则的中央银行,而无需复制原始代码。CalibrateBeforeIT.jl 将原有 Matlab 和 PostgreSQL 校准脚本翻译为 Julia,并支持从 Zenodo 数据快照或 Eurostat 获取数据。parameters 与 initial_conditions,图示以法国为例。[0,1] 区间内变化,通过 50 个 epoch 的随机梯度上升,同时约束初始 GDP接近原始参数并提升未来 GDP 增长。ModelCANVAS 通过重写企业预期与决策、中央银行利率规则以及欧元区增长和通胀数据记录函数,引入需求拉动定价和自适应 Taylor 规则。ModelCANVAS 还支持 Calvo 定价和指数移动平均通胀预期;theta_calvo = 1、omega_pi = 0 可还原文献中的设定,较长时间跨度下的典型参数为 theta_calvo = 0.25、omega_pi = 0.5。ModelGR 将 GDP、通胀、政府消费和贸易量的对数水平 AR(1) 过程替换为增长率 AR(1) 过程,仅新增相应主体类型并重写必要函数,核心 step! 循环保持不变。报告没有股票评级、买入/卖出建议、目标价或企业估值,因为其研究对象是软件包和宏观经济建模基础设施,而不是上市公司证券。 作者希望传达的主要信息是:宏观ABM虽然能够处理异质主体、非线性互动和非均衡动态,但过去受到计算成本高、代码封闭、难以扩展和复现困难的限制;BeforeIT试图通过Julia、开源许可、模块化架构、自动测试和自动微分技术,降低宏观ABM的使用门槛,同时保留大规模模拟所需的计算性能。
报告的中心结论可以概括为四点:
传统DSGE模型通常围绕均衡条件和主体优化问题展开,并且经常使用代表性家庭或企业。宏观ABM则直接模拟大量异质家庭、企业、银行、政府和其他主体之间的互动,由微观行为和市场匹配过程产生宏观结果。 这种差异意味着ABM可以自然处理收入和规模异质性、非线性反馈、搜索摩擦、市场失衡以及危机和泡沫等涌现现象,但代价是需要更高的计算资源、更复杂的校准和更严格的代码验证。
作者特别强调,本文所依托的“基础模型”并不只是用于复现历史统计事实。此前研究已经表明,该模型能够进行GDP、通胀和就业等短期宏观预测,并且曾被用于分析新冠疫情、2021—2023年通胀、金融危机、移民、自然灾害和高温导致的劳动生产率损失等问题。 因此,BeforeIT的目标不是从零构建一个抽象教学模型,而是把一个已经用于政策和预测研究的复杂模型转化成可供更广泛研究者使用的通用软件平台。
作者也交代了现有实现存在的碎片化问题:原始版本以Matlab编写,Bank of Canada开发了封闭源代码的CANVAS,另有C++ MPI高性能版本、Python版本和Java版本,但这些版本在可访问性、可扩展性或源代码开放程度上存在限制。 BeforeIT因此填补的是“开源、易安装、可扩展且足够高效”的宏观ABM软件空白,而不仅仅是提供另一个编程语言版本。
基础模型模拟一个小型开放经济,主体数量可以从约8,000个缩放模型扩展到约800万个主体。模型遵循欧洲国民账户体系ESA,并将经济划分为六类主体:
这个结构的经济含义是,GDP、通胀和就业并非由一个代表性主体的最优决策直接推导,而是由企业定价和招聘、家庭消费和劳动供给、银行授信、政府支出、货币政策及外贸共同产生。
原始基础模型只有一个代表性银行,BeforeIT通过参数n_banks将其推广为任意数量的银行。每个企业和家庭随机分配给一家银行,每家银行拥有独立资产负债表,并受到自身资本约束限制。 当n_banks = 1时,模型退化为基础模型。
这一扩展的价值在于,它为研究银行异质性、信贷供给差异、资本约束和系统性风险提供了接口。不过当前实现中,各银行主要只是客户群不同,行为规则仍然相同;作者也明确把允许银行在贷款利率、资本要求和行为规则上存在更深层差异列为未来发展方向。 这说明多银行功能目前更像是研究基础设施,而不是已经完成的银行竞争或宏观审慎政策模型。
家庭和企业使用基于过去行为和观测结果的适应性预期,例如AR(1)规则。市场则通过搜索与匹配机制运行,因此买卖双方并不总能立即完成交易。 这类设定可以产生失业、库存、供需错配和价格调整等非均衡现象,也解释了为什么模型具有较强的现实表现力。
但这种机制也带来重要的技术后果:企业招聘整数劳动者、买方和卖方随机匹配,因此模型对参数的响应可能是分段光滑而非连续光滑。这一点后来直接影响自动微分和有限差分梯度的可靠性。
模型通过Model(parameters, initial_conditions)构造。参数名称沿用原始论文中的命名,例如收入税率tau_INC和银行贷款风险溢价mu,从而能够兼容原Matlab参数文件。 软件自带2010年第一季度奥地利校准参数,也提供实验性的意大利校准,但作者认为参数和初始条件的生成最好由独立的校准包负责。
BeforeIT采用“结构数组”(Structure of Arrays,SoA)组织主体。主要对象包括主动劳动者w_act、非劳动人口w_inact、企业firms、银行banks、中央银行cb、政府gov和国外部门rotw。整个模型再封装为一个model对象,其中还包括:
prop:模拟过程属性;agg:宏观总量和经济状态;data:每期收集的模拟数据。这种设计的优势是,代码中的字段名称尽可能与理论模型和原论文公式对应,研究人员可以较容易地从方程追踪到代码变量。
step!执行一个季度的模型更新,run!循环执行多个季度并在每一步收集数据,ensemblerun!则对多个独立初始化的模型执行蒙特卡洛模拟。 Julia中感叹号表示函数会原地修改输入对象,因此模拟结束后,模型对象本身保存了最终状态。
默认情况下,软件追踪32个变量,其中5个变量按照银行分别记录;用户可以自定义数据追踪器。parallel参数允许在产业部门之间或不同蒙特卡洛模拟之间进行多线程计算。 作者指出,跨独立模拟的并行化通常比同一模型内部跨产业部门并行更有效,因为不同模拟之间完全独立,线程之间的同步成本较低。
run!本质上是对step!的循环,而step!又由一系列命名清晰的函数组成,例如搜索信贷、匹配劳动、更新企业利润、更新银行利润和银行权益等。 这种结构使研究人员可以仅重定义某个函数而改变特定机制,其他部分继续复用原有实现。
软件测试分为三个层次:
测试由GitHub持续集成系统自动运行,因此作者不仅声称代码“能运行”,还试图证明代码在修改后仍保持行为正确性。
图1展示了“BeforeIT”字样和由彩色主体组成的“it”字母。作者解释,“BeforeIT”既指Bank of Italy的IT研究部门,也暗含“在事件发生之前进行预测”的含义;字母中的多个小主体象征主体建模方法。
这张图不提供经济数据,但强化了软件的两个定位:一是行为主体模拟,二是经济预测。
图2左侧展示model对象包含七类经济主体以及prop、data和agg三个辅助对象;右侧展示run!调用step!,而step!又依次执行信贷匹配、劳动匹配、利润更新和银行权益更新等函数。
这张图最重要的含义是,BeforeIT把“经济理论结构”和“软件执行流程”一一对应起来。研究者既可以查看单个主体属性,也可以修改模拟流程中的某一行为模块,因此模型透明度和可扩展性明显高于一个封闭的单体程序。
图3比较了Matlab、Matlab Coder生成的C代码、HPC实现和BeforeIT在不同规模及核心数下运行一个季度所需的平均时间。
在约8,000个主体的1:1000规模下,Matlab耗时约0.365秒,Matlab生成的C代码单核约0.079秒、四核约0.027秒,BeforeIT单核约0.018秒、四核约0.006秒。也就是说,BeforeIT单核约为Matlab的五分之一,四核下约为Matlab的六十分之一。
在约800万个主体的1:1规模下,Matlab耗时约1,996.2秒,Matlab生成的C代码单核约574.7秒、四核约210.1秒,HPC实现单核约91.7秒、四核约22.9秒,BeforeIT单核约46.7秒、四核约21.6秒。 因此,作者给出的相对结论是:小模型中BeforeIT单核约比Matlab快20倍、比生成的C代码快4倍;大模型中分别约快43倍和12倍。
图表支持“Julia兼顾可读性和高性能”的论点,但也有三个限制。第一,HPC结果取自另一篇文章的报告值,执行环境和源代码不可得,因此作者不能计算严格可复现的精确加速比。第二,BeforeIT跨产业部门并行时的加速是次线性的,扩展性仍不如专门设计的HPC实现。第三,性能优势不仅来自Julia即时编译,也来自动态加权抽样等算法优化,因此不能把全部改善归因于编程语言本身。
图4左侧是从加载奥地利2010年第一季度参数,到建立8个模型并行运行20个季度的最小脚本;右侧展示GDP、家庭消费、政府消费、资本形成、出口、进口、工资、Euribor和GDP平减指数等变量。
图中均值路径总体呈上升趋势:GDP大约从72,000上升至76,000以上,家庭消费从约40,500升至42,000左右,工资从约28,500升至31,500以上,出口和进口也整体增加,GDP平减指数从约1.00上升至1.06左右。 这些路径说明模型可以同时生成多个宏观和部门变量,而不是只输出单一GDP序列。
阴影区域随着预测期限拉长通常变宽,反映随机模拟不确定性扩大。图注称阴影区域覆盖一个标准差,但正文又称其为蒙特卡洛均值的标准误,这在统计解释上并不完全相同:标准差衡量模拟路径本身的离散度,标准误则还会随着模拟次数增加而缩小。 这是报告中一个需要注意的表述不一致之处,也意味着读者在解释阴影范围时应确认实际绘图函数使用的是哪一种统计量。
图5通过一个可调用的ConsumptionShock结构,将消费倾向参数提高2%,并持续4个季度,再恢复原值。
下方图形以“冲击情景GDP/基准GDP”为纵轴。GDP比率在冲击开始后迅速上升,在第4—5个季度附近达到约1.009,即相对基准高约0.9%,随后逐渐回落,到第15—17个季度仍约高于基准0.2%左右。 该结果符合消费倾向短期上升带来需求扩张、随后通过价格、收入、进口和其他反馈机制逐步消退的经济直觉。
该功能的关键不是这个具体冲击,而是接口设计:冲击对象在每个季度、主体行动之前接收整个模型,因此理论上可以修改任何参数或状态变量。这种灵活性有利于政策情景分析,但也意味着用户必须自行保证冲击具有合理的经济解释和时间边界。
图6展示如何通过继承AbstractCentralBank、使用@object宏和Julia多重派发机制,创建一个新的中央银行类型,并只重定义利率设定函数。
图中的做法使自定义中央银行可以继承原有字段和大部分行为,只替换指定函数。其优点是避免复制粘贴整个模型,从而减少代码分叉和维护成本;其风险是,复杂的类型派发可能提高新用户理解代码执行路径的难度。
图7展示从Zenodo下载法国校准对象,再以2022年12月31日作为校准日期生成参数和初始条件,并将代理人规模设置为人口的1:1000。
CalibrateBeforeIT.jl目前支持欧盟国家2015—2023年各季度的校准,用户可以下载27个成员国的预计算校准对象,也可以使用Zenodo历史数据快照来复现实验。 但作者同时承认校准代码仍是未经充分打磨的研究原型,数据缺失、时间覆盖和跨国一致性仍在改进中。
图8比较Mooncake自动微分和64位、128位浮点有限差分在GDP优化中的表现,左图为1季度目标,右图为4季度目标。
在1季度目标下,自动梯度与可靠的数值梯度路径基本重合,最终GDP增长约122%;64位且步长较大的数值梯度则偏离,最终约74%。在4季度目标下,自动梯度持续改善,最终GDP增长约150%,而各种有限差分方法都表现出明显波动,最终仅约40%—73%。
原因在于模型存在离散招聘、随机匹配和重新估计预期等操作。有限差分可能跨过离散跳变,将跳跃幅度除以很小的步长,误认为巨大导数;随着季度增加,离散结果累积,可靠步长区间进一步缩小。 不过自动微分也不是严格无偏的真实期望梯度,因为它只沿着已经实现的执行路径求导,忽略了其他随机路径和离散跳变概率的变化,因此在含离散随机性的模型中可能产生偏差。
图9显示,Mooncake自动梯度的运行时间随参数数量增加基本保持平坦,而中心有限差分的耗时与参数数量近似线性增长。
有限差分在约1,000个参数时需要约一分钟,而自动微分仍接近一次完整模型步长的成本;自动微分因此能够处理全模型约106,955个参数。 图表的实际意义在于,自动微分不仅提高了便利性,更改变了高维校准和敏感性分析的可行边界,但其梯度偏差问题仍需通过多随机种子、其他AD后端或无偏估计方法进一步验证。
图11是一个热力图,行代表多个欧洲国家,列代表真实GDP、GDP平减指数增长、真实家庭消费、真实投资和Euribor;每个单元格为(RMSE_AR − RMSE_ABM) × 100,蓝色正值表示ABM误差较低,红色负值表示AR误差较低,星号表示Diebold–Mariano检验达到相应显著性水平。
图表显示:
因此,图11并不支持“ABM普遍战胜传统统计模型”的简单结论,而是支持更审慎的判断:ABM的优势具有变量依赖性和国家依赖性,尤其可能体现在投资等受微观结构、融资条件和需求互动影响较强的变量上;对于GDP和通胀等高度持续性的宏观序列,简单AR模型仍然是非常强的基准。
本报告没有企业估值或证券估值部分,因此不存在DCF、P/E、EV/EBITDA、目标价或估值敏感性分析。其“评价”主要是软件性能和预测准确性评价。
预测管线使用RMSE和偏差,在1、2、4、8和12季度等预测期限上评估真实GDP、GDP平减指数增长、家庭消费、投资和Euribor五个变量。偏差显著性使用带Newey–West标准误的t检验,以处理预测误差序列相关;模型间准确性比较使用Diebold–Mariano检验,以判断两个模型的平方预测误差差异是否显著。 这种方法相较于只比较平均误差更严谨,但结果仍会受到样本期、校准质量、蒙特卡洛次数和模型变量定义的影响。
报告介绍了两个代表性变体。
ModelCANVAS通过重定义企业预期与决策、中央银行利率规则以及欧元区GDP和通胀数据记录,实现需求拉动型定价和适应性Taylor规则;同时加入Calvo定价和通胀预期指数移动平均。参数theta_calvo=1和omega_pi=0时可以回到更接近原CANVAS的设定,而theta_calvo=0.25、omega_pi=0.5有助于更长时间范围内的轨迹收敛。
ModelGR则把原来针对变量水平的AR(1)过程改为针对增长率的AR(1)过程,并应用于GDP预期、通胀预期、政府消费和贸易量。 两个变体都不修改核心step!循环,因此不同模型在市场清算、会计和聚合规则上保持一致,有助于隔离单一建模假设的影响。
跨国管线分为模拟阶段和分析阶段:前者生成不同起始季度的参数、初始条件和蒙特卡洛路径,后者计算误差表、偏差检验、Diebold–Mariano检验以及跨国热图。 这种自动化流程是报告的重要贡献,因为它把模型比较从单一国家、单一案例扩展为统一标准下的批量评估。
报告没有设置传统的“风险因素”章节,但从全文可以归纳出以下风险和局限:
BeforeIT.jl的真正贡献不是提出一个新的宏观经济理论,而是把一个具有复杂微观结构、预测能力和政策应用历史的宏观ABM,转化为开放、模块化、可测试和高性能的软件基础设施。 它在计算性能上相较原始Matlab和Matlab生成的C实现具有显著优势,在代码结构上支持主体属性检查、冲击实验、模型继承、模型变体和批量预测,在研究方法上还进一步引入跨国校准、自动微分和统一的预测评估管线。
图表共同呈现出一个较为平衡的结论:图3证明软件在大规模模拟方面具有现实可用性,图4和图5展示了其进行蒙特卡洛预测与政策冲击分析的便利性,图6和图7说明其扩展与跨国校准能力,图8和图9则显示自动微分能够解决高维优化中的计算瓶颈,但不能完全消除离散随机性带来的统计偏差。图11最终提醒使用者,宏观ABM不应被宣传为在所有预测任务上都优于简单统计模型,其优势需要通过国家、变量和预测期限维度的严格检验来确认。
总体而言,作者对BeforeIT持明确积极立场,认为它填补了宏观ABM领域“开源、易用、可扩展、行业级性能”软件的空白,并希望通过社区贡献继续完善校准、模型变体、银行异质性和自动微分后端。 但从审慎角度看,BeforeIT现阶段最可靠的定位应是一个高性能研究平台和模型实验框架,而不是已经在所有经济预测和政策评估场景中得到充分验证的最终模型。
2502.13267.pdf