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

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

RONG CREDIT TECHNOLOGY CO., LTD.

基础入门

【Python 系列 第4讲】函数封装:写一个收益率计算器

本讲把上一讲的收益率循环收进一个最小函数,明确输入、处理过程与返回值,让初学者第一次感受到代码复用带来的结构收益,并为后面的筛选、异常处理和摘要生成打下接口基础。

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

目录

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讲】生成一份行情摘要

一、为什么函数封装不是“学高级写法”,而是让量化小脚本开始有结构的第一步

很多初学者第一次接触函数时,会把它误解成一种“更高级的语法”,好像只有代码变复杂了,才有必要去封装。实际上,对量化入门脚本来说,函数封装更像是一种很早就该建立的结构意识。只要某个动作会重复出现,或者你已经明显感受到一段代码以后还要再用,那么把它收进函数,往往比继续复制粘贴更稳。

收益率计算器正是最适合作为第一个函数练习对象的例子。因为它的输入清楚,就是一组价格;处理逻辑你上一讲已经练过;输出也明确,就是一组收益率。也就是说,公式本身已经不是难点,当前真正要学的是:如何把一段已经跑通的逻辑,变成一个以后换数据也能继续调用的小工具。

所以第 4 讲的重点,不在于“函数看起来更专业”,而在于它让你的代码第一次从一次性运行的片段,开始朝可复用、可维护的结构迈进一步。这一步在量化编程里非常重要。

二、为什么“同样的动作只写一次”会显著改变你后面写代码的方式

在没有函数之前,很多人会自然地把一段逻辑直接写在主流程里。刚开始当然能工作,但只要你想换一组价格再算一次,或者后面要在别的地方复用,复制粘贴就会很快出现。短期看似省事,长期却会让代码越来越难维护。因为一旦收益率逻辑需要调整,你必须回头改多个地方,稍不小心就会前后不一致。

函数封装在这里带来的最大变化,其实不是语法层面的,而是思路层面的。你开始接受一件事:相同动作最好只保留一个定义点。以后无论输入换成什么,只要把新数据交给同一个函数即可。这个变化看起来很朴素,却几乎是所有程序化工作的基础。你不再把代码当成一次性答案,而开始把它当成一个可以反复调用的小部件。

对量化入门来说,这个转变非常关键。因为真实研究里,很少有哪个动作只做一次。收益率、筛选、读写、汇总,都会一遍遍重复。越早建立“相同动作只写一次”的习惯,后面越容易写出清楚的代码。

三、为什么函数最值得先看清的是输入、处理过程和返回值三层边界

很多人第一次写函数时,最大的困惑不在于 def 怎么写,而在于脑子里还没有真正形成函数边界。也就是说,自己不够清楚:什么应该从外面传进来,什么应该在函数里面完成,最后又该把什么结果交还给外面。第 4 讲之所以特别适合作为这个边界训练,就是因为收益率计算器的三层结构非常清楚。

输入是一组价格,处理过程是遍历相邻两天并计算收益率,返回值是一组结果列表。只要这三层边界清楚,函数就不会显得神秘。你会知道它不是一个黑盒,而是一个把输入变成输出的稳定接口。对入门者来说,这种边界感特别重要,因为它会帮你摆脱“函数就是把代码包起来”的模糊理解,转而开始从接口角度看问题。

一旦这种思维建立起来,后面你写别的函数时也会越来越顺。你不再只是堆代码,而是自然会先问:我要收什么进来,中间怎么处理,最后交什么出去。这正是函数最值得早点学会的部分。

四、为什么return这一句看起来短,却往往决定函数有没有真正完成任务

很多初学者第一次写函数时,最容易犯的错误之一,就是函数内部明明已经把结果算出来了,却忘了 return。程序看起来也跑了,甚至内部还有 print() 输出,于是会误以为函数已经完成任务。实际上,只要没有 return,外部就拿不到这个结果,函数在结构意义上就没有真正闭合。

这也是为什么 return 这一句虽然很短,却值得在入门阶段单独强调。它标志着函数不是只在内部做完事情,而是把结果明确交还给外部主流程。对收益率计算器来说,这一点尤为直观。外部要继续拿这组收益率去打印、筛选、统计,就必须通过返回值拿到它们。若只有内部打印,没有返回结果,后面的流程根本接不上。

因此,第 4 讲强调 return,并不是在抠语法细节,而是在帮你建立一种非常重要的闭环意识:函数的工作,只有在结果能够稳定返回给外部时,才算真正完成。

五、为什么函数名和参数名写清楚,会直接影响后面代码是否还能读懂

初学者有时会把函数看成“反正自己现在看得懂”的东西,于是函数名和参数名写得很随意。短期也许无碍,但只要代码一多,命名质量会立刻影响可读性。尤其在量化入门脚本里,后面你很可能还会写筛选上涨日函数、读写 CSV 函数、异常处理函数。如果第一个函数就命名含糊,后面代码很快会变成一团不太好辨认的工具堆。

收益率计算器这一讲,正是建立命名意识的一个好机会。函数名应该让人一看就知道“它是在算简单收益率”,参数名则最好直接指向“输入是一组价格”。这样一来,哪怕几天后再回头看,或者别人接手这段代码,也能迅速读懂它在做什么。对入门者来说,这种清晰命名比很多人想象中更重要,因为它其实是在为后面的扩展保留可读性空间。

所以,第 4 讲不该只停在“能运行就行”。只要开始封装函数,就应该顺手把命名也往清楚、直接的方向拉。这会让你后面写代码轻松很多。

六、为什么函数封装会自然促使你开始思考“测试另一组输入”

一段写在主流程里的循环,很多时候只要能对当前样本跑通,初学者就容易停下。但一旦它被封装成函数,一个非常自然的新问题就会冒出来:如果我换一组价格,这个函数还能不能继续用?这其实是件好事,因为它说明你的思考开始从“当前能不能跑”转向“这个工具到底稳不稳”。

收益率计算器特别适合练这种意识。你只要把另一组价格列表交进去,马上就能验证函数是否真的具备复用性。这个动作的价值很大,因为它会逼你确认函数写的不是“恰好对当前样本有用”,而是“对同类输入都应该有效”。对编程入门来说,这正是从一次性脚本走向小工具思维的关键一步。

也就是说,第 4 讲并不只是教你把旧代码包进 def,还在顺手培养一种更像工程的反应:当逻辑被封装后,下一步自然应该是用不同输入去验证它是不是仍然成立。

七、为什么这一讲真正建立的,是“复用意识”而不是单纯的函数语法

很多教程讲函数时,会先从定义、参数、返回值等语法点切入,这当然必要。但对量化入门的实际使用场景来说,更值得抓住的核心是复用意识。也就是你开始意识到:一旦某段逻辑以后还会继续出现,就不该让它散落在多个地方,而应该给它一个统一入口。收益率计算器恰恰是最适合建立这种意识的起点。

复用意识会直接改变你后面写代码的方式。你不再总想着“这次先写出来再说”,而会更早地考虑“这段以后还会不会再次出现”。这种思维一旦建立,函数就不再像额外负担,反而会成为整理代码最自然的动作。对于量化脚本这种重复计算场景很多的工作来说,这种转变尤为重要。

因此,第 4 讲最值得带走的,其实不是一个具体函数,而是你开始从“完成一次任务”转向“做出一个以后还能继续调用的小部件”。这一步非常关键。

八、这一讲为后面的条件判断、CSV 读写和异常处理准备了什么

一旦收益率计算已经被封装成函数,后面几讲就会明显轻松很多。条件判断时,你不需要再把收益率循环重写一遍,只需要调用函数得到结果,再对结果做筛选;CSV 读写时,你也可以先把文件里的价格读进来,再统一交给这个函数处理;异常处理时,更是能把“边界条件怎么挡住”放回函数内部统一考虑。也就是说,第 4 讲其实是在给后面的多个主题同时打底。

这也是为什么函数封装看起来不像“马上能出新结果”的步骤,却仍然非常值得被单独讲。它不像再多加一个业务逻辑那样显眼,但它会显著提升后续所有代码的结构清晰度。只要这一讲先走稳,后面每一讲都会更像是在同一个小工具箱上继续扩展,而不是重新从头拼脚本。

所以,第 4 讲真正做的,是让整个 Python 入门系列开始有了一点“可维护”的味道。这种味道会在后面越走越明显。

九、为什么这一讲做完后,最好已经形成“主流程变短了”的判断

函数封装真正带来的效果,不只是逻辑被包进了 def,而是主流程会因此变短、变清楚。只要这一讲做得比较扎实,你应该已经能明显感觉到:原来需要在主流程里反复展开的计算逻辑,现在可以被一个名字代替。这个变化非常重要,因为它意味着你开始能用结构去管理代码,而不是只能靠注释和记忆硬撑。

这种判断值得尽早建立。因为以后你每次怀疑某段逻辑是否该封装时,都可以先问自己一句:把它收进函数以后,主流程是否更清楚了。如果答案是肯定的,通常就说明封装方向是对的。

十、这一讲也在帮你建立“函数首先服务于稳定复用”的认识

很多初学者第一次学函数时,容易把它看成一种更高级的写法,好像只有代码变复杂了才需要函数。其实更准确的理解是,函数首先服务于稳定复用。只要某个动作以后还会反复出现,就值得尽早收成一个小部件。第 4 讲把收益率计算函数化,正是在训练这种认识。这里的重点不在炫语法,而在让后面的条件判断、CSV 读写和异常处理都能站在同一个稳定入口上继续往前走。

这种认识会直接影响你后面的代码风格。你会更愿意提前把重复逻辑收住,而不是等脚本变长以后再被动返工。

十一、这一讲结束时,最好已经具备怎样的验收标准

如果这一讲已经真正完成,你通常能达到一个很基础但很重要的验收标准:别人问你函数收了什么输入、做了什么处理、最终返回什么结果时,你可以不用回头逐行看代码,也能完整讲出来。只要这三层边界都能说清,说明这个收益率计算器已经不再只是你照着写出的代码块,而是真正变成了你能掌控的小部件。

这种验收标准看起来很朴素,却很能说明问题。因为函数一旦连边界都讲不清,就很难真的被后面的代码稳稳复用。

十二、这一讲也在帮你建立“封装后要信任入口,不要回头复制逻辑”的习惯

函数一旦写好,下一步很值得建立的习惯,就是尽量信任这个入口,而不是在主流程里又把原来的逻辑偷偷复制回来。第 4 讲的真正意义之一,就在于帮你完成这次思维切换。也就是说,既然收益率计算器已经形成,后面的条件筛选、CSV 读写和异常处理就应该优先围绕这个入口展开,而不是每次都重新展开旧代码。只要这种习惯开始建立,函数封装才算真正产生了结构价值。

这点看起来细小,其实很关键。因为很多初学者虽然写出了函数,但后面的主流程仍然不断回头复制原逻辑,结果代码既没有更短,也没有更清楚。第 4 讲先把这层习惯立住,后面的扩展才会真正轻松。

十三、总结

这一讲的重点,不只是会写出一个 def,而是第一次把已经跑通的收益率循环整理成一个可复用的小工具。你需要清楚函数的输入、处理过程和返回值边界,理解为什么 return 决定了函数是否真正闭合,也开始建立“相同动作只写一次”的复用意识。只要这些层已经立住,这一讲就真正完成了它的作用。

十四、系列衔接

本讲是《Python量化入门短课》的第 4 讲,当前主题是《函数封装:写一个收益率计算器》。上一讲已经在主流程里完成了收益率的批量计算,这一讲则把那段逻辑正式封装成了可复用函数。下一讲会在这个基础上继续加入条件判断,第一次从“算出结果”迈向“按结果筛选样本”。

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

风险揭示与免责声明

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

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

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

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