\begingroup

背景是这样的,我根本不是一个开发人员,到目前为止,我的所有脚本都是用 Octave(Matlab 的开源版本)编写的。不过,似乎 Python 才是最佳选择。

由于我不是一名开发人员,并且如果最终结果相同,我不喜欢为了改变而改变,因此我真的很想知道为什么现在似乎所有东西都是用 Python 编写的?是什么让 Python 比 Octave、Julia 等“更好”?

是可扩展性、更多软件包的可用性,还是(不受欢迎的想法)“自我实现的预言”因此获得了自身的发展势头?还有其他原因吗?

\endgroup

5

  • 1
    \begingroup
    不知道,我甚至更喜欢 R 而不是 Python。前者控制数据似乎更直观。
    \endgroup


    – 

  • 1
    \begingroup
    顺便说一句,我不认为这个问题是基于观点的。事实上,这正是问题所在:肯定存在一些指标,使得 Python 成为首选语言。对吧?
    \endgroup


    – 

  • 1
    \begingroup
    我不是 Matlab 或 Julia 专家,但我在 Python 中看到的优点是:1)矢量化(无论是 Numpy、一些 Pandas 操作还是其他具有优化数组方法的包,这些方法不需要编码器使用循环)2)相当容易学习。
    \endgroup


    – 

  • 2
    \begingroup
    @JanStuller 我不是 Python 专家,但 Matlab/Octave 实际上针对矩阵和数组运算(矢量化)进行了优化。
    \endgroup


    – 

  • 1
    \begingroup
    没有人提到 Rust。它的打包系统 Cargo 的设计考虑到了 Python 的 pip 和 Javascripts npm,因此非常适合专业部署。Rust 与 Python 交互良好,我个人通过 PyO3 使用它。这些天我几乎只使用 Python 和 Rust。
    \endgroup


    – 


最佳答案
4

\begingroup

企业视角:

虽然我不是 Python、Julia、R 和 Matlab 之间技术差异的专家,但我可以提供一些企业“观察”。

在我的公司,几乎所有的后端开发人员都具备 Python 知识,并且可以轻松理解其语法,而很少有人熟悉 Matlab 或 Julia(尽管有些人有使用 R 的经验)。当前台算法用 Python 编写时,整个业务的效率会大大提高,因为后端开发人员可以无缝地将它们转换为优化的 C++ 或 C# 代码以用于生产流程。

作为 SCRUM 方法的一部分,我们的后端开发人员以冲刺的方式工作,根据每个任务的复杂程度为其分配特定的天数。如果算法是用 Julia 或 R 编写的,后端开发人员需要花费额外的时间和精力来理解代码,从而导致潜在的延误和挫败感。这也可能导致与开发算法的前台交易员进行更多会议,最终因效率低下而导致公司损失金钱。

关于使用 Julia(或 Matlab)而不是 Python 来提高性能的讨论:对于任何性能至关重要的算法,我们都会聘请一支经验丰富的 C++ 开发人员团队。由于 C++ 以其速度而闻名,并且长期以来一直是高性能应用程序的热门选择,因此它也带来了更大的熟练 C++ 开发人员的就业市场。


总结一下:

  1. 流行和简单的语法: Python 的流行和简单的语法使几乎所有企业中的程序员都可以使用它。它进一步促进了更顺畅地集成到基于生产的系统中。此外,由于语法简单,它也是一种出色的脚本语言。

  2. 技能娴熟的开发人员的就业市场更大:与 Julia、R 或 Matlab 相比,对 Python 有深入了解的开发人员数量要大得多。这使得招聘和替换变得更容易、更高效。

  3. 降低企业成本:上述因素有助于降低企业成本。Python 的流行性和简单性提高了效率,而更大的就业市场确保寻找或更换开发人员更加直接且具有成本效益。与任何其他高性能语言相比,C++ 开发人员也是如此。

总之,除非出现一种与 Python 的流行度相匹配并提供额外优势的新编程语言,否则 Python 很可能仍将是长期的首选。

\endgroup

5

  • 2
    \begingroup
    +1。这可能是一个鸡和蛋的问题。我认为我同意你关于受欢迎程度(这引发了我的问题)的观点,更多的熟练开发人员和降低企业成本,它们都对彼此有某种反馈作用。但我不确定我是否同意关于简单语法的观点。从我所见所闻来看,Matlab/Octave 并不比 Python 容易或困难多少
    \endgroup


    – 

  • 1
    \begingroup
    关于语法:由于 Python 是一种通用语言,我发现它的语法与其他编程语言的关联性比 Matlab 或 R 等“统计”编程语言更好。因此,有 Javascript 或 C 等经验的开发人员在理解 Python 脚本方面会遇到的问题比理解 Matlab 脚本要少。
    \endgroup


    – 

  • \begingroup
    这是买方还是卖方?
    \endgroup


    – 

  • \begingroup
    这是买方
    \endgroup


    – 

  • 2
    \begingroup
    感谢@Pleb 的有趣回答。看来 Python 语言的开发实际上是参考了 JavaScript 或 C 等较老的编程语言的语法。
    \endgroup


    – 

\begingroup

作者 Ernst Chan:

MATLAB 曾经是大型机构量化分析师和交易员最常用的回测平台之一。它已被 Python(我将在下文中描述)取代,但我仍然认为它是量化分析师(而不是专业软件开发人员)最有效的语言。它比 Python 更易于使用,速度更快,并且供应商提供全面的客户支持。它是测试涉及大量股票投资组合的策略的理想选择。它内置了许多高级统计和数学模块,因此,如果交易算法涉及一些复杂但常见的数学概念,交易员无需重新发明轮子。互联网上还有大量第三方免费软件可供下载,其中许多对于量化交易非常有用。最后,MATLAB 在从各种网站检索财务信息方面非常有用。

PYTHON Python 现已取代 MATLAB 成为事实上的回测语言,尤其是在 numpy 和 pandas 软件包推出之后。使用这些软件包,您可以像在 MATLAB 中一样操作数组和时间序列数据。Python 受益于大量用于特定应用程序的第三方软件包。有用于机器学习的 Scikit-learn、用于交互式数据可视化的 plotly 和用于绘图的 seaborn,这些只是一些最常用的软件包。虽然 Python 几乎拥有您需要的所有金融和交易软件包,但它并非没有缺陷。

R我在西北大学数据科学硕士课程中使用 R 作为金融风险分析课程的教学语言,该课程涵盖了从时间序列分析到 copulas 的所有内容。如果你想在交易中使用经典统计和计量经济学分析,R 是一种很棒的语言(这没有什么错!)。这是因为许多学术统计学家和计量经济学家已经在 R 中实现了他们的算法。机器学习算法的实现没有 Python 或 MATLAB 那么多。但是,我建议你在创建新的交易策略时不要使用机器学习,只使用 ML 来改进你的策略(原因在第 2 章中解释,并在 predictnow.ai/finml 上更深入地说明)。因此,R 是策略探索这一初始步骤的良好语言,尽管不如 MATLAB 好,因为它的 IDE(RStudio)也是免费的,而且我敢说,很原始。当然,与 Python 一样,它也没有任何支持。

\endgroup

3

  • 1
    \begingroup
    完全符合我的想法(关于 Matlab)。Octave 是它的开源克隆,显然支持较少,但有一套很棒的软件包和相同的功能。我仍然有点困惑为什么它没有得到充分利用。
    \endgroup


    – 


  • 3
    \begingroup
    我完全同意,我只想补充一点,python 的优势之一是它与软件环境的交互非常自然,这对于 MLops 或 devOps 至关重要。这可能是成功的原因之一。
    \endgroup


    – 

  • \begingroup
    正是如此。“不是孤岛”因素 + 它几乎与专用语言一样用户友好且功能丰富,这让它成为了绝对的胜利。再过几年,你就会到达我们现在的水平。
    \endgroup


    – 

\begingroup

声称金融领域的一切都是用 Python 编写的,这实在是过于简单了。我的经验主要在卖方。不过,@Pleb 似乎也同意我在买方方面的看法。

底层性能在现实世界的基础设施中至关重要。这就是为什么 C/C++ 凭借其原始速度在公司的核心功能中占据主导地位。Julia 可能很快,但它仍然很年轻,是一种小众语言。它的部署速度要快得多,编写起来也更容易,但如果你需要大量的经验丰富的程序员,C++ 提供了更多的选择。

彭博社:

  • 大多数是用和一些传统的 Fortran编写的

C++ 是彭博社工作的核心。

  • API 是用 C++ 编写的

  • 衍生品定价引擎DLIB是用基于OCMAL的编写的。

  • GUI 是用 Javascript 编写的

  • 有些内容显然是用 Perl 编写的

  • ,但我确实认为上述声明说明了一切。此外,即使是 Python API 也只有在与所需的 C++ API 捆绑在一起时才能工作。

黑石:

  • 大部分是 C++
  • 最初是用 C++、Java 和 Perl 编写的,现在已更新为Julia

简街:

  • 的坚定信徒

  • 使用 C++

… 应该打包成一个高效且易于使用的 C++ 库(顶部有更高级的语言包装器)。

Wolters Kluwer 的 OneSumX:

  • 是用 Java 编写的,并且您编写的任何自定义函数都需要用 Java 编写。

Quantlib:

  • 用 C++ 编写

总的来说,我认为选择哪种语言主要不取决于哪种语言更好。可能存在一种语言比另一种更适合的特定主题,但这通常是例外,大多数临时程序员和用户无论如何都无法达到那个水平。金融领域 Python 用户的最大用户群不是开发人员,而是像我这样的人,他们不擅长编程,但需要一些编写速度快且有用的东西。Python 也被开发人员接受,这也是一大优势。

一般来说,我认为你主要需要使用老板让你使用的东西。到目前为止,我有“特权”可以使用(不分先后顺序)Python、Java、VBA、Julia、Matlab/Octave、OCAML、BLAN、SQL(DB2 和 TSQL、Microsoft SQL Server 和 Oracle)、R、Stata、EViews、SPSS、C、C++ 和 Javascript 来工作。虽然不是编程语言,但我也需要 HTML、CSS、Mathjax 和 LaTeX。

话虽如此,老板告诉你要使用的东西与实际语言(例如,上的所有问题都必须用英语写)或社交媒体等类似。语言的成功是由直接的正外部性驱动的,这意味着随着更多用户相互交流和参与,语言的价值会提高。这就是每个人都使用 WhatsApp 的原因。

说实话,Python 背后的社区是首屈一指的。我经常发现自己在不加思考的情况下就盲目地在 Google 中输入问题(例如如何在 Matplotlib 中定义字体),因为 SO 几乎总是有现成的解决方案。如果你看看 Quora、Reddit 等地方,你总会发现有人在推广 Python。

我们来看一些数据:

  • 最受欢迎的编程语言是 Rust、Elixir、Clojur、Typescript 和 Julia
  • Matlab 是最不受人青睐的语言,只有 20% 使用该语言的开发人员希望明年再次使用它
  • 根据同一项调查,只有 2.5% 的人希望使用 Julia,但 62.77% 的人钦佩 Julia。我喜欢使用 Julia 并不是什么秘密,因为我在这里的大多数答案都使用了 Julia。但是,我不能在工作中经常使用它,因为目前与我一起工作的其他人都没有使用过它。强迫人们使用它只会在一段时间内大大减慢工作速度。此外,很难聘请具有 Julia 专业知识的新人。
  • 只有约 39% 的人欣赏 R。

在我开始从事金融行业之前(那是很久以前了),我只使用过 Matlab / Octave。我姐姐在汽车行业使用它,因为 simulink 产品在这个领域显然很棒。不过这主要是网络效应,人们使用它是因为其他人使用它。我个人从未遇到过有人在金融行业使用 Matlab。

我花了 10 年时间才找到一个使用 R 的地方。这个地方使用 R 进行一些工作,因为建立量化部门的人有统计学背景。他们大多决定改用 Python(因为他们在 R 中做的事情),因为当提到 R 时很难找到人来申请。现在,每当需要修改一些 R 代码时,只剩下 2 或 3 个人愿意做这件事(其中两个学统计学,另一个学数学)。

针对 Matlab 和 R 的一些或多或少合理的论点:

  • 一些程序员可能会说使用 1 索引是 R 和 Matlab 不起作用的原因(对于 Julia 也是同样的论点)。

  • (Refinitiv)和均未在其 API 中提供 R 或 Matlab 的直接使用。鉴于几乎所有机构都使用 LSEG、彭博社或两者,因此在工作中推广 R 或 Matlab 会遇到巨大困难。

  • R 和大多数软件包一样,都是 GPL 许可的。正如所述,

与 GPL 不同,所有 Python 许可证都允许您分发修改后的版本,而无需将更改开源。

评论所解释的那样,这实际上可以在公司环境中产生影响。

  • 对于大多数(如果不是全部)程序员来说,R 语法都是比较古怪的。

让程序员挠头的例子(我绝不是一个程序员,也不是一个老练的 R 用户,这只是让我烦恼的事情,我也听到过其他人抱怨):

  • 在几乎所有语言中,赋值运算符都是=,在 R 中它主要是<-(我认为从技术上讲 R 中有 5 个赋值选项)。

  • x = "Hello" + "World"在 Python 和x <- c("Hello", "World")R 中的比较会让你怀疑 <- 和 c() 是否旨在让你和你的代码崩溃。Julia 实际上使用*而不是+来进行字符串连接。这种选择是基于数学的,因为 + 通常是可交换的,这意味着A + B == B + A对于所有矩阵AB具有相同形状。*通常是非交换的,并且A * B != B * A,就像Hello * World!= World * Hello.虽然在数学上是合理的,但大多数语言(包括 C++)都使用+,这使得这仍然是一个有趣的选择。

  • 为什么 R 中的 for 循环会在环境中留下一个变量?通常,循环外部不需要迭代器。

  • 它试图让你的代码工作,但实际上毫无用处。你如何对长度不等的向量进行列绑定?

    x <- c(1,2)

    y <- c(3,4,5,6)

     cbind(x,y)
    

或者在这种情况下为你提供一个 NULL

x <- list(firstname = "AK", lastname = "demy")
x$firstName

我宁愿出现错误,也不愿不幸地在其他地方使用这个值。

\endgroup

2

  • 1
    \begingroup
    作为历史方面的说明,在 Python 2 中,循环变量会泄漏到环境中,就像您在 R 中提到的那样,但在 Python 3 中并非如此。
    \endgroup


    – 

  • 2
    \begingroup
    +1。感谢您的详细回答。“声称金融领域的一切都是用 Python 编写的,这是过于简单化的说法。”是的,这可能是真的。但换句话说,如果我看看一般的量化职位描述,无论是卖方还是买方,都是 Python。
    \endgroup


    – 


\begingroup

人们用 Python 编写软件是因为已经有很多库可以帮助他们。以后他们可能会将他们的软件变成一个库,所以现在至少还有一个库。在我看来,Python 是一种不错的语言,已经积累了临界规模。

如果你从事量化金融,我估计你可能想从事机器学习。目前有几个大型 Python 库,包括,你可以在 Python 中使用它们,它们允许你通过在 GPU 上运行代码来加快处理速度,而无需学习如何自己编写 GPU 代码。即使我不使用 PyTorch,如果没有 ,我也会迷失方向。

\endgroup