接到财务部资金组的预测需求时,内部沟通用的还是“预测未来90天有多少钱进来、多少钱出去”这种口径。我当时就建议换一个目标:不要直接预测现金流具体数额,而是预测现金流的波动性——也就是未来一段时间资金进出剧烈波动的程度。这个改变,直接影响了我后来整个建模周期的走向。
这个项目做下来,最深的体会是:现金流波动性预测本质上不是“预测钱去哪儿”,而是“预测钱变得多不稳定”。它不是一个单纯的时间序列点预测问题,更接近一个风险度量问题。用机器学习做这件事,数据工程和特征构建占了八成的工作量,模型反而不是最难的。我试过树模型、LSTM、Transformer,也踩过不少坑,最终用一套特征工程加树模型的组合达到了业务预期。这篇文章把整个思路、数据准备、模型选型和实操过程完整梳理一遍,希望对正在做金融时序预测、财务数据建模的朋友有参考价值。
1. 先想清楚:现金流波动性预测到底在解决什么问题
1.1 波动性预测与现金流预测的本质区别
很多团队一开始会把“预测现金流波动性”理解成“做一个现金流预测模型”,这是两码事。
现金流预测是点预测,目标很具体:预测下个月15日应付供应商的350万能不能按时覆盖,预测未来7天净现金流大概是多少。这类模型做的是回归,输入历史收付款数据、合同台账、账期信息,输出一个具体的金额或区间。
但现金流波动性预测的目标完全不同。它不关心具体某一天有多少钱进出,而是关心未来30天或者90天里,现金流的“动荡程度”会不会显著放大。业务方拿到这个结果,不是去确认某笔回款是否到账,而是去做资金准备和风险防范。
举个例子:一家公司平时日净现金流波动在±100万左右,但某个月因为客户集中回款、供应商集中结算、大额税费支出扎堆,波动可能一下放大到±800万。这时候如果资金团队没有提前预警,按日常备付水平持有现金,就可能出现临时性资金缺口,被迫去走成本高昂的隔夜拆借。
所以现金流波动性预测的本质,是在业务发生之前给出一个“风险雷达”信号。这种信号的价值,比精确预测某一天的具体金额要大得多。
1.2 这个任务在机器学习里属于哪类问题
从技术类型上看,这是一个典型的金融时序预测问题,但它比常规的股票价格预测、交易量预测要特殊得多。
首先,现金流波动性不是一个可以直接观测的量。股票波动率可以由分钟级、日级价格序列计算出来,但现金流只有在记账时才会留下痕迹,而且中间掺杂大量非经营性、偶发性交易。这意味着它的“波动”形成机制更复杂,噪声水平也更高。
其次,它本质上是回归问题,但标签的构建方式决定了这个任务更接近“风险度量”。我后来和几位做光伏功率预测、交通流量预测的朋友聊过,发现大家面对的问题是一样的:核心目标不是预测“均值”,而是预测“不确定性”本身。光伏功率的超短期预测要输出置信区间,交通流量预测要关注极端拥堵的爆发概率,这和现金流波动性预测在方法论上是同一类问题。
明确这一点有一个直接的好处:评价模型好坏的标准不会跑偏。普通回归模型看RMSE、MAE就够了,但波动性预测的模型,必须额外关注预测区间覆盖率、极端波动日的召回率,以及最终的资金备付成本是否下降。这些指标导向,会在后面的特征工程和模型设计阶段产生实质影响。
1.3 为什么机器学习方法在这里比传统统计方法更合适
传统的现金流波动性预测,最常用的工具是GARCH族模型。GARCH在金融资产收益率序列上有不错的理论支撑,但对现金流数据并不友好。
现金流序列有两个显著特点:一是大量为零值,很多公司并不是每天都有大额收付款;二是受业务事件驱动,而不是纯粹的随机过程。供应商月末集中付款、客户季度末回款、年度税费清算,这些事件造成的波动通常有明确的前置信号,但GARCH这类模型很难把事件信号纳入建模框架。
机器学习模型的优势恰恰在这里。树模型可以自动处理离散的日历事件特征、账期结构特征、客户集中度特征,不需要像GARCH那样假设收益率服从某种参数分布。我后来在设计特征时,把“距离月末还有几天”“本月已过大半”“是否有大额合同约定回款”这类特征直接扔给树模型,效果立竿见影。这在GARCH框架下几乎不可能实现。
2. 数据准备:现金流数据的坑比你想的多得多
2.1 数据源选择与标签定义
我拿到的数据是财务部导出的银行流水,大概三年的日频现金净流入序列。单看汇总表还蛮规整,但一打开明细就发现各种问题:有的银行流水按交易明细记录,一天有几十笔;有的是按日汇总,只有一条。如果不做统一的日频聚合,后面所有特征计算都会出错。
数据源方面,强烈建议以银行流水为主,结合应收应付台账做交叉校验。不要直接用利润表的“净利润”去推现金流,那是间接法口径,滞后严重且只反映经营结果,无法体现资金的实时动态。更合理的做法是:以“实际收付款”为唯一口径,把融资性现金流、投资性现金流和经营性现金流分开标记。
标签的设计是第一个关键门槛。由于波动性不可直接观测,我需要用一个可计算的代理指标来定义它。金融领域最常用的是历史波动率,也就是对数收益率的滚动标准差。但现金流数据不是金融资产价格,有些天净现金流是0,取对数会出问题。
我采用的做法是:先计算每日现金流入、流出、净额三个序列,然后对每个序列计算对数变化率,如果当天为0或者方向发生跳变,就单独做截断处理。最终标签使用未来30天的日对数变化率的标准差,并做了年化处理。公式大致是这样:
[ \sigma_{t,30} = \sqrt{252} \times \operatorname{std}(r_{t+1}, r_{t+2}, ..., r_{t+30}) ]
其中 ( r_t = \ln(1 + \frac{C_t - C_{t-1}}{|C_{t-1}| + \epsilon}) ),(\epsilon) 是防止除零的小常数。这里年化因子252是金融市场的年交易日数,方便把日度波动转化为年化口径,便于内部对标。
2.2 特征工程的几个关键思路
特征是整个项目最花心思的部分。现金流数据的信噪比极低,如果没有结构化特征的辅助,模型几乎学不到规律。我最终沉淀了五类特征:
第一类是滞后特征。现金流序列的滞后值,包括滞后1天、7天、30天的净额、流入、流出,以及当期波动率在滞后7天、30天的对应值。这类特征捕捉的是序列的自相关性。
第二类是滚动统计特征。以7天、30天、90天为窗口,计算现金流的均值、标准差、分位数(25%、75%)、偏度、峰度、变异系数等。这类特征刻画的是历史波动形态。偏度和峰度特别重要,因为它们能捕捉现金流分布的“肥尾”特征,而肥尾往往意味着大额异常交易出现的概率在上升。
第三类是日历特征。月末、季末、半年末、年末、节假日、发薪日、纳税申报截止日等。这类特征不需要建模,直接作为离散标志位输入。实际效果出奇地好,尤其是“距离月末还有几天”这种连续变量,对现金流波动有很强的解释力。
第四类是业务特征。应收账款的账期分布、客户集中度、未来30天到期合同金额、大额付款计划等。这部分数据财务系统里通常都有,只是需要额外花时间接口提取。
第五类是外部特征。贷款市场报价利率、汇率波动、行业景气度指数等。这类特征对解释宏观环境导致的整体波动放大有帮助,但对日常经营性现金流贡献较小。我做了几轮验证后,只保留了和自身业务相关性最高的两个外部变量。
2.3 数据清洗中容易忽略的细节
数据清洗这块,有几个坑是必须单独说的。
第一个坑是大额异常交易。某天账上突然进入一笔一个亿的过桥资金,第三天又原路转出。这笔钱对净现金流产生了巨大冲击,但它属于非经营性资金调度,不应该作为模型学习的常规信号。我的处理方式是增加一个“是否当日存在大额非经营交易”的标记位,而不是直接删除,因为这类资金调度本身也是现金流波动的一部分,完全剔除会失真。
第二个坑是银行结算日和节假日的影响。春节前一周和节后第一周,现金流模式截然不同,如果用普通工作日特征去拟合约等于逼模型去记忆噪声。我把春节、国庆等长假的前后三天单独打了标志位,让模型自己决定这些时段的权重。
第三个坑是交易日对齐。有些银行流水是不含周末的,有些则包含周末的交易积压记录。如果不统一对齐,滚动统计特征会在窗口边界处产生跳变,导致特征分布不稳定。我最后统一按自然日构建时间索引,周末的现金流归集到最近的交易日。
3. 模型选型:从树模型到时序模型的对比实录
3.1 树模型、LSTM、Transformer的实测对比
模型选型阶段,我做了三套方案的对比实验。第一套是LightGBM和XGBoost为代表的树模型,第二套是LSTM,第三套是Transformer。之所以没有尝试传统统计模型,是因为GARCH在那个阶段已经被我用SQL做过一轮探路,效果确实一般。
LSTM的表现是最让我失望的。按常理说,现金流是一个时间序列,LSTM应该是顺理成章的候选。但实测下来,LSTM在测试集上的RMSE比LightGBM高了接近20%,而且在极端波动日的召回率上差了更多。原因并不复杂:三年日频数据一共才750个样本,现金流序列又没有股票分钟数据那么丰富的微观结构,LSTM能提取的有效时序依赖非常有限。数据量不足、信噪比低,深度学习模型的优势根本发挥不出来。
Transformer在这个场景下的问题更明显。现金流序列的“长距离依赖”其实很弱,主要是短期自相关和周期效应主导。为一个只需短期记忆的任务引入庞大的注意力机制,不仅训练慢,还容易过拟合。我把Transformer的预测结果和LightGBM做了SHAP对比,模型的注意力权重分布规律性很差,基本学不到可解释的业务模式。当然,如果数据是小时级或者分钟级的现金流流水,样本量过万,Transformer可能就有用武之地了。但在日频、三年的规模下,它显然不是最优解。
3.2 为什么树模型最终胜出
树模型能胜出,核心原因是它处理“混合类型特征”的能力太强了。
现金流波动性预测需要同时处理连续特征、离散特征、循环特征(月份、星期几)、缺省值,甚至还有类似“月底还剩3天”这样的相对时间特征。LightGBM在特征分裂时天然支持类别特征的离散化,不需要做痛苦的特征标准化、嵌入化设计。这在这种业务背景复杂、特征来源多样的场景下,节省了大量工程成本。
另外,树模型对分布漂移的鲁棒性在一开始是被我低估的。你可能会问:机器学习模型中的树模型是假设独立同分布的吗?严格来说,树模型并不做出很强的统计假设,它的核心逻辑是递归划分特征空间,寻找决策规则。在现金流这类非平稳、分布不断漂移的数据上,这种“局部拟合”策略反而比全局参数化模型更稳。当然,这不意味着树模型完全不需要处理分布漂移,但相比LSTM必须做序列输入归一化、嵌入向量估计等工作,树模型对数据的“糙”容忍度显然更高。
3.3 特征重要性背后藏着什么
LightGBM跑完以后,我拿到特征重要性排序,有几个发现让我对业务理解更深入了一截。
排在最前面的特征不是滞后波动率,而是“距离月末还有几天”和“未来30天到期付款计划总额”。这说明现金流波动的主驱动因素是财务日历和合同账期,而不是资金链自身的惯性。这有点反直觉,但想想就明白了:现金流是业务事件的结果,不是随机游走。
其次是滚动90天变异系数。这个特征能捕捉到近一个季度波动的相对稳定程度,模型通过它能判断当前是处于波动率升高阶段还是收敛阶段。这比单一的标准差特征信息量更大。
客户集中度特征也进了前十。前三大客户回款占月均回款的比例越大,现金流波动性越高。这是一个很符合业务直觉的结论—客户越集中,回款节奏越不可控。
这些发现对业务方的价值甚至比模型本身还大。财务团队可以根据特征重要性的指引,优化合同账期条款,评估客户集中度风险,甚至在“距离月末还有几天”这个特征进入高波动区间前,提前安排资金补充方案。这才是现金流波动性预测真正落地后产生的管理价值。
4. 实操过程:从数据到模型的完整落地路径
4.1 现金流数据流水预处理(Python示例)
以下是我在实验环境里跑的预处理流程,删掉了参数细节,保留了核心逻辑,方便参考。
import pandas as pd import numpy as np # 读取银行流水 df = pd.read_csv("cash_flow_detail.csv", parse_dates=["trade_date"]) df = df.sort_values("trade_date") # 按日聚合收付款 daily = df.groupby("trade_date").agg( inflow=("amount", lambda x: x[x > 0].sum()), outflow=("amount", lambda x: -x[x < 0].sum()), net=("amount", "sum") ).reset_index() # 补全缺失日期,无交易自然日为0 daily = daily.set_index("trade_date").asfreq("D", fill_value=0).reset_index() # 计算日对数变化率 epsilon = 1e-6 daily["ret"] = np.log(1 + daily["net"].diff() / (daily["net"].shift(1).abs() + epsilon)) # 构建30天滚动波动率标签 daily["label"] = daily["ret"].rolling(30).std().shift(-30) * np.sqrt(252) daily = daily.dropna(subset=["label"]).reset_index(drop=True)这段代码里有几个细节值得展开。
使用asfreq("D", fill_value=0)补全日期是一个关键操作,它把周末和节假日的零交易记录显式加进了训练集。虽然一开始我也想剔除这些无交易日,但后来发现保留它们能显著提升特征工程中滚动窗口的稳定性,因为窗口内的时间间隔变成了均匀的自然日。
对数变化率计算时,我加了1 +的操作,避免净现金流为负时无法取对数。实际操作中,如果当天净额恰好是负值,变化率会被压缩到-100%到0之间,这虽然不等价于严格的数学对数收益率,但作为特征足够用了。
4.2 标签构建的前后处理逻辑
标签构建是这整个项目里最容易出错的地方,也是最需要说明的部分。
我使用的是“中心化滚动窗口”思路,即标签使用未来30天的收益率标准差,而特征只使用截至当日的数据。代码里我用.shift(-30)的方式把未来30天的标签挪到当前行,实现了“特征在过去、标签在将来”的严格时间隔离。
这个过程中最需要注意的,是标签和特征之间不能出现“未来信息泄漏”。我在初版代码里犯过一个经典错误:为了提升LightGBM的效果,对特征做了MinMaxScaler归一化,但拟合scaler时用的是全量数据集。这意味着模型在训练时已经“见过”了未来数据的分布,虽然测试集上的RMSE很好看,但上线后真实预测效果立刻打回原形。
正确做法是,对时序数据做缩放时,只能使用训练集部分的统计量进行拟合,然后应用到验证集和测试集。更稳妥的方案是做“时间序列交叉验证”,把数据按时间分成多个fold,每个fold的训练集只包含时刻更早的数据,验证集只包含时刻更晚的数据。这样才符合真实业务中的预测逻辑。
4.3 特征列表与重要度说明
特征工程的具体列表,我从5类中挑了一些落地的代表构建了建模集。每个特征的说明见下表:
| 特征类别 | 特征名 | 计算方式 | 含义说明 |
|---|---|---|---|
| 滞后特征 | net_1d | 当日净现金流,滞后1天 | 捕捉短期的序列自相关 |
| 滞后特征 | vol_7d_prev | 7天滚动波动率,滞后7天 | 捕捉近期波动趋势 |
| 滚动统计 | vol_30d | 30天滚动收益率标准差 | 短期波动水平 |
| 滚动统计 | cv_90d | 90天净现金流均值/绝对值 | 波动幅度的相对变化 |
| 滚动统计 | skew_90d | 90天收益率偏度 | 判断大额正负向冲击倾向 |
| 日历特征 | days_to_month_end | 距离月末还剩几天 | 捕捉月底资金集中支付效应 |
| 日历特征 | is_quarter_end | 是否为季度末标志位 | 捕捉季末回款、缴税等事件 |
| 业务特征 | ar_dso_30d | 近30天应收账款周转天数 | 捕捉回款节奏变化 |
| 业务特征 | top3_cust_ratio | 前3大客户回款占比 | 捕捉客户集中度风险 |
| 外部特征 | lpr_rate | 贷款市场报价利率 | 捕捉融资环境松紧 |
这份特征列表是最终版,中间经过了好几轮筛选。最初的特征池有80多个维度,包括各种高阶交叉特征、窗口长度不一的统计量,但模型在验证集上的表现几乎没有提升,反而是特征数量越多越容易过拟合。后来我按LightGBM的特征重要性排序做裁剪,把低于阈值且业务解释力弱的特征全部删掉,最终保留20个左右的特征。特征减少后模型在测试集上的表现不降反升,而且训练时间明显缩短。
4.4 训练过程与关键参数配置
训练阶段,我使用LightGBM作为主力模型,并同时训练了一个XGBoost作为对比。两个模型的超参经过贝叶斯搜索调优,核心参数差异不大。
LightGBM的关键配置大致如下:
import lightgbm as lgb params = { "objective": "regression", "metric": "rmse", "learning_rate": 0.03, "num_leaves": 31, "max_depth": 5, "min_child_samples": 20, "subsample": 0.8, "colsample_bytree": 0.8, "reg_alpha": 0.1, "reg_lambda": 0.5, "n_estimators": 500, "early_stopping_rounds": 50, "random_state": 42, }max_depth设为5,num_leaves设为31,主要是为了防止模型在750个样本上过拟合。min_child_samples设得较大(20),确保每个叶节点至少有20个样本,避免树模型学到噪声。reg_alpha和reg_lambda分别对应L1和L2正则化,对现金流这种噪声较高的数据非常有帮助。
训练时我没有直接用普通的train_test_split,而是按时间顺序切分:前80%的数据作为训练集,最后20%的数据作为验证集和测试集。这样能最大程度模拟真实上线场景,因为历史数据训练出的模型要预测的是它从未见过的未来时间段。
4.5 评估阶段:为什么要关注方向准确率
训练完以后,我同时报告了三个核心指标,用来评价波动性预测的真实业务价值。
第一个是RMSE,用于衡量整体误差水平。模型在测试集上的RMSE大约在23%左右,也就是说,预测的年化波动率和实际年化波动率平均偏差大约为23个百分点。这个数字单看并不出彩,但放在现金流数据信噪比极低的前提下,已经相当可观了。
第二个是MAE,用于衡量平均绝对误差。MAE比RMSE低不少,说明模型的表现受少数极端日影响较小,整体预测分布是稳定的。
第三个是方向准确率,这是我认为最关键的指标。我定义“方向正确”为:模型预测未来30天波动率会上升,且实际上升;或者模型预测会下降,且实际下降。方向准确率达到了67%,这意味着在大多数情况下,业务方看到模型提示“资金波动风险上升”时,它说的是对的。对于备付金决策来说,方向判断往往比精确数值更实用。
我还做了一组分位数回归实验,让模型输出5%、50%、95%三个分位数预测,从而构建置信区间带。业务方可以根据区间宽度决定需要保留多少备付金。这个思路借鉴了超短期光伏功率预测里常用的概率预测方法,对财务场景同样有效,就是需要额外花时间调分位数损失函数。
5. 常见问题与排查技巧实录
5.1 典型问题速查表
整个项目下来,我整理了一份问题排查表格,任何做现金流时序预测的人可能都会遇到:
| 问题 | 临床症状 | 解决方案 |
|---|---|---|
| 现金流序列大量零值 | 模型预测结果偏低哑化,波动率趋近于0 | 零值日不做删除,但特征中单独加零值比例标志位 |
| 波动率聚集效应 | 预测结果总是滞后于实际波动变化 | 引入波动率滞后特征和90天变异系数,加快模型响应 |
| 结构性断点 | 模型对某段时间的预测系统性偏离 | 在日历特征中加入大型项目上线、组织架构调整等事件标志位 |
| 极端值干扰 | RMSE被少数超大波动日拉爆 | 改用Huber损失函数替代MSE,或者在训练时对这些样本降权 |
| 时间泄漏 | 验证集指标极好但上线失败 | 严格使用时间序列切分,所有预处理只能用训练集统计量 |
其中波动率聚集效应值得特别说明。金融时序里,波动率往往呈现“大波动伴随大波动”的聚集性,现金流也是一样。刚开始模型预测的波动率总是落后于实际波动变化一两个周期,原因是滚动特征计算的窗口太长,模型只看到了平滑后的信息,无法对短期冲击做出快速反应。我通过同时引入短窗口(3天、7天)和长窗口(90天)的波动特征,让模型既能看到长短期趋势,又能对近期变化保持敏感,这个问题才基本解决。
5.2 数据泄漏的经典坑和防范策略
数据泄漏是时序预测任务中最隐蔽、最致命的坑。除了前面提到的归一化泄漏,我在这个项目里还踩过一个更隐蔽的坑。
在构建滚动统计特征时,如果窗口计算包含了当天的数据,而标签又是基于未来30天计算的,那么当天作为“当前信息”并没有问题。但有些财务系统里的应收台账数据,记录的是“截至本日累计应收金额”,实际含义包含了未来合同的已开具发票信息。如果直接把这份台账数据作为特征输入模型,模型等于提前看到了未来回款的确认信息,明显是泄漏。
防范策略是我后来定的一个死规矩:所有特征在构建时必须能追溯到“历史时点上的可得信息”。换句话说,每一行数据的特征值,必须是在该行时间戳当天实际能查到的数据。应收台账里的“未来合同金额”必须经过账期拆分才能使用,不能直接丢给模型。这条规矩写进了团队的建模规范,后面所有日期类特征都用前向窗口验证逻辑做了一道校验:
# 校验特征是否泄漏的简易方法:检查特征在时间t上是否存在未来信息 leak_check = df.groupby("trade_date")[["feature_column"]].apply( lambda x: (x.index > x.index.max()) )这个办法比较粗暴,但能快速定位哪些特征的行索引和特征值之间存在时间倒挂。
5.3 节假日和特殊日期的处理办法
节假日对现金流波动的影响非常显著,但处理起来没有统一答案,必须结合业务场景做个性化处理。
我的做法是先做探索性数据分析,看每一天和节假日的相对位置对波动率的影响。比如春节前第3天到春节后第5天,现金流波动的均值和方差都明显升高;而端午、中秋这种节假日,影响就要小得多。不同节假日的影响窗口长度不一样,不能只用一个“节假日前后”标志位蒙混过关。
我最终把节假日拆成了多个细分特征。春节是一个单独的类别,分成“春节前5天”“春节后5天”“春节假期中”三档;其他法定节假日统一用“节假日前后3天”的标志位。月底和季末同样处理,季末的效应比普通月末更强烈,因为涉及纳税申报和考核节点。这些细节特征加进去之后,模型在节假日附近的预测误差明显下降。
5.4 上线部署后的监控策略
模型上线后,监控比预测本身更重要。我设计了一套轻量级监控脚本,每个交易日结束后自动计算当天的预测波动率与实际波动率的偏差,如果偏差连续5天超过阈值,就触发告警通知团队。
告警不是用来直接干预模型预测的,而是提示业务方去检查是否有新增的重大变量在特征中没有体现。比如新签了一个大客户导致回款节奏变化,或者公司调整了付款周期政策,这些结构性变化短期内不会体现在历史特征里,但会直接影响波动性预测的可靠性。
我还建议团队每个月做一次特征分布漂移检测,使用PSI指标判断模型输入特征的分布是否和训练期一致。如果PSI超过0.25,就说明特征分布发生了显著漂移,需要重新训练模型。现金流这只“钟摆”晃动的逻辑从来都不是一成不变的,模型定期校正才能保证长期有效。
6. 实操心得与后续可以扩展的方向
最后分享几个实际操作中的体会。
现金流波动性预测这个项目,技术难度其实不高,难的是把业务问题转成一个靠谱的机器学习问题。如果一开始就直奔算法,不做标签定义和特征工程的深度思考,后续再好的模型也救不回来。我见过不少团队在这个项目上折腾了好几个月,最后发现连“波动性该用什么指标定义”都没达成一致,这就是业务理解和技术实现脱节的典型症状。
关于模型选型,我个人的建议是:在数据和算力都不是“海量”的财务场景下,优先尝试树模型家族,效率高、可解释性强、调参成本低。LSTM、Transformer这类模型不是不能用,而是只有当样本量、特征复杂度和业务响应速度都达到一定阈值后,价值才会显现。如果你正在做一个类似的项目,不妨先把LightGBM的baseline跑通,再考虑是否升级到深度学习方案。
这个项目后续有几个方向值得继续拓展。一是引入业务约束的机器学习思路,类似“物理约束的机器学习”,把财务中一些硬性规则(比如月度支出不能超过可用资金上限)作为损失函数的惩罚项,让预测结果更符合实际业务逻辑。这个方法在光伏功率预测和气候模型里已经有不少应用,财务场景还很空白。二是可以尝试分位数回归,直接预测现金流波动的置信区间带,让资金团队在决策时能看到最坏情况和最好情况的边界。三是如果未来能覆盖到小时级或者周级的流水数据,样本量显著变多,可以重新评估LSTM或者Transformer在捕捉更细粒度现金流动态上的能力。
项目本身不是终点,探索这些方向的过程,才是这笔投入最值钱的部分。