量化研究员!你应该如何写一手好代码

即使是Quant Researcher, 写一手高质量的代码也是非常重要的。再好的思路,如果不能正确地实现,都是没有意义的。

写一手高质量的代码的意义,对Quant developer来讲就更是自不待言了。这篇笔记就介绍一些python best practice。


始终为策略研究创建独立的虚拟环境

在量化研究中,很多功能会借助第三方包。第三方包也必然会依赖其它第三方包。如果有两个以上的包都依赖于某一个包,但是要求的版本不同,这就发生了依赖地狱。

有一些量化研究员常常会把自己的研究环境搞坏,就是因为不断尝试新的技术、新的python库,而这些新的库,依赖的第三方版本和原来的发生冲突,强行覆盖之后,导致之前的python库无法使用造成的。

解决依赖地狱问题,需要在不同的层面上进行解决。首先,我们可以通过 conda来为每一次新的策略研究项目,构建一个独立的虚拟环境,即使我们是使用jupyter notebook进行策略研究的,也是如此。

有点软件工程意识的研究员会使用requirements.txt来管理依赖库。但这样仍然是错误的。我们应该使用poetry来管理依赖库。poetry的作用是,当我们通过poetry往项目中增加依赖时,它能告诉我们,新增加的库是否与已有的库相冲突。它还有可能自动帮我们找到彼此兼容的版本。


因此,新策略研究的正确打开方式是:

conda create -n new_project python=3.11
poetry init
poetry add pandas^2.0
poetry add scipy^1.8


pandas和scipy都会依赖numpy。当我们先加入pandas2.0时,它会确定一个numpy版本,随后加入scipy1.8时,此时poetry就会看scipy声明依赖的numpy版本,是否与pandas声明的版本中存在共同兼容的版本。如果找到,则添加成功,否则,poetry将提示我们,重新选择恰当的版本


如此一来,就不会无声无息地失败了。Poetry就像乐队指挥一样,能够帮我们精确地管理各种依赖关系,避免冲突。

书写漂亮的代码

在写代码时,我们会有自己的风格。比如变量名如何使用大小写,单词之间如何分隔,如何使用空格和缩进等等。为了统一风格,Python社区有一个统一规范,称为PEP8。

强制我们的代码遵循PEP8的最佳方式,是使用black作为代码格式化工具。

推荐black的原因是,它基本上不接受定制。实际上,代码风格的定制几乎没有意义。一个人即使长得丑点,你强迫自己多看他几眼,就会发现其实也是能看的。

black的成功就在这地方,它的motto是不妥协的格式化工具。很多事情就是这样,坚持自己的风格,宁可站着死,不愿跪着生,向死而生,反倒是机会。

使用语法检查工具

有很多错误可以在测试之前就找到,这样除错成本最低。如果你是使用Pycharm或者vscode这样的IDE来进行开发,就能随时用上IDE提供的语法检查功能。


很多策略研究员会使用notebook进行探索式开发。现在,我们在vscode中也能写notebook了。在vscode中使用notebook,会比浏览器中使用具有更多的优点,比如:

  1. 它能记住多个编辑插入点,因此我们可以方便地前后跳转。在浏览器中打开的notebook中,要做到这一点,只有一个办法,就是插入标题,通过outline来进行导航跳转。
  2. 语法检查和自动完成。这正是这一节我们提到的功能。
  3. 单元格调试。这点更是比浏览器中的notebook要强不少。Farewell to print!

单元测试:Fake it till you make it!

就连很多正牌的程序员也做不好单元测试。但是这一点非常重要。作为策略研究员,我们并不需要对所有的代码都执行单元测试,但是,如果你创造了一个可复用的轮子,你就应该提供单元测试报告。

测试的意义是, testing leads to failure, failure leads to understand。我喜欢这句话。在我们的量化课程中,我们也掺杂了一些故意让你失败的例子。只有这样,你才会对系统是如何运作的有深刻的理解。在回测中表现得很好的策略,也能在实战中有好的表现。

我们可以使用pytest框架来编写单元测试,它非常轻量易用,大约半天的时间就足够入门了。


单元测试并不复杂,主要难点在于如何将待测试的代码与系统中的其它部分隔离开来。再花上两三个小时,学一下mock的使用,熟练之后,你甚至会爱上单元测试。

如果你在策略研发中,也遇到过环境构建、代码质量不高等问题,可以抽空看看这本书,它的电子版是免费的:


图8~图10是样张。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330372.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity Shader 的模板测试效果

模板测试是渲染管线中逐片元操作的一环,它的作用是筛选出指定模板的片元,而不符合模板的片元会被舍弃,从而做到一个遮罩的效果。 以下是Unity中实践的一个效果: 场景中可以看出,熊模型和茶壶模型都在差不多的位置&am…

idea社区版 MybatisCodeHelperPro插件使用介绍

文章目录 一、插件介绍二、idea社区版安装MybatisCodeHelperPro插件三、问题记录1. DatabaseHelper插件 加载不了部分数据库链接的列信息2. DatabaseHelper插件 数据库列显示顺序错乱3. MybatisCodeHelperPro插件 数据库字段不提示4. MybatisCodeHelperPro插件 特殊字段增加反引…

SpringBoot 统计API接口用时该使用过滤器还是拦截器?

统计请求的处理时间(用时)既可以使用 Servlet 过滤器(Filter),也可以使用 Spring 拦截器(Interceptor)。两者都可以在请求处理前后插入自定义逻辑,从而实现对请求响应时间的统计。 …

汽车芯片「新变量」

编者按:汽车行业的格局重构和技术革新,也在推动芯片赛道进入变革周期。不同商业模式的博弈,持续升温。 对于智能汽车来说,过去几年经历了多轮硬件和软件的性能迭代,甚至是革新,如今,市场正在进…

张驰咨询:六西格玛工具企业如何实现资源优化与效率最大化

在这个百年未有之大变局的时期,我们面临着前所未有的挑战与机遇。我一直在寻找提升效率,减少资源浪费的方法。而六西格玛培训提供了一个系统化的解决方案,它不仅是一套工具,更是一种精益思维。 让我们一起思考一个问题&#xff1a…

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络

VMware workstation安装SUSE Linux Enterprise Server 12 SP5虚拟机并配置网络 SUSE Linux Enterprise Server是企业级Linux系统,适合企业应用。该文档适用于在VMware workstation平台安装SUSE Linux Enterprise Server虚拟机。 1.安装准备 1.1安装平台 Windows…

设计一个网页爬虫

定义 User Case 和 约束 注意:没有一个面试官会阐述清楚问题,我们需要定义Use case和约束 Use cases 我们的作用域只是处理以下Use Case: Service 爬取一批 url 生成包含搜索词的单词到页面的反向索引给页面生成标题和片段– 标题和片段是…

【机器学习】机器学习变量分析第02课

当我们谈论用机器学习来预测咖啡店的销售额时,我们实际上是在处理一系列与咖啡销售相关的变量。这些变量就像是我们用来理解销售情况的“线索”或“指标”。那么,让我们用通俗易懂的方式来聊聊这些变量是怎么工作的。 特征变量:咖啡店的“档…

Spring MVC学习之——自定义日期转化器

日期转换器 在数据库中的日期数据是date类型,而如何我们想在页面自己添加数据,一般是使用年-月-日的形式,这种形式不仅date类型接收不到,而且传来的是String类型,此时,我们就可以自定义日期转换器来接收数…

JVM知识总结

1.概述 JVM指的是Java虚拟机,本质上是一个运行在计算机上的程序,他的职责是运行Java字节码文件,作用是为了支持跨平台特性。 功能: 装载字节码,解释/编译为机器码 管理数据存储和垃圾回收 优化热点代码提升效率 …

【数学建模】2024年华数杯国际赛B题-光伏发电Photovoltaic Power 思路、代码、参考论文

1 问题背景 中国电力构成包括传统能源(如煤炭、石油、天然气)、可再生能源(如水电、风能、太阳能、核能)和其他形式的电力。这些发电模式在满足中国巨大的电力需求方面发挥着至关重要的作用。据最新数据显示,中国总发电量超过20万亿千瓦时,居世界第一。…

【征服redis8】Redis的AOF持久化

Redis 支持多种持久化方式来保证数据的可靠性和持久性。前面我们介绍了RDB方式。我们我们介绍第二种方式——AOF(Append Only File)机制是一种常用的持久化方式,它记录了所有对 Redis 数据库进行修改的命令,在 Redis 重启时可以使…

echarts X轴数据过多导致重叠展示不全问题(已解决)

问题 x轴数据过多导致坐标轴数据重叠 修改后 List item interval为0代表每个标签都显示,即间隔为0! 将其设置为我们想要的数值即可。 xAxis: {type: "time",splitLine: {show: false,},axisLine: {show: false,lineStyle: {color: &qu…

Spring MVC学习——解决请求参数中文乱码

解决请求参数中文乱码问题 1.POST请求方式解决乱码问题 在web.xml里面设置编码过滤器 <filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class><…

lua使用resty.http做nginx反向代理(https请求,docker容器化部署集群),一个域名多项目转发

下载使用 链接&#xff1a;https://pan.baidu.com/s/1uQ7yCzQsPWsF6xavFTpbZg 提取码&#xff1a;htay –来自百度网盘超级会员V5的分享 在根目录下执行: # 从 github 上下载文件 git clone https://github.com/ledgetech/lua-resty-http.git # 将 lua-resty-http/lib/ 下的 r…

客户案例 | 思腾合力助力某能源公司地质数据智能化计算平台建设

助力某能源公司 地质数据智能化计算平台建设 石油行业是全球最大的行业之一&#xff0c;涉及到从地下或海底开采原油和天然气的勘探、开发、生产、运输、精炼和销售的全过程。石油不仅是世界上最主要的能源之一&#xff0c;还是化工产品的主要原料。石油行业的运作对全球经济有…

Java多线程并发篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、拒绝策略二、Java 线程池工作过程三、JAVA 阻塞队列原理前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 一、拒绝策略…

VS代码生成工具ReSharper v2023.3正式发布——支持C# 12

实质上&#xff0c;ReSharper特征可用于C#&#xff0c;VB.net&#xff0c;XML&#xff0c;Asp.net&#xff0c;XAML&#xff0c;和构建脚本。 使用ReSharper&#xff0c;你可以进行深度代码分析&#xff0c;智能代码协助&#xff0c;实时错误代码高亮显示&#xff0c;解决方案范…

AI-数学-高中-6-求分式函数值域(y的取值范围)

原作者视频&#xff1a;函数】4分式函数的值域&#xff08;易&#xff09;_哔哩哔哩_bilibili 1.一次比一次&#xff1a;分数函数&#xff0c;分子与分母都是1次。 1.1 画xy轴图&#xff0c;计算垂直渐近线移动数值、画出渐近线&#xff1a;用分母不能为0来计算&#xff0c;如…

1739. 迷宫的所有路径-深度优先搜索-DFS

代码&#xff1a; #include<bits/stdc.h> using namespace std; int n; int fx[4]{0,1,0,-1}; int fy[4]{1,0,-1,0}; bool vis[100][100]; int q[35][3]; int c; void print(int k){c;cout<<c<<":";for(int i1;i<k;i){cout<<q[i][1]<…