01 一个让人失眠的求助
凌晨1点,手机屏幕亮了。
一个做量化策略研究的朋友发来消息:“睡了没?我这有个活,感觉干不完了。”
第二天见面,他打开电脑,文件夹层层展开,我看到了一个让人头皮发麻的数据规模:
每个交易日:5200个CSV文件,每只股票一个,每个文件6000行逐笔交易记录。一天就是3120万行数据。
每个月的交易日:平均20天。一个月就是10.4万个文件,6.24亿行数据。
一年12个月:125万个文件,750亿行数据。
从2016年到2026年,10年时间:1250万个文件,7500亿行数据。
如果把这些数据打印在A4纸上,每页打印60行,需要125亿页。叠起来的高度能绕地球好几圈。
办公室里安静了几秒钟。我说:“你先说说具体要干什么吧,看完需求我可能更睡不着。”
02 需求本身,就是一场噩梦
你以为只是把这些CSV转成Excel就完了?太天真了。
真正的需求是这样的:
第一步:1250万个CSV文件要批量转换成XLSX格式,而且必须完整保留原有的文件夹层级结构——年份文件夹不能丢,月份文件夹不能丢,交易日文件夹不能丢,每一层都要原封不动地复制过去,只是顶层文件夹名字加个“处理后”以示区别。
第二步:这不是简单的格式转换,而是基于模板的智能统计。转换后的每一个XLSX文件,都要按照一个预设的Excel模板,自动生成一份完整的统计报告。
报告里包含:
成交量(4个细分指标):1B-1S、2B-2S、前两者之和、BC-SC
成交额(4个细分指标):同样的4个组合
成交次数(4个细分指标):同样的4个组合
价格四要素:当日开盘价、当日最高价、当日最低价、当日收盘价
第三步:更麻烦的是——按价格区间做精细统计。
每个股票当天的价格波动范围不一样,先找出最高价,然后根据最高价自动计算步长:小于等于5元步长0.04,大于等于10元步长0.08,大于等于15元步长0.12……以此类推。
然后从最高价开始,按步长逐级向下划分价格区间,直到覆盖最低价。每个区间要统计10种不同类型的成交量、成交额、成交次数——每个区间就是30个数据,几十个区间下来,几百个数据点。
第四步:统计范围还有精确要求——只统计9:30之前最后一笔交易到收盘最后一笔交易之间的数据。开盘价就是9:30前那一笔的价格,收盘价就是当天最后一笔的价格。
听完需求,我说:“这个活,不是人干的。”
03 手动处理?我们来算一笔绝望的账
一个CSV文件6000行数据,数据量不算大,单文件处理也就几分钟的事。但数量是1250万个——问题不在单文件大小,而在文件数量本身。
我们来认真算一下:
单个文件的操作流程:
打开CSV(5秒)→找到9:30的起始行(人工确认,30秒)→找出最高价、最低价(手动筛选,30秒)→计算步长并划分价格区间(几十个区间要手算,至少3分钟)→按区间逐项统计10种类型的量、额、次(30列×几十行,填表5分钟)→填写总体指标和价格四要素(1分钟)
合计:约10分钟。
实际做过这类统计的人都知道,10分钟已经是保守估计。中间还要查公式、对数据、检查有没有漏行。
一个交易日5200个文件:
5200 × 10分钟 = 52000分钟 = 867小时
每天干8小时:867 ÷ 8 ≈ 108个工作日
一个月22个工作日:108 ÷ 22 ≈ 5个月
处理完一个交易日的数据,需要5个月。
一个月20个交易日:5个月 × 20 = 100个月 ≈ 8.3年
一年12个月:8.3年 × 12 = 100年
10年:100年 × 10 = 1000年
1000年。这不是夸张的修辞,这是小学数学。
一个人从北宋干到现在,刚好能干完。
而且这只是时间成本,还没算错误率——第100个文件的时候已经眼花缭乱,第1000个文件的时候已经精神恍惚。区间上限填成下限、某一行漏统计、数字串行,任何一个错误都意味着前面所有的努力付诸东流。
04 那你可能要问:VBA跑这个就很快吗?
问得好。VBA处理单个文件的速度其实比手动快不了太多——程序要做的计算一样也没少,只是不用人盯着屏幕了。
但关键在于:程序是7×24小时不间断运行的。
一个文件从打开、读取6000行数据、完成所有统计、填充模板、保存XLSX,程序大约需要2-3秒。
一个交易日5200个文件:
5200 × 3秒 = 15600秒 ≈ 4.3小时
处理完一个交易日的数据,只需要4个多小时。
一个月20个交易日:4.3小时 × 20 = 86小时 ≈ 3.6天
一年12个月:3.6天 × 12 = 43天
10年:43天 × 10 = 430天
如果7×24小时不间断跑,大约14个月就能把十年的数据全部处理完。
手动要1000年的活,程序只要14个月。
05 但这还不是全部的价值
14个月看起来还是很久,对吧?但你要知道:
第一,这14个月你不需要盯着看。 程序自己跑,该下班下班,该睡觉睡觉,该过周末过周末。机器在干活,你在做更有价值的事情。这是并行的时间——机器时间≠人的时间。
第二,可以分批并行。 实际业务中,数据是逐日生成的——今天收盘后处理今天的数据,明天的数据明天再说。不需要一次性跑完10年数据。每天4个多小时的自动处理,完全可以在收盘后的夜间窗口内完成。第二天开盘前,数据已经就绪。这是流水线式的持续自动化,不需要攒在一起做。
第三,程序不会出错。 同样的逻辑执行1250万次,每一次的结果都是一致的。人可以连续干1250万个文件不出错吗?不可能。这是质的区别——程序给出的是可靠的数据,人给出的是充满风险的数据。
第四,一次投入,长期回报。 这套逻辑写好了,不仅仅是处理这10年的历史数据——新的交易日来了,同样的程序继续跑就行。不需要重新培训、不需要重新招人、不需要重新试错。边际成本趋近于零。
第五,VBA跑14个月只是“最优条件下的极端规模”。 实际执行中,你可以根据业务需求灵活控制:
优先处理最近几个月的数据,历史冷数据可以延后处理;
只处理特定股票池(比如只处理沪深300成分股,从5200只缩减到300只);
多台机器并行,每台分担一部分年份或一部分股票。
没有人在实战中会等到积累了10年数据才一次性处理。这套方案真正的价值,是让你有能力在数据产生的当天就完成处理,做到“日清日结”。
06 很多人会问:为什么选VBA?
市面上有那么多数据处理工具——Python、Power Query、数据库ETL工具,为什么选VBA?
原因很简单,也很有说服力:
第一,门槛最低。 每一位金融从业者的电脑里都装着Excel,都自带VBA。不需要额外安装Python环境、不需要配置数据库、不需要购买第三方软件。双击文件就能运行,这是VBA无可替代的优势。
第二,模板原生。 需求里有“基于Excel模板生成统计报告”这一步。VBA直接操作Excel对象模型,打开模板、填充数据、另存为XLSX,整个过程行云流水。换成其他工具,反而要多一道“把数据导回Excel”的工序。
第三,不挑环境。 这套代码写好之后,发给任何同事都能直接用。不需要解释“先装Python再装pandas再配环境变量”——这些对非技术人员来说简直就是天书。
第四,维护简单。 模板的列位置调整了,改几个数字就行;统计规则变化了,改几行Case语句就行。不需要重新部署整个系统。
在这个场景里,VBA不是“最好的工具”,而是“最对口的工具”。它刚好长在Excel这个生态里,用最直接的方式解决了Excel场景下最复杂的问题。
07 真正值得思考的,是效率的本质
写完这篇文章,我希望你带走的不是“VBA很厉害”这个印象,而是下面这些思考:
当你面对1250万个文件时,你的第一反应是什么?
如果你的第一反应是“我该怎么更拼命地干”,那你可能永远也干不完。
如果你的第一反应是“我能不能换个方式让机器替我做”,那你已经在正确的路上了。
职场里,我们太容易陷入一种“用勤快掩盖低效”的陷阱。每天加班加点做大量重复性的工作,然后感动于“我很努力”。
但真正的努力,是停下来想一想:
这件事,有没有办法让它自己跑?
如果我花几天时间写个工具,以后每个月能省下几百个小时,值不值得?
我现在的忙碌,是在解决问题,还是在逃避思考?
这个案例里的朋友选择了后者——他花了几天时间等人写代码,然后之后每一天的数据处理,只需要启动程序、过夜、第二天取结果。
用几天的投入,换回往后每一天的从容。
这笔账,是个人都会算。
(本文案例基于真实需求改编,如果你有类似的Excel自动化需求,欢迎在评论区交流。)
100句常用VBA代码下载:
链接:https://pan.quark.cn/s/cc8e120cd261
夜雨聆风