基础入门
本讲围绕一组连续收盘价,使用 for 循环批量计算相邻交易日的简单收益率,并把结果存入列表、格式化输出,帮助新手把手算公式推进成可重复执行的最小自动化流程。
第 3 讲开始第一次真正做“批量处理”。目标很清楚:不再手工一条一条地算价格变化,而是用 for 循环把一组收盘价对应的日收益率批量算出来。这一步是 Python 量化练习里非常关键的分水岭,因为从这里开始,你处理的就不再是几个孤立数字,而是一整串可以自动推进的样本。
学完这一讲后,你可以直接完成下面几件事:
for 循环遍历一组价格。一旦这一步走通,后面写函数、做筛选和生成摘要都会顺很多。
量化入门里最容易出现的一个卡点,就是明明知道收益率怎么算,却总停留在“拿两天价格手算一下”。这种方式适合理解公式,不适合真正开始写程序。程序真正擅长的,是把同样的动作对一串数据重复执行。
第 3 讲把 for 循环和收益率放在一起,就是为了让你第一次把“重复动作自动化”这件事落地。收益率又是一个非常合适的练习对象,因为它:
本讲继续使用纯 Python,不引入第三方库。沿用一组小样本即可:
prices = [12.34, 12.80, 12.65, 13.10]
这里多放了一天,是因为收益率至少需要两天价格,样本太短时不容易看出循环的意义。
下面四步分别对应“先理解起点”“再写循环”“把结果存起来”“最后看输出”。
最基础的简单收益率写法是:
$$ \text{return} = \frac{\text{today} - \text{yesterday}}{\text{yesterday}} $$
翻成 Python,就是“当前价格减去前一天价格,再除以前一天价格”。第 3 讲不追求花哨写法,先把这个关系写清楚最重要。
for i in range(1, len(prices)):
prev_price = prices[i - 1]
curr_price = prices[i]
print(prev_price, curr_price)
之所以从 1 开始,而不是从 0 开始,是因为收益率每次都要回头看前一天。如果从第一天直接算,会没有可对照的上一日价格。
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 列表。因为后面你还要继续筛选和汇总,没有结果容器会很难往下走。
for ret in returns:
print(f"日收益率: {ret:.2%}")
用百分比格式打印出来以后,结果会更容易直接读。比如 0.037 打印成 3.70%,比原始小数更适合入门阶段核对。
只要把长度、首个结果和输出格式三个关键点看清楚,本讲就算走通了。
assert len(returns) == len(prices) - 1
expected_first = (12.80 - 12.34) / 12.34
assert abs(returns[0] - expected_first) < 1e-9
assert all(isinstance(ret, float) for ret in returns)
print(f"首个收益率: {returns[0]:.2%}")
只要这几条都成立,就说明你已经把“会算收益率”推进成了“会批量算收益率”。
这是第 3 讲最常见的痛点,但它通常不是公式问题,而是顺序问题。
因为第一天没有前一天价格。若你从 0 开始,prices[i - 1] 会变成最后一个值,逻辑就乱了。
因为第一天只能作为基准,不能直接形成收益率。这个现象是正常的,不是少算了。
因为后面你还要继续做条件筛选、统计和摘要。如果每次只打印不保存,代码很快就会断在中间。
那就不能直接相除。这是第 7 讲异常处理会专门补的场景,本讲先假定样本价格都正常。
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))
从这一讲开始,把动作封装成函数会越来越值得,因为它能帮你避免每次都从零重写循环。
收益率只是这节课的表面任务,真正更重要的,是你第一次把同一个计算动作稳定地重复应用到一串数据上。对量化练习来说,这是非常关键的能力,因为后面很多任务都只是“换了个公式的批量处理”。
换句话说,第 3 讲帮你建立的,不只是一个 returns 列表,而是“遇到一串数据时,先想循环怎么写”的基本反应。
如果你现在已经能用 for 循环把一组收盘价稳定转换成一组日收益率,并且知道为什么结果条数会少一条,那第 3 讲就算完成。
本讲是《Python量化入门短课》的第 3/8 讲,当前主题是《for循环:批量计算日收益率》。
上一讲:第 2 讲《列表和字典:装下价格与日期》。
下一讲:第 4 讲《函数封装:写一个收益率计算器》。
后续安排:第 5 讲《条件判断:筛出上涨交易日》;第 6 讲《CSV读写:保存再读回价格表》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。