跳转至

第 2 课 为什么量化研究常用 Python

先弄清工具的分工,再写第一行代码。这一课不会出现交易策略。

适合谁从没写过程序的读者
前置知识完成第 0、1 课
建议用时35 分钟
本课成果在浏览器运行第一行 Python

电脑为什么不能直接听懂想法

假设你把一句话交给同学。

帮我找出最近涨得比较好的股票。

同学马上会追问。“最近”是五天还是一个月,“比较好”是上涨还是跑赢指数,“股票”又来自哪个市场。人能在交谈中补齐意思,电脑只会执行已经写清楚的步骤。

程序是写给电脑的一组明确步骤,编程语言则规定这些步骤怎样写。Python 就是其中一种语言,它的常用符号接近日常英文,处理表格、计算和画图的工具也很齐全。研究者可以把重复劳动写成程序,让同一套规则在不同日期和资产上保持一致。

量化研究还会使用 R、C++、Julia、SQL 和电子表格。Python 适合本手册的原因来自学习与研究需要。初学者用较少语法就能读取数据、计算指标、画图和训练模型,遇到问题也容易找到公开资料。高频执行可能更重视 C++ 的速度,大型数据查询常交给 SQL,快速查看小表时电子表格仍然方便。工具根据任务选择,本课程先用 Python 走完一条能够解释和复查的完整路线。

四样东西分别在做什么

刚接触编程时,Python、编辑器、终端和代码文件经常混在一起。先把它们摆到同一张图里。

flowchart LR
    accTitle: Python 学习工具的关系
    accDescr: 读者在编辑器里写代码并保存为文件,终端把文件交给 Python 执行,Python 把结果或错误显示回来

    idea["你想完成的任务"] --> editor["编辑器<br/>写和修改文字"]
    editor --> file["代码文件<br/>保存为 .py"]
    file --> terminal["终端<br/>发出运行命令"]
    terminal --> python["Python<br/>逐步执行代码"]
    python --> result["结果或报错"]

编辑器负责输入、修改、查找和保存代码,它和文字编辑软件的职责相近,本身不计算收益。保存后的 .py 文件是一份可以反复使用的操作清单,例如 hello.py,扩展名 .py 说明文件里采用 Python 语法。文件可以存在硬盘上很多天,只要没有交给执行器,它就不会自动产生结果。

终端是用文字向电脑发命令的窗口。以后输入 python hello.py,含义是请 Python 读取并执行这个文件。Python 解释器才是执行者,它通常从上到下处理普通代码,遇到无法理解的语法、找不到的名字或不合适的数据类型时会停止,并把报错显示回终端。编辑器、文件、终端和 Python 可以由不同软件承担,四者共同工作却不能互相替代。

代码经由 Python 变成数据表与图表

图里可以看到一条完整的小路。代码只是起点。Python 读完代码以后才会计算,计算结果可以留在表格里,也可以被画成图。编辑器、终端和文件都围绕这条小路服务。它们经常同时出现在屏幕上,所以很容易让初学者误以为它们是一件东西。

为什么研究工作偏爱 Python

量化研究经常重复同一类劳动。研究者每天要读取新的行情,按照相同规则计算指标,再把结果放进固定格式的报告。手工处理十行数据仍然可行,遇到十年日线、数千只股票和几十个字段以后,人很难保证每一步都保持相同。程序适合接管机械步骤,还能把规则、参数和执行顺序保存在代码中。

研究规则写成代码以后,另一位读者可以使用同一份数据重新计算。两个人得到不同结果时,他们能够继续检查软件版本、参数、输入文件和运行日志,研究过程因此可以追查。电子表格也能保存公式,但公式散落在许多工作表、复制区域和隐藏单元格以后,变化来源更难定位。Python 文件配合版本记录,会清楚显示哪一行规则在什么时候发生了改变。

Python 周围已经形成一套可以相互传递数据的工具。NumPy 负责大批数值运算,pandas 负责带日期和列名的表格,Matplotlib 负责画图,scikit-learn 负责常见机器学习。第 7 课会解释前三者的分工,机器学习部分再介绍模型工具。选择 Python 同时也选择了这套研究环境,它的突出价值在于表达清楚、方便检查和资料丰富,执行速度则要根据具体场景判断。

工具 更适合的任务 初学阶段的限制
Python 把数据、计算、图表和模型连成可重复流程 需要学习基本语法与报错阅读
电子表格 快速查看小表、手工核对少量数字 大量复制和隐藏公式难以统一复查
SQL 从大型数据库筛选和汇总数据 不负责完整策略和图形研究流程
C++ 对执行速度和延迟要求很高的系统 入门开发与排错成本较高

从按下运行到看见结果

假设文件里只有两行代码。

price = 10.5
print(price + 0.2)

Python 先读第一行,在当前运行环境中让 price 保存数值 10.5。随后读第二行,取回这个数值,加上 0.2,再让 print 把 10.7 显示出来。屏幕结果来自前一行准备的信息。如果把两行交换位置,Python 会先遇到一个尚未创建的名字,于是停止并报告 NameError。这件小事说明程序很在意执行顺序,人能在整页代码中前后扫视,执行器却只能使用当前步骤以前已经准备好的内容。

量化代码还多出一层市场时间。程序在今天运行时,不能使用明天才出现的价格;当天收盘价尚未形成时,也不能假设它已经完整。代码从上到下的执行顺序与信息从过去走向未来的时间顺序要同时检查。第 8 课的 shift 和第 14 课的成交账本会把这个问题放进策略流程。

交互窗口、代码文件和笔记本

浏览器练习场属于交互环境,输入一小段代码并点击运行后会立即得到结果,适合第一次理解变量和计算。Jupyter Notebook 也采用分块运行,研究者常用它探索数据和记录图表。.py 文件更适合保存需要稳定重复的步骤,它每次从开头执行,顺序清楚,也容易进入版本管理。常见学习过程是先在交互环境试通三五行,再把稳定步骤整理成函数并保存到代码文件,两类工具服务于不同阶段。

笔记本代码块可以不按页面顺序执行,这会带来一个隐蔽问题。上方代码看起来还没运行,下方却可能使用内存里残留的旧变量。研究结果准备交付时,应当重启运行环境并从第一块开始执行。只有从空白状态仍能得到相同结果,程序才算把输入、顺序和依赖写完整。

AI 写代码时你仍要负责什么

AI 可以解释报错、补全短函数,也能把一句研究规则改写成代码初稿。它不会自动知道数据在何时发布,也不会自动采用正确手续费,生成的变量名即使很工整,时间关系仍可能错一行。初学阶段可以让 AI 每次处理一个可见任务,例如解释一行代码的输入、动作和输出,再提供两个答案已知的测试值。读者需要亲自运行,把程序结果与手算结果并排核对。第 31 课会把这种协作整理成完整研究流程。

先在浏览器里运行

安装软件会带来版本、路径和权限问题,这些问题与本课要理解的执行过程关系不大,所以先放到后面。浏览器练习场已经准备好 Python 环境,打开页面后把下面一行放进输入框,点击运行即可观察输入和输出。

print("你好,量化研究")

print 负责把括号里的内容显示出来,双引号则把“你好,量化研究”标成一段文字。点击运行以后,输出区域会出现同样内容。

你好,量化研究

打开浏览器 Python 练习场

这次运行可以拆成三个动作。读者写下一条说明,Python 解释并执行,页面随后显示结果。后面的变量、表格和策略代码都会沿用这条基本路径,只是输入更复杂,中间步骤更多,输出也可能变成表格或图形。

怎样读一行陌生代码

看到代码时,先别急着记标点。按下面的次序观察。

  1. 这一行想让电脑做什么。
  2. 它使用了哪些已经准备好的东西。
  3. 它产生了什么新结果。
  4. 结果会显示出来,还是留给下一行使用。

print("你好,量化研究") 来说,动作是显示,输入是一段文字,结果出现在屏幕上。它没有留下新的数据。

代码里的英文通常很短。print 读作“打印”,在这里更接近“显示”。初学阶段不需要把英文翻译得很漂亮,只要知道它负责哪个动作。

什么时候再安装本地环境

完成第 8 课并能读懂一条短策略以后,再考虑安装 Python 和编辑器。那时你已经知道为什么需要文件、终端和软件包,安装过程会有明确目的。已经装好 Python 的读者也可以继续使用浏览器,两种方式学习的是同一套语法,主线课程不会把“安装成功”当成理解编程的前提。

容易弄错的地方

初学者的想法 更准确的理解
在编辑器里写字等于 Python 已经运行 编辑器保存代码,Python 解释器才会逐行执行,两者可以分别更换
屏幕出现红色报错说明电脑坏了 报错通常记录程序停在哪一行、遇到哪类问题,是排查入口
学编程要先背完所有语法 先跟着输入、动作和可见结果学习,常用语法会在不同例子中反复出现
AI 一次生成整套策略最省时间 还不能逐段核对时,完整生成会同时藏入数据、时间和成交等默认决定

一分钟自测

如果你在编辑器里写好 hello.py,却一直没有运行命令,屏幕会自动出现结果吗?

查看答案 不会。文件只保存了操作说明,还需要把它交给 Python 执行。浏览器练习场把“保存和运行”合在了一个按钮里。

本课术语

词语 先这样理解
程序 写给电脑的一组明确步骤
Python 用来表达这些步骤的一种语言
编辑器 写和修改代码的工具
终端 用文字向电脑发命令的窗口
代码文件 保存代码的文件,常以 .py 结尾
输出 程序执行后显示或保存的结果

课后练习

1 辨认工具

你在 VS Code 里写下代码,随后在 PowerShell 运行它。谁是编辑器,谁是终端?

提示一个负责写文字,一个负责发运行命令。
答案VS Code 是编辑器,PowerShell 是终端,Python 负责读取并执行代码。

2 预测输出

print("10 + 2") 会显示 12,还是显示 10 + 2

提示双引号表示里面是一段原样保存的文字。
答案会显示 `10 + 2`。第 3 课会学习真正的数值运算。

3 找到缺少的一步

小林写好了 study.py,保存后等了十分钟,仍然没有结果。最可能缺少什么?

提示回想“写、保存、执行、看到结果”的顺序。
答案他还没有让 Python 执行这个文件。

4 动手修改

在浏览器练习场里,把欢迎文字改成你的学习目标,再运行一次。

提示只修改双引号里面的内容。
答案任何能正常显示的文字都可以,例如 `print("我要学会检查回测")`。

5 想一想

为什么本课程没有在第一节 Python 课里直接运行均线策略?

思考方向可以从“能运行”和“能判断它是否写对”之间的差别来回答。
参考要点初学者尚不知道数据怎样保存、条件怎样判断,也无法逐行检查代码。过早给出完整策略只能让人照抄,难以形成独立判断。
离开本页前
编辑器用来写,文件把代码保存下来,终端负责发出运行命令,Python 才会逐行执行。若这四件东西已经不再混成一团,并且浏览器里的一行代码能够按预期显示结果,就可以继续学习数值和变量。