一个每月靠家里转账过活的留学生,最怕的问题不是"这个月花了多少"——银行App早就把答案摆在那儿了。真正没人回答的是另一句:我能撑到发薪日吗?今天还能安全花多少?
Subarna是加尔各答的一名大三学生,也是我的队友。他妈妈每月给他打一次生活费,那就是全部预算:一笔转账,然后撑一个月。每次掏钱之前,他都要掏出手机,在心里算一遍这笔账。算错的代价不是饿几天,而是得开口向家里再要钱。
![]()
所以我给他做了个叫 Broke Date 的东西。它在他自己的笔记本上读银行流水,学他真实的消费习惯,然后把剩下的这个月推演500遍,只为回答那个他唯一在乎的问题:这笔钱我花得起吗,代价是什么?
为什么是500遍,而不是一个数字
普通记账软件停在"追踪"这一步,而真正的问题是"如果我这么花,接下来会怎样"。这是个预测问题,需要预测模型。
核心用的是 TabPFN——一个面向小表格的基础模型,把数据行喂进去,它直接给出预测,不需要训练循环。这一点很关键:一个学生只有大约300天的数据,从零训练任何模型都远远不够。
它先预测的不是一个数,而是分布。对未来的每一天,TabPFN 会给出99个分位数,输入只有14个特征:余额(以及距离发薪日每天可用的余额)、过去3天和14天的消费、日历信息(星期几、距上次和下次生活费的天数、节日、考试周、当天到期的账单)。"明天大概花160卢比"这种答案毫无用处,分布才是重点——有些天是20卢比的奶茶日,有些天是600卢比的生日日。
然后从今天的余额出发,每一条未来路径一天一天地从分布里抽样,把新余额再喂回去,一直走到发薪日。钱少的时候他会少花,而因为余额本身就是一个特征,模拟也学会了这一点。一个计划的"价格"用天数衡量:同样的500条路径、同样的随机抽样,只是加上这个计划。在样本数据里,周六那场电影要花掉2.05天的续航。
"今天能安全花多少"是怎么算出来的
仪表盘上那个头条数字,是同一套把戏反过来用。把500条未来路径分别按今天花掉0卢比、100卢比、200卢比……重跑一遍,找出在破产概率低于他舒适线(默认10%,可以自己改)的前提下,他最多能花多少。在样本数据里,这个数字是700卢比。
还有一件几乎没人碰的事:预测时返回完整分布,它的累积分布函数里包含尾部。用常规的99个分位数,任何超过第99百分位的东西看起来都一样,一笔百分之一概率的消费和一笔万分之一概率的消费根本分不出来。有了完整分布,每笔消费都能拿到真实概率,概率低于1/33(且金额超过100卢比)就会被标记。在合成流水上,它标出了一笔699卢比的手机充值——而他这类消费通常在167到400卢比之间。
整个设计只有一条规则贯穿始终:它从不教训他。没有红色的"你超支了"横幅,没有负罪感。它只告诉他一个计划要花掉多少天,选择权留给他自己。
Subarna在自己的笔记本上、用自己的真实银行流水跑了一遍。他说:"我想要这样的东西很久了。我在网上试过很多,但它们全都要我的银行信息,所以我从来没用过。我没想到AI居然能在i3上跑起来。我会每天都用它。"
第二句话就是整个设计说明书。他早就放弃了所有索要银行信息的工具。而这个工具从不索要,因为它根本不需要:他的流水、模型和答案全都留在他自己的笔记本上,没有上传给我,也没有上传给任何人。
他用的是一台搭载英特尔酷睿i3的惠普笔记本,所以我就是照着这类机器做的,所有测试都在i3加集成显卡、关掉Wi-Fi的条件下完成。真实版本完全离线运行,演示是一段录屏,录制时Wi-Fi是关着的:导入流水、500条未来路径、向聊天提问、异常消费及其概率、时间机器,以及应用自己统计的对外请求次数——零。
想自己点一点?仓库里能构建一个不发起任何网络请求的样本数据预览:跑完构建命令后打开它,用开发者工具看网络面板,它会一直空着。
关于数据:Subarna在自己的笔记本上用真实银行流水运行了 Broke Date,那些数据从未离开他的电脑,他的任何数字也不在这篇文章里。所以下面每一张图表、截图和结果,用的都是两份合成数据集之一,每个数字都会标明用的是哪一份。
最后,我做了大多数记账应用跳过的那一步:让它给自己打分。我逐日重放了一个模拟学生一整年的生活,问它在多少次"钱花光"之前发出过预警。答案是:五个糟糕的月份里,它提前警告了四次。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.