深圳融克迪特科技有限公司 Logo,金融科技,量化交易,软件开发

深圳融克迪特科技有限公司

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【Python 系列 第3讲】for循环:批量计算日收益率

本讲围绕一组连续收盘价,使用 for 循环批量计算相邻交易日的简单收益率,并把结果存入列表、格式化输出,帮助新手把手算公式推进成可重复执行的最小自动化流程。

2026-04-26 智铨研究 阅读时长 6 分钟

目录

Python · 入门短课

  1. 第 1 讲【Python 系列 第1讲】环境检查:先打印一组收盘价
  2. 第 2 讲【Python 系列 第2讲】列表和字典:装下价格与日期
  3. 第 3 讲【Python 系列 第3讲】for循环:批量计算日收益率
  4. 第 4 讲【Python 系列 第4讲】函数封装:写一个收益率计算器
  5. 第 5 讲【Python 系列 第5讲】条件判断:筛出上涨交易日
  6. 第 6 讲【Python 系列 第6讲】CSV读写:保存再读回价格表
  7. 第 7 讲【Python 系列 第7讲】异常处理:避开空值和除零
  8. 第 8 讲【Python 系列 第8讲】生成一份行情摘要

一、为什么for循环这一讲,是从“我会算”走向“我会批量算”的真正分界线

在量化入门里,很多人第一次接触收益率时,都能很快看懂公式,也能手算出两天价格之间的变化幅度。问题在于,只要数据不止两天,手算或者一条条硬写就立刻失去可持续性。这也是为什么 for 循环这一讲特别关键。它标志着你开始从“知道公式是什么”进入“能让程序把同样动作稳定重复下去”的阶段。

这一步非常重要,因为程序真正擅长的事情,从来都不是帮你算一两次,而是把一类重复动作在整组数据上自动执行。收益率正好是最适合练这一点的题材。它公式直观、结果容易核对、而且天然依赖顺序,能帮助你同时练清楚列表遍历和相邻样本关系。只要这一讲走通,后面不管是筛选上涨日、算简单摘要,还是进一步封装函数,都会自然很多。

因此,第 3 讲真正要建立的,不只是会写 for 语法,而是开始具备“遇到一串数据,先想怎么批量处理”的程序化思维。这对后续所有量化小练习都非常关键。

二、为什么收益率特别适合拿来练第一次批量处理

不是所有金融计算都适合拿来练第一次循环。收益率之所以适合作为 Python 批量处理的第一站,有几个非常现实的原因。第一,它只依赖一组按顺序排列的价格,不需要更多复杂输入。第二,它的计算逻辑直观,当前价格和前一天价格一比较就能得到结果。第三,它天生会让你意识到:不是每一个输入点都能直接产生一个输出点,因为第一天没有前一天可比。

这些特点让收益率成为一个非常好的入门练习对象。它既足够简单,不会让你被业务细节压住;又足够真实,能够帮助你形成对顺序、长度和输出结果的基本敏感度。最重要的是,它会让你第一次真正感觉到循环的价值。原本需要反复手工做的动作,现在交给程序以后,输出会自然地连成一串。

入门阶段最怕的是题材过于抽象或者过于复杂。收益率恰好卡在一个很好的位置上:简单到能看懂,又真实到足以支撑后面的更多练习。

三、为什么循环必须从第二个元素开始,这件事比很多人想得更重要

写收益率循环时,一个最常见也最关键的细节,就是循环起点为什么不是 0,而是 1。很多初学者会把这当成一条需要记住的写法,但其实它背后有非常清楚的逻辑。收益率依赖“当前价格相对前一天价格”的变化,因此每次计算都必须同时拿到当前值和前一个值。第一个价格本身没有更早的价格作为参照,所以它只能作为基准,不能直接生成收益率。

这层理解很重要,因为它不只是关系到这一讲的正确性,还关系到你以后怎么理解所有“依赖前值”的计算。只要你真的弄明白为什么循环要从第二个元素开始,你就会自然接受一件事:在时间序列里,输出长度有时本来就应该比输入短。收益率如此,很多别的滚动或差分类结果也会如此。

所以,这里不该只是机械记住 range(1, len(prices)),而应该真正看懂:循环起点之所以往后挪,是因为定义本身如此。只要这一层想透了,后面很多类似问题都会轻松很多。

四、为什么“输出条数比输入价格少一条”不是少算了,而是结果定义本来如此

初学者第一次批量算收益率时,很容易在输出条数上产生不适感。比如四个价格,最后只有三个收益率,直觉上会觉得像是“少了一条”。其实这完全正常。因为收益率描述的是相邻两天之间的变化,而不是每个价格点本身的一个独立属性。第一天没有参照日,自然也就没有对应的收益率结果。

这件事值得在这一讲就先讲透,因为它会帮助你建立一个非常重要的结果意识:数据处理里,并不是每个输出都必须和输入一一同长。有些结果本来就是围绕相邻关系、窗口关系或差分关系定义的,所以长度发生变化是合理的,而不是异常。只要你能接受这一点,后面很多看似“长度怎么对不上”的结果就不会再轻易把你绕进去。

因此,第 3 讲里“收益率条数比价格少一条”并不是一个边缘现象,而是本讲最值得先理解的结果特征之一。弄清这个特征,比机械打印出几组结果更重要。

五、为什么把结果存进列表,比边算边打印更像真正的程序处理

很多人第一次写循环时,习惯在循环体里直接 print() 当前结果,看到能打印出来就觉得任务完成了。这个阶段当然有助于调试,但如果一直停留在边算边打印,后面就很难继续做筛选、统计或复用。真正更像程序处理的方式,是把结果存进一个新的列表里,让后面的步骤能继续使用它。

这也是为什么第 3 讲里要专门强调 returns.append(ret) 这件事。它的意义不只是“保存一下输出”,而是在让你第一次真正形成输入序列经过循环后,产出一个新序列的工作流感。原来的价格列表是输入,新的收益率列表是输出,二者之间通过循环连接起来。这个结构感非常重要,因为后面函数封装、条件筛选、异常处理都会围绕这种“输入一组,输出一组”的关系展开。

只要你开始习惯把循环结果保存在容器里,你写出来的代码就会明显更像一个可继续加工的流程,而不只是一次性输出几行数字。

六、为什么格式化输出不是花架子,而是在帮你建立结果直觉

收益率本身通常是小数,直接打印时看起来往往不够直观。比如 0.0373 这种值,对刚入门的人来说不一定能马上感受到它到底大概意味着什么。把它格式化成百分比输出,例如 3.73%,并不是为了好看,而是在帮助你更快建立对结果量级的直觉。

这种直觉很有价值。因为量化练习里很多数字都需要先过一层“人类可读”的转换,才更容易判断结果是否合理。收益率尤其如此。你一旦开始习惯用百分比读收益,就更容易肉眼发现某个值是正常波动,还是异常大到需要回头检查数据或公式。也就是说,格式化输出其实是在搭一座桥,把程序里的原始数值转成更容易让人判断的表达方式。

对入门阶段来说,这种桥梁非常重要。你不能只让程序算对,还要逐步学会看懂程序算出来的东西。格式化输出正是在帮你完成这一步。

七、为什么这一讲真正练到的,是“重复动作自动化”而不只是收益率公式

如果只从表面看,第 3 讲像是在教你如何批量算收益率。但更深一层,这一讲真正训练的是“重复动作自动化”。也就是说,你第一次把一类原本需要手工重复的动作,交给程序在整组数据上稳定执行。这种能力才是 Python 在量化练习里最重要的价值之一。

收益率只是一个切入口。你以后无论要批量筛选、批量格式化、批量检查条件,本质上都仍然是在做类似的事:对一串数据执行一套重复逻辑。只要这一讲先把循环的感觉练出来,后面遇到别的批量任务时,你就不再总是想“我该不会又要手算吧”,而会自然开始想“这个动作怎么用循环表达”。

因此,第 3 讲留下来的最重要能力,并不是一个具体 returns 列表,而是你的思维开始从单点计算转向批量处理。这一点对后面所有章节都非常关键。

八、这一讲为函数封装和条件筛选准备了什么

只要你已经能在主流程里把收益率批量算出来,下一步最自然的动作就是把这段重复逻辑收进函数里。也就是说,第 4 讲的函数封装并不是凭空出现,而是在承接你这一讲已经跑通的循环。与此同时,收益率一旦变成一个列表,后面的条件筛选也就有了基础。你完全可以基于这串结果去判断哪些天是正收益、哪些天是负收益。

这说明第 3 讲其实是整个 Python 入门链里的一个关键支点。前一讲把数据装进容器,这一讲把容器里的数据交给循环,后一讲则把循环封装起来。整条链路是非常顺的。只要这一讲写稳了,后面不仅会更容易理解,也会更容易感觉到代码开始越来越像一个有结构的小程序,而不是一段段零散操作。

所以,不要低估这一讲的分量。它虽然还很基础,却是真正让“程序化处理”开始发生的地方。

九、为什么这一讲做完后,最好已经能把“单次计算”和“批量处理”明确分开

第 3 讲最值得确认的一点,是你已经能把单次计算和批量处理这两件事分开。单次计算只关心两个价格之间的变化,而批量处理则要求你能让程序对整串数据重复执行同一个规则,并把所有结果有序收集起来。只要你已经意识到这两件事不是同一个难度层,说明这一讲真正推进了你的思维方式,而不只是多写了一个循环。

这种区分很重要,因为后面的函数封装、筛选和读写都会建立在批量处理已经站稳的前提上。如果这里还停留在“每次手算一个结果”的思路,后面很多代码都会显得别扭。

十、这一讲也在帮你建立“结果列表本身就是中间成果”的意识

收益率列表一旦完整生成,它就不该只被看成屏幕上的一串输出,而应该被看成一个真实的中间成果。后面的函数封装会围绕它组织,后面的条件筛选会依赖它,后面的文件读写也可能把类似结果继续保存出去。第 3 讲其实是在帮你第一次建立这种中间成果意识。也就是程序运行之后,留下来的不只是一个瞬间输出,而是一份后面还能继续使用的数据结构。

这层意识对学习编程很重要。因为它会让你不再只是盯着“有没有打印出来”,而开始关心“有没有把结果稳稳留住”。

十一、这一讲结束时,最好已经避免了哪种典型误区

做到这里以后,最好已经避开一种很常见的误区:把循环理解成“只是为了少写几次同样的公式”。那样的理解太窄了。更准确地说,循环是在帮你把同一条处理规则稳定地施加到一整组样本上。只要这层认识已经立住,你就不会把第 3 讲看成一个纯语法练习,而会把它看成程序化处理真正开始出现的地方。

这层误区越早避开越好。因为后面所有批量处理,几乎都会复用你今天对循环的理解。

十二、这一讲做完后,最好已经形成怎样的完成状态

如果这一讲已经真正站稳,你通常会进入一种比较清楚的完成状态:你知道输入是一串价格,处理中发生的是逐项重复计算,输出是一串长度略短的新结果,而且这串结果以后还会继续被函数、筛选和文件读写复用。只要这条输入到输出的链路已经能在你脑中顺着讲出来,说明这一讲不再只是“我会写一个 for 循环”,而是“我已经开始理解批量处理到底在做什么”。

这种完成状态很重要,因为它让你后面遇到别的循环任务时,不需要再从零猜结构。你会自然去找输入序列、重复规则和结果容器,这正是编程思路开始稳定的信号。

十三、总结

这一讲的重点,不是单纯记住一个收益率公式,而是让你第一次真正把一串价格交给程序做批量处理。你需要理解为什么循环从第二个元素开始、为什么输出长度会比输入少一条、为什么结果要保存在新列表里,以及为什么格式化输出能帮助你建立对结果的直觉。只要这些层已经理顺,这一讲就真正完成了它的任务。

十四、系列衔接

本讲是《Python量化入门短课》的第 3 讲,当前主题是《for循环:批量计算日收益率》。上一讲已经把价格和日期装进了合适的数据容器,这一讲则第一次真正对这组数据做批量运算。下一讲会顺着这段循环逻辑进入函数封装,让这套收益率计算变成一个可复用的小工具。

十五、风险揭示与免责声明

风险揭示与免责声明

本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。

本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。

市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。

读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。