基础入门
本讲把上一讲的收益率循环收进一个最小函数,明确输入、处理过程与返回值,让初学者第一次感受到代码复用带来的结构收益,并为后面的筛选、异常处理和摘要生成打下接口基础。
第 4 讲开始把前一讲已经写出来的循环,收进一个可重复调用的小函数里。目标很具体:写一个最小收益率计算器,让你以后换一组价格时,不用每次都重新拼整段循环。这一步对 Python 入门很关键,因为从这里开始,你就不只是“把代码跑通”,而是在主动整理自己的代码结构。
学完这一讲后,你可以直接完成下面几件事:
函数封装做好以后,后面加条件判断、异常处理和摘要统计时,代码会明显更稳。
到第 3 讲为止,你已经能用循环批量算出收益率了。但如果你每次都把那段循环原样复制一遍,代码很快会变得重复,而且一旦要改逻辑,就得处处同步修改。第 4 讲要解决的,就是这个最常见的入门问题:相同动作怎么只写一次。
收益率计算器之所以适合作为第一类函数,是因为它满足三个条件:
所以这节课的重点不是“函数语法有多高级”,而是让你第一次感受到封装带来的实际好处。
prices = [12.34, 12.80, 12.65, 13.10]
这节课仍然不用第三方库,也不引入更大数据。当前重点是函数边界,而不是样本规模。
下面四步分别处理“先定输入”“再写主体”“然后返回结果”“最后真正调用”。
def calc_simple_returns(prices):
pass
这里的 prices 就是函数输入。它的意思很简单:外面谁给我一组价格,我就按这组价格去算。
def calc_simple_returns(prices):
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)
你会发现,函数体里的核心逻辑和第 3 讲几乎一样。第 4 讲真正新增的,不是公式,而是把它包进了一个边界更清楚的容器里。
def calc_simple_returns(prices):
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)
return returns
很多初学者第一次写函数时,最容易漏掉的就是 return。如果没有这句,函数虽然运行了,但外面拿不到结果。
prices = [12.34, 12.80, 12.65, 13.10]
returns = calc_simple_returns(prices)
print(returns)
for ret in returns:
print(f"日收益率: {ret:.2%}")
到这一步,你已经不需要在主流程里再展开整段循环,只要把价格交给函数即可。
当前不需要复杂测试,把输入、输出和复用这三点验证清楚就够了。
returns = calc_simple_returns(prices)
assert isinstance(returns, list)
assert len(returns) == len(prices) - 1
other_prices = [20.00, 20.50, 20.10]
other_returns = calc_simple_returns(other_prices)
assert len(other_returns) == 2
assert abs(returns[0] - ((12.80 - 12.34) / 12.34)) < 1e-9
只要这几条都成立,就说明你已经把收益率逻辑真正封装成了一个后面还能继续用的工具。
第 4 讲最常见的问题,不在公式,而在函数边界。
因为函数最好自己管理自己的中间变量。这样外面的代码更干净,也不容易和别的列表混在一起。
因为不返回,外部就拿不到结果。你会看到函数跑完了,但 returns = calc_simple_returns(prices) 得到的是 None。
因为后面你很可能还会写筛选函数、摘要函数。函数名如果太含糊,代码一多就会很难读。
也不是。第 4 讲先封装收益率,是因为这段逻辑已经重复出现,而且后面还会继续复用。是否封装,关键看“会不会反复用”。
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]
returns = calc_simple_returns(prices)
print(returns)
这种“上面定义函数,下面调用函数”的写法,后面会越来越常见。尽早习惯,会让你的 Python 代码更像一个可复用的小工具,而不是一次性脚本。
很多初学者在这一讲之前,写代码的方式更像是在回答一道题:把结果算出来就结束。函数封装带来的变化是,你开始站在下一次还要再用的角度写代码。这个视角很重要,因为真实的量化研究工作里,几乎没有哪个动作只做一次。
从这个角度看,第 4 讲写出的不只是一个收益率函数,而是你第一次主动为后续步骤整理出一个稳定接口。
如果你现在已经能把收益率计算封装成一个函数,并且换一组价格也能继续调用它,那第 4 讲就算完成。
本讲是《Python量化入门短课》的第 4/8 讲,当前主题是《函数封装:写一个收益率计算器》。
上一讲:第 3 讲《for循环:批量计算日收益率》。
下一讲:第 5 讲《条件判断:筛出上涨交易日》。
后续安排:第 6 讲《CSV读写:保存再读回价格表》;第 7 讲《异常处理:避开空值和除零》。
风险揭示与免责声明
本页面内容仅用于量化研究与技术交流,旨在展示研究方法与流程,不构成对任何金融产品、证券或衍生品的要约、招揽、推荐或保证。
本文所涉历史数据、回测结果与示例参数不代表未来表现,也不应作为投资决策依据。
市场存在波动、流动性与执行偏差等不确定性,任何策略均可能出现收益波动或阶段性失效。
读者应结合自身风险承受能力进行独立判断,并在必要时咨询持牌专业机构意见。