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

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

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

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

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

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

目录

  1. 本节目标
  2. 为什么第 3 讲先练“批量计算收益率”
  3. 沿用第 2 讲的价格列表
  4. 四步批量算出一组日收益率
  5. 先明确收益率怎么算
  6. 用循环从第二个价格开始遍历
  7. 把收益率真正算出来并存进列表
  8. 把收益率格式化输出
  9. 怎样判断这组收益率真的算对了
  10. 收益率条数应该比价格少 1
  11. 第一个收益率和手算一致
  12. 结果里都是数值
  13. 格式化输出能正常显示百分比
  14. 为什么循环一写就容易乱
  15. 为什么不能从0开始
  16. 为什么收益率条数比价格少一条
  17. 为什么建议先把结果存到列表里
  18. 如果前一天价格是 0 怎么办
  19. 哪些情况仍然算本讲完成
  20. 写一个最小批量收益率函数
  21. 第 3 讲跑通的是“重复动作自动化”
  22. 完成标准
  23. 系列衔接
  24. 风险揭示与免责声明

Python · 入门短课

  1. 第 1 讲【Python 系列 第1讲】Python环境检查:先打印一组收盘价
  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讲】生成一份行情摘要

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

1. 本节目标

第 3 讲开始第一次真正做“批量处理”。目标很清楚:不再手工一条一条地算价格变化,而是用 for 循环把一组收盘价对应的日收益率批量算出来。这一步是 Python 量化练习里非常关键的分水岭,因为从这里开始,你处理的就不再是几个孤立数字,而是一整串可以自动推进的样本。

学完这一讲后,你可以直接完成下面几件事:

  1. for 循环遍历一组价格。
  2. 计算相邻两天的简单收益率。
  3. 得到一组可继续筛选和汇总的收益率结果。

一旦这一步走通,后面写函数、做筛选和生成摘要都会顺很多。

2. 为什么第 3 讲先练“批量计算收益率”

量化入门里最容易出现的一个卡点,就是明明知道收益率怎么算,却总停留在“拿两天价格手算一下”。这种方式适合理解公式,不适合真正开始写程序。程序真正擅长的,是把同样的动作对一串数据重复执行。

第 3 讲把 for 循环和收益率放在一起,就是为了让你第一次把“重复动作自动化”这件事落地。收益率又是一个非常合适的练习对象,因为它:

  1. 公式足够简单,容易肉眼检查。
  2. 结果会直接受到价格顺序影响,能顺手强化你对序列的理解。
  3. 后面筛上涨日、算摘要时都会继续用到。

3. 沿用第 2 讲的价格列表

本讲继续使用纯 Python,不引入第三方库。沿用一组小样本即可:

prices = [12.34, 12.80, 12.65, 13.10]

这里多放了一天,是因为收益率至少需要两天价格,样本太短时不容易看出循环的意义。

4. 四步批量算出一组日收益率

下面四步分别对应“先理解起点”“再写循环”“把结果存起来”“最后看输出”。

5. 先明确收益率怎么算

最基础的简单收益率写法是:

$$ \text{return} = \frac{\text{today} - \text{yesterday}}{\text{yesterday}} $$

翻成 Python,就是“当前价格减去前一天价格,再除以前一天价格”。第 3 讲不追求花哨写法,先把这个关系写清楚最重要。

6. 用循环从第二个价格开始遍历

for i in range(1, len(prices)):
    prev_price = prices[i - 1]
    curr_price = prices[i]
    print(prev_price, curr_price)

之所以从 1 开始,而不是从 0 开始,是因为收益率每次都要回头看前一天。如果从第一天直接算,会没有可对照的上一日价格。

7. 把收益率真正算出来并存进列表

returns = []

for i in range(1, len(prices)):
    prev_price = prices[i - 1]
    curr_price = prices[i]
    ret = (curr_price - prev_price) / prev_price
    returns.append(ret)

print(returns)

这一步的关键,是不要只 print(ret) 看一眼就结束,而是把结果存进 returns 列表。因为后面你还要继续筛选和汇总,没有结果容器会很难往下走。

8. 把收益率格式化输出

for ret in returns:
    print(f"日收益率: {ret:.2%}")

用百分比格式打印出来以后,结果会更容易直接读。比如 0.037 打印成 3.70%,比原始小数更适合入门阶段核对。

9. 怎样判断这组收益率真的算对了

只要把长度、首个结果和输出格式三个关键点看清楚,本讲就算走通了。

10. 收益率条数应该比价格少 1

assert len(returns) == len(prices) - 1

11. 第一个收益率和手算一致

expected_first = (12.80 - 12.34) / 12.34
assert abs(returns[0] - expected_first) < 1e-9

12. 结果里都是数值

assert all(isinstance(ret, float) for ret in returns)

13. 格式化输出能正常显示百分比

print(f"首个收益率: {returns[0]:.2%}")

只要这几条都成立,就说明你已经把“会算收益率”推进成了“会批量算收益率”。

14. 为什么循环一写就容易乱

这是第 3 讲最常见的痛点,但它通常不是公式问题,而是顺序问题。

15. 为什么不能从0开始

因为第一天没有前一天价格。若你从 0 开始,prices[i - 1] 会变成最后一个值,逻辑就乱了。

16. 为什么收益率条数比价格少一条

因为第一天只能作为基准,不能直接形成收益率。这个现象是正常的,不是少算了。

17. 为什么建议先把结果存到列表里

因为后面你还要继续做条件筛选、统计和摘要。如果每次只打印不保存,代码很快就会断在中间。

18. 如果前一天价格是 0 怎么办

那就不能直接相除。这是第 7 讲异常处理会专门补的场景,本讲先假定样本价格都正常。

19. 哪些情况仍然算本讲完成

  1. 你不一定非要打印百分比,小数形式也可以,只要你能解释结果。
  2. 当前只算简单收益率,不要求对数收益率。
  3. 样本可以多一天或少一天,但必须至少有两天价格。
  4. 当前不要求把日期也一并放进去,第 3 讲先把循环和收益率关系练清楚。

20. 写一个最小批量收益率函数

def calc_simple_returns(prices):
    returns = []
    for i in range(1, len(prices)):
        prev_price = prices[i - 1]
        curr_price = prices[i]
        returns.append((curr_price - prev_price) / prev_price)
    return returns

prices = [12.34, 12.80, 12.65, 13.10]
print(calc_simple_returns(prices))

从这一讲开始,把动作封装成函数会越来越值得,因为它能帮你避免每次都从零重写循环。

21. 第 3 讲跑通的是“重复动作自动化”

收益率只是这节课的表面任务,真正更重要的,是你第一次把同一个计算动作稳定地重复应用到一串数据上。对量化练习来说,这是非常关键的能力,因为后面很多任务都只是“换了个公式的批量处理”。

换句话说,第 3 讲帮你建立的,不只是一个 returns 列表,而是“遇到一串数据时,先想循环怎么写”的基本反应。

22. 完成标准

如果你现在已经能用 for 循环把一组收盘价稳定转换成一组日收益率,并且知道为什么结果条数会少一条,那第 3 讲就算完成。

23. 系列衔接

本讲是《Python量化入门短课》的第 3/8 讲,当前主题是《for循环:批量计算日收益率》。

上一讲:第 2 讲《列表和字典:装下价格与日期》。

下一讲:第 4 讲《函数封装:写一个收益率计算器》。

后续安排:第 5 讲《条件判断:筛出上涨交易日》;第 6 讲《CSV读写:保存再读回价格表》。

24. 风险揭示与免责声明

风险揭示与免责声明

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

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

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

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