Revisiting 因子投资的 1024
学术
金融财经
2023-10-24 18:31
四川
【写在前面的话】这篇推文的由来得归因于川总写量化。起因是闲来无聊,我在朋友圈分享了这篇四年前的旧文。川总评论说应该 revisit 一下,补充上 chatGPT。我觉得很有道理,因此重发这篇小文章,并稍作补充。
首先,如川总现在对我们影响最大的应当是 chatGPT 以及相关的工具(未来 copilot 和微软全家桶也可能显著影响大家的工作习惯和惯用的工具)。ChatGPT 在写作、数据分析、文献梳理和总结、idea 头脑风暴,以及 code demo 等方面都可以带来显著的帮助,大幅提升我们的工作效率。甚至我也时不时会想,公众号是不是应该停更了(非常期待您留言告诉我您的意见和对公众号进一步的期待)。其次,这四年间,我完成了博士学业并正式进入学术界。但我们也知道,学术研究和业界的研究其实是紧密相关的、在很多地方高度类似(至少对于因子投资和资产定价的研究而言),因此,我们可以看到,本文讨论的这些工具,在学术研究中往往也得到普遍的应用。不仅如此,这几年我们也看到,一些学术界流行的分析工具,例如 stata,也开始接受、普及文本化编程等思想和工具,从而大大便利了研究人员的分析和写作。最后,有少量工具有一些更新。例如,文献惯例方面,虽然 Mendeley 仍然流行,但基于各种原因,用 Zotero 来进行文献管理的人越来越多。此外,overleaf 在论文写作的合作上也占据了越来越大的份额。最后,随着机器学习和大数据的流行,研究人员对于可以便利地同步和分享数据的网盘的需求也越来越强,国外 dropbox 大概是最为主流、便利的工具,国内有一些替代品,但仍存在各种限制。如果您有什么国内好用的网盘推荐,也非常期待您留言分享给大家。
1. 背景
今天 1024 程序员节,咱们也凑凑热闹,来唠嗑唠嗑我们研究常用的一些工具。说起来,做量化投资与因子研究,也得算半个程序员吧,那么,我们就从编程语言说起吧。
2. 编程语言
今天 1024 程序员节,咱们也凑凑热闹,来唠嗑唠嗑我们研究常用的一些工具。说起来,做量化投资与因子研究,也得算半个程序员吧,那么,我们就从编程语言说起吧。近几年,随着数据科学和人工智能的兴起,python 成为最热门的数据科学语言,在量化研究领域,也是当红炸子鸡。Python 的兴起与其优势密切相关。本身语法简单明了,近年又不断迅速扩充完善了数据分析和机器学习、深度学习的库,可以便利地实施多种算法,加之其胶水语言特性,即便有一时不好解决的问题,灵活调用其他语言也可较为高效地处理。此外,作为一门开源、免费的语言,有着庞大而友好的用户社区,也极大促进了其发展。其中,以 numpy/pandas/statsmodels/sklearn 为基础的庞大科学计算库和以 matplotlib、ggplot、seaborn、plotly 为代表的可视化相关模块,使得 python 对于量化与因子研究而言极其便利。此外,Cython 和 numba 等拓展库还可成倍地提升计算效率,也是非常有用的利器。当然,python 近年在数据科学方面的不少库,是借鉴统计分析语言 R 而来的,例如,pandas 及其基础的 DataFrame 数据结构就是受 R 的启发而来,当然也做了大量的拓展。此外,绘图库 ggplot 也借鉴自 R 的 ggplot2,大量的机器学习库也参考了同类 R 包的开发。事实上,近些年,在数据科学领域,python 和 R 之争还是蛮激烈的。虽然如今 python 占据优势,在未来大概也会保持优势地位,但也不代表 R 就毫无用武之地。首先,仍有部分较为前沿的统计学习算法只有 R 包可用,或虽然大家都有,但 R 包的实现更准确。其次,跟 python 类似,早年 R 被诟病最多的是效率问题,且有过之而无不及,但 R 的底层其实是 C 语言写的,非常高效,同时与 C++ 、python 、spark 等都有便利的 API 可用。此外,近几年 R 出了一系列新的数据格式和库,其中,data.table 包对于最多 100 G 大小的数据,I/O 速度远快于 python,常见的数据处理操作的效率也非常高(谁用谁知道,相当爽);同样近两年新发布的 tidyquant 包,对 R 过去最为经典的数据分析包 tidyverse 进行了全新的拓展,用以高效地处理金融分析,尤其是投资组合的建模和分析。例如,可以非常优雅地利用 tidyquant 构建股票组合,并对组合表现进行滚动的 Fama-French 三因子分析。此外,matlab 也有不少使用者,其在科学计算方面其实可能是最好的工具。但颇为遗憾的是,作为商业软件,matlab 的版权很贵,对于大部分研究人员来说,可能并不值得每年花巨额资金购买其版权。3. 文学化编程
我们做相关研究,有两个主要场景。首先是研发策略,以及后续进行实盘交易程序的开发。此外,不少券商研究员、买方内部研究员或学界研究者,还需要依据研究结果,整理、写作报告或学术论文。
报告和文章中难免要涉及不少数据、图表的展示,过去,通常是算好结果,再手动插入到文档中。这样做的结果是,既费时费力(例如,每生成一张表,都要手动调整表格格式),还容易出错(例如,敲错数字,或更新了程序和实证结果,但忘了在文章里更改)。自然,很多人是不乐意这样的。于是,在这个数据时代,所谓的文学化编程(Literate Programming)便逐渐兴起,且在量化与因子研究的报告/文章撰写方面,大大便利了研究者。具体而言,所谓文学化编程,便是将代码嵌入文档,最后编译生成包含计算结果的最终文档。这就不得不提到 markdown 语言了。Markdown 是一种简化的标记语言,最早主要为了便利 html 网页开发,后来随着转换工具的拓展,可以很便利地生成 pdf 、word 等各种格式的文档。通过将代码与 markdown 混排,然后编译,便可得到包含计算结果和文字的文档。由于计算结果会随着代码和其输入数据的不同而改变,因此是动态的。也因此避免了以往人工调整流程的低效率。对于 python 用户而言,大家普遍偏爱的 Jupyter Notebook 便是这方面的代表。通过将代码和 markdown 文字放在不同单元(cell),Jupyter Notebook 知道在编译时如何对待不同单元格,并按照指定要求执行代码,生成文档。此外,也可将生成的结果导出。但 Jupyter Notebook 也有不少局限。对于可视化探索,它是很好的工具,但对于写作而言,却不算非常友好。对于简单的,不需要复杂模板和动态计算的文档(例如简要的笔记等),我会用纯 markdown 写作工具,其中,最常用的是 Typora,非常简洁但功能也足够全面。对于较为正式的写作,尤其是需要一定的格式模板,以及会进行计算,生成图表的写作,我会用 RStudio 。事实上,如果您是 R 用户的话,自然不会对 RStudio 陌生,它是 R 语言最好用、便利的 IDE(当然,VS 也很好用,但不够便利)。得益于目前就职于 RStudio 的两位大神 Hadley Wickham 和 Yihui Xie,RStudio 的功能近几年快速地完善,尤其是对 markdown 和嵌入代码的 rmarkdown 的支持,简直令人发指。怎么说呢,RStudio 事实上不仅支持嵌入 R 代码,还支持嵌入 python、C++ 乃至 sql 等常见语言,只要您正确安装了这些语言并配置好了环境变量。此外,R 本身高效的可视化工具,搭配 RStudio 为 rmarkdown 定制的附加功能,使得利用其进行写作极为便利、高效。通常情况下,只需要创建一个 Rmd 文件,在导言区输入或者选择相关的参数,便可调取不同的模板。同时,也可选择自定义的 tex 或 css 模板,来进行 pdf 或 html 的编译。最后,还提供了一系列学术期刊的 Rmd 模板,支持按照指定期刊的格式写作文章。以我个人为例,每一篇推文,我都利用 RStudio 写作底稿,然后编译 html 网页,辅助推文的编辑。同时,也利用我自己的 tex 模板,来生成带有我们公众号水印和特定格式的 pdf 版本文章(当然,还需要对生成的 tex 进行一些细节调整和检查,这也是 pdf 版本的发布会慢一些的原因)。包括您现在读到的这篇,同样也是这样。此外,我自己的学术文章,也是用同样的方式写作。当然,那时就不编译 html 了,而是依据需要,分别生成 tex/pdf 或 word,再行细节调整。事实上,RStudio 还可以用来写书。通过 bookdown 包,可以完成写作,并制作网页版的 gitbook、pdf 或 epub 电子书。我们去年发布的关于 FoF 的小册子FoF的前世今生:从资产配置到因子投资就是用它来写的。4. 文献搜集和阅读
我们知道,除了 coding 和写作,阅读文献对研究而言也非常重要,毕竟这是我们极为重要的灵感源泉。我们也简单讨论一下这方面。首先,在文献来源方面,强烈推荐 Researcher app,通过该 app 关注感兴趣的期刊,其可自动推送相关期刊最新的文章的摘要和链接。这些文章可都是 article-in-press 版的(预印版),使得你可以非常及时地跟进相关领域的前沿研究。在文献下载方面,如果在学校的话,自不必说。对于其他研究人员,一种常用的方法是获取文章 DOI,然后通过 SCI-HUB 或类似网站获取电子版进行学习。而在文献阅读方面,个人觉得最舒服的当属 mendeley 。可以便利地记笔记,分享文献。同时,也可以同 researcher app 关联。此外,mendeley 可以协助进行文献引用的管理,非常得便利。5. 文档和项目管理
不管是 coding 、写作还是阅读,我们必然会积累大量的数据和文档。那么,如何妥善管理这些资料呢?我们需要的是项目管理工具,最好还支持代码和文档管理(我想大家都受够了合作中,几位合作者不断给文档加后缀的崩溃经历吧),而且,还要是私密的。
基于这几点,从我个人的使用经验来看,推荐基于 Git 的云项目管理服务,其中,尤以国内的 coding 和国外的 gitlab 为主。Git 类服务和项目管理其实正是程序员们最常用的工具之一。而说到 Git 服务,最自然、最好的自然是 GitHub,但 GitHub 创建私有库要收费,且国内登录 Github 速度并不稳定。因此,我个人使用最多的是国内的 coding(目前好像被腾讯云收购了),可免费创建 100 个私有库,且连接速度较快,我自己用了近 2 年,安全性看起来也还好。此外,跟小伙伴合作,也用 gitlab 。当然,如果是团队使用的话,也可以考虑自己在本地搭建 Git 或 SVN 服务,其中,后者更偏向图形用户界面,上手更简单。6. 结语
本来想趁着 1024 简单唠一唠,结果,作为 R/python/Git 粉,一不小心就说多了。废话不多说,就假装我们也是程序员,祝您节日快乐,做出更多有趣、有价值的研究成果。
题图:Pink White Black Purple Blue Textile, from www.pexels.com.