GitHub日历

一些回忆

谭显英

2022/01/08

缘由

今日在回益辉兄一个评论时,突然意识到,从2015年年中开始混迹于GitHub后,从未有如此长时间不码字的时候——说明我2021年实在太惨了。于是乎截取了这些年在GitHub上混迹的足迹1,做点小小的回顾,以作纪念。

2015

2012年开始实习,发现了自己对于码字的那份发自肺腑的热爱。从Excel、VBA、VB.NET再到R,从写简单的脚本解决问题,到开始系统性地学习编码规范,学习R包,看专业的书籍和文档。2015年年中,去希腊休婚假。去程的飞机上,我开始编写了人生中第一个R包(供公司内部使用的),10多个小时的旅途,好像很短。

下半年开始用虚拟机部署开源的shiny server,还做了个境外投资交易管理系统(Shiny + DT),实现了指令下达、风控审批、清算结算、头寸管理等一系列功能——这就是为什么我对资管所有运作环节都很清楚的原因。

2016

2016年,刚开年股市就迎来2次熔断。整个一年就是不停地写报告。年中又是一顿折腾,期间被派到意大利的里雅斯特(Trieste),忠利集团欧洲投资公司总部,学习了半个月,码字的频率明显减少。下半年,股市反弹转好,我的报告工作似乎又没有那么忙了——继续码字优化日常工作。

不过这一年还是有成果,年初把所有原来VB.NET写的系统界面全部换成了Shiny。年末,针对日常工作中存在的大量不便之处,写了一个新的R包。每天自动数据库进行同步,把数据转换为便于使用的形式后落到硬盘,然后通过这个R包来提供统一快捷的函数,满足工作使用需求。

这是码力提升后,第一次进行的高层次抽象尝试,开始对于I/O,数据使用模式,架构等方面有了一些初步的感觉。

这一年,一直断断续续地在看C++的材料。为什么要学C++呢?因为作为一个非专业码农,一直有自卑心理,因为对于计算机更底层的事情似乎一窍不通。另外,这两年都在做一些多因子模型的工作。在一些数据处理的环节,我深刻地感觉到,R基本能满足我绝大部分需求。但是,某些特定场景(无法向量化,对于数据细节处理细节控制很强,需要组织管理大量代码)时,一个静态语言和R这个动态语言的结合,是最为适合的。而C++由于兼容C自然就和R语言能够完美融合,而且速度很快——我想我有朝一日会需要这个特性,于是就尝试着开始学习C++。

我对于自己码字能力自信心就是从这个时候逐渐建立起来的。因为,我发现自己能够在地铁上、吃饭时、睡觉前不停地看C++各种技术细节的书籍和文档(Scott Meyers的所有书我都看了好几遍),还不觉得累。于是意识到,真心的热爱就是最好的天赋。

就是在这个时候,我建立了不同工具适用于不同场景的概念,并开始有意识地关注到不同技术和工具的适用场景以及优劣势,不断锻炼自己trade-off的能力。当然,我很快发现C++是一门极为复杂庞杂的语言,短时间掌握全部是不可能的,于是后面就只关注C++11这个范式下的使用——对于我的使用场景,非常合适。

2017-2018

帮手成长起来了,能把组合管理(杂事俱乐部)的工作基本承担了,开始想专心做量化投资相关的工作。从之前经验意识到,必须要有一套标准化速度快的回测模型,以及一套能够便于管理因子的因子模型。这个时候,也有了个量化的帮手。于是,从2017年下半年开始,我们两个人便集中精力多因子量化的基础工作。

从这个时候开始,对于大型模型代码的组织管理方式,数据的存储方式,我有了更多深入的思考。

然而,好景不长。2017年风格切换、2018年股市暴跌量化非常难做。2018年年中去日本玩,结果当天晚上地震6.1级,太太胆小非要回去…回来后就发现组合管理的帮手提出了离职…

于是,整个2018年下半年,就是在接替帮手的空缺。暴跌就意味着无尽的报告,下半年基本全身心地投入到应付中,量化从此再也没有全身心投入时间过了。

2018年年初,由于用虚拟机的shiny server不支持并发,越来越卡。年初花了写时间,对开源的Shiny Proxy进行了一番研究后,决定把shiny server的架构搬迁到Shiny Proxy架构的部署。由于前期有学C++的经验,发现学一丢丢Java和Spring框架来改造Shiny Proxy我也可以应付。

此外,1月还收到了益辉兄邀请我一起维护DT的邮件,开始了真正的码农之旅。正因为益辉兄的鼓励,我开始尝试着把困扰我2年多的data.table的中文bug彻底解决了——这一点,我至今都感到很自豪。

2019

3月份,组合管理的新帮手终于入职了。但是,保监会和银监会合并后,监管对于数据的要求急剧增加。此外,还要从新培养帮手,基本没有时间搞任何别的事情。

但是,由于量化的帮手还在,此时看到私募量化基金收益比较好的,都是使用深度学习的高换手策略(T0我们这种机构就别想了),于是乎18年底就开始慢慢探索这种模式,一直到19年初。此时,老领导要去纽约陪娃上学,离职了,又是一顿忙(伺候新领导)。然后,量化帮手就被安排各种报告工作…很快他又觉得这样下去不行,又离职了…Great.

2019年年中,科创板注册制发行了第一批新股,然后猛然发现打新又变得这么赚钱了。正好10月份,一家私募找我们合作发FoF打新的产品。这个时候,我开始发现我对于产品设计——就是对监管的各种要求、客户的需求、投资的需求进行灵活的组合——感觉还是有的。

2020

19年年末小神兽出生,开始了一系列的忙碌。20年2月份,偿付能力二期工程测试,疫情在家的我,白天要设计打新产品方案、测算、路演,晚上要写读文档写程序校对答案,连续作战5个通宵,硬是把这么麻烦无比的偿付能力二期工作,搞成了可以自动化的模型。这就是为什么我们是几乎的唯一一家监管没有检查出来报送错误的公司。

但是,我工作的悲哀就在于,这又怎样呢?我们公司就几乎没有人知道——就算知道了也不关心——我把这个偿付能力二期工程一个人搞定了,还搞这么好。

这个时候,我就开始对于工作产生了一种厌倦和怀疑。

当然,2020年是一个收获满满的一年。部门主导的这些打新产品,最后发售了100亿左右(对冲打新、二级打新、结构化打新等)。为了管理10来个产品的期货对冲,又对交易各个环节进行了一系列优化。

2020年10月,公司为满足监管要求进行所谓的"两网分离"——办公网和交易网分离。这个时候涉及到一系列的机房和网络的变更。但是,由于历史原因,我们资管公司和寿险公司的一部分网络机房是共用的,导致了一个非常奇葩的问题:职场到服务器机房的网络速度非常慢,而且不时地会断线。而我的程序会大量从数据库取数据,这样就经常性地出错。于是乎,花了1个月的时间,把大部分程序搬到了机房服务器上(规避速度慢的问题)。另外,由于机房不能连接互联网,而我的系统实在太庞大了,有一部分需要用到互联网的信息。

于是,又通过一系列的操作,硬是搞成了看上去是本地运行,其实有很大一部分是在服务器运行,但整个体验和原来一模一样的模式。此外,我还对于数据库链接进行了处理,在探测到是网络异常错误的时候自动重试。另外,由于大量工作只有弄到本地才能完成。因此,很多交互性的工作我还是需要数据传输到本地中。为了解决这个问题,我写了一个内存的缓存机制以及一个硬盘的缓存机制。

另外,年初的时候就意识到,此前那种数据落到本地的模式,适用于量化分析这种数据量大的场景,但是不适用于组合管理这种数据量没有那么大的场景。因为,我必须要维护一个本地数据备份,然而数据同步是非常麻烦的事情。此外,对于原来组合管理数据表的结构和设计,我有了更为深入的理解。于是双管齐下,对于表结构进行了系统性的重构,并且重新写了一个包,不再落地而是直接通过SQL查询+缓存的方式来计算。这样,这个包里面计算出来的数据永远都是对的,最新的而且速度还特别快。

这个工作真的非常不容易,因为2000多亿+200多个产品的投资组合管理,数据极为庞杂而且每天都在不停地使用。我需要在保证业务不中断的情况下,抽出我仅有的时间来完成这一系列更换动作,而且还要保证数据是完全一致的。我是很满意自己表现的。

但问题仍然是,so what? nobody knows. 因为,这个工作就和扁鹊一样,治的是未病。大家只能看到灭火,看不到那些永远都不起火的地儿。

通过这一年的折磨,我对于系统的维护性和架构设计有了更深入的认识。

2021

前面几个月就是正常的工作,以及交接。6月份去新公司后,几乎就没有再碰过程序。

一直到10月底,终于可以喘息,抽空把组合管理数据库启了。由于新公司没有历史包袱,原来的系统复杂度可以大大降低,于是,我几乎是在两周的时间内(包含配置机器,部署RStudio Teams的时间),把原来的系统的数据部分整个重构了一遍。现在,新加一个字段,或者更改一个视图,都可以通过yaml配置表的方式来完成,再也不用去PL SQL的界面里人工搞来搞去了。而且,这样的好处是,数据字典什么的,自动就生成好了。最后的好处是,这样标准化的方式,我就能把数据维护的工作(大量非标准化证券信息的录入等),分给IT同事来完成,我只需要从他们那里抓数即可。

尾声

这两年,我越来越感觉到,自己和这个环境有着明显的冲突。我愿意去提供专业知识的咨询服务,设计系统架构,这是我擅长且能为公司提供最大价值的事情。但是,在公司里,就不得不参与无穷的会议,无尽的事务性工作,大量的精力被消耗浪费。尤其是,本来时间少和事情多时,这种感觉极为明显。因为,只要我在工位上,就会有很多人来问我各种各样的问题。所以,我本来可以专心工作的时间就不多,再浪费1-2个小时在会议中,我都感觉很难接受。

另外,我深刻地感受到,对于创造性的工作,我必须要进入一种“心流”(mental flow)的状态。碎片化的时间,是完全不行的,只能用来完成事务性工作。然而,我的价值不就在于创造性的工作么?不就在于做别人做不了的事情么?系统化地提高效率么?

但是,在公司,我就不可能这样。就算提高了效率,也会被更多的工作和要求所吞没,或者被更多的内卷性事情把富余的时间浪费掉。


  1. 这些足迹一部分是我在开源社区混迹的,但还有大部分是工作需要而留下的,保存在私有仓库中 ↩︎