第一个月:从能运行代码,到能独立检查研究
适合有金融学与高数、线代、概率基础,Python仍依赖AI辅助的学习者。按每周10小时必做、另留2小时补漏安排。第1周从你开始执行时计算,不绑定日历日期;一周未过关就顺延,不靠赶题进入下一周。
怎样执行,怎样才算掌握
- 每周5个学习单元,每个120分钟,可拆成两个60分钟。先读指定小节,再写练习,最后留存结果;不用通读整本教程或刷完一个阶段。
- 练习时允许查文档和请AI解释小段代码,但先自己尝试20分钟。记录AI改了什么、你用什么数据检查它;验收时关闭AI和答案,只保留题干及原始数据。
- 每个评分项0–2分:0=无法完成或关键错误;1=经提示后完成但不能独立解释;2=独立完成且解释正确。总分至少8/10,所有标为“关键”的项必须2分。
- 周末验收通过后,间隔24–48小时做换数据复测。两次都通过,再勾选“掌握”;运行成功、看懂答案或记住输出都不算独立掌握。
- 本月数据全部为教学虚构数据。先学清洗、时间对齐、基准和报告,不接行情账户,不以收益高低评定学习成绩。
数据包包含原始表、核验表、分类表、SQL脚手架与学习记录模板。参考答案在各周底部折叠;评分是自评,不是自动阅卷。
第1周|把收益、复利和回撤写成自己的函数
独立写出3个小函数,解释每一行,能够发现输入错误。先用循环理解过程,再学库。
本周学哪些题
- q-001 · 什么是收益率?为什么它比"赚了多少钱"更重要?
只抓住收益率公式与百分数/小数转换;本周用教学价格,不必抓真实行情。
- q-011 · 复利:各期收益怎样正确合并?
看连乘公式,手算先涨10%再跌10%;不背长期高收益假设。
- q-015 · 净值与最大回撤:别漏掉初始本金
看净值、历史峰值与回撤。初始本金1必须进入净值路径。
对应面试练习
先按本周练习理解,再尝试面试题;不以记住答案原文为目标。
用什么资料,只读哪些部分
- Python官方中文:速览 ↗
只读“数字”和“列表”;亲手运行四则运算、索引和切片。控制在30分钟。
- Python官方中文:控制流 ↗
只读if、for、range与定义函数;暂时跳过match和高级参数用法。控制在40分钟。
- VS Code官方Python入门 ↗
只完成解释器选择、运行文件和一个断点。环境卡住时先用站内题目的Python练习区。
资料入口核验:2026-10-20。英文资料先抓指定示例和输入输出,不必逐页翻译。
五个学习单元 · 每次120分钟
单元1 · 看见变量与输出
30分钟配置或确认Python环境;30分钟读q-001和Python数字小节;40分钟手写100→110、100→90两例,并用print输出小数和百分数;20分钟口述变量和单位。
留下什么:week1.py,至少4行输出;注明编辑器与解释器各负责什么。
单元2 · 用循环把收益连起来
20分钟读q-011;30分钟学列表、for、函数;50分钟写simple_returns(prices)与equity_curve(returns),用[100,110,99,108.9]核对;20分钟在纸上写中间值。
留下什么:两个函数与手算表。约定simple_returns只返回相邻价格之间的n-1个收益,equity_curve返回含初始1的n+1个净值。
单元3 · 加上回撤与边界
25分钟读q-015;55分钟写max_drawdown(equity),返回非负损失比例;20分钟用[1,0.8,0.9]检查首段亏损;20分钟写断言。价格不足2项、非有限值或非正数要明确报ValueError。
留下什么:三个函数、至少5个断言及各断言在防什么错误。
单元4 · 从AI生成转向自己调试
20分钟做I07与I22;40分钟用断点跟踪循环与变量;40分钟故意把连乘改为相加、把历史峰值写成当天净值,观察测试如何失败;20分钟恢复并写错误复盘。
留下什么:bug-notes.md:两次错误、症状、定位与修复;能说明哪些代码是自己写的。
单元5 · 独立验收与补漏
45分钟做下方闭卷验收;15分钟按5项标准评分;40分钟只修最薄弱一项;20分钟整理产物和下一次复测安排。
留下什么:验收代码、评分、失败记录;24–48小时后另用20分钟做迁移复测。
本周交付物
- week1.py:收益率、含初始本金的净值、最大回撤三个函数。
- hand-check.csv:每步价格、收益、净值、历史高点、回撤。
- bug-notes.md:至少两个错误与测试证据。
独立验收:先做,再展开参考结果
45分钟,不看旧代码和AI:从空文件实现三个函数。输入[80,88,79.2,87.12],打印每期收益、累计收益和最大回撤;测试[80,0]、单元素价格以及净值[1,0.8,0.9];用2分钟解释回撤为什么不等于最终收益。
评分表 · 每项0–2分
- 收益公式与复利关键 · 必须2分
能算出8.9%,不用简单相加;小数与百分数转换正确。
- 回撤含初始本金关键 · 必须2分
历史高点逐步更新;[1,0.8,0.9]得到20%。
- 边界与测试
处理非法价格和短输入,写至少5个有明确目的的断言。
- 代码独立性
能解释循环、索引、返回值,现场改一个输入并预测结果。
- 复现与表达
从空文件完成验收,保存输出,2分钟讲清计算口径。
第1周参考结果与核对口径
三期收益为10%、-10%、10%;净值[1,1.1,0.99,1.089];累计收益8.9%,最大回撤10%。[80,0]和单元素价格应按本周输入约定报ValueError;[1,0.8,0.9]最大回撤20%。浮点数比较用容差,不用字符串或精确相等。
隔24–48小时再做:换数据复测
24–48小时后,用[50,45,49.5]重写或独立修改函数;先手算,再运行。20分钟内完成,并解释为何最终收益和最大回撤不同。
第1周迁移复测参考结果
收益-10%、10%;净值[1,0.9,0.99];累计收益-1%,最大回撤10%。能在不看旧答案的情况下得到这些结果并解释,才通过复测。
没通过怎么办
若公式错,回q-001/q-011只做两期手算;若回撤错,画[1,0.8,0.9]并标峰值;若依赖AI,下一次先用10行以内函数练习。关键项未过先重复本周,不增加新库。
第2周|把一张脏表变成有解释的数据
会读CSV、检查唯一键、处理缺失与冲突,并留下可审计日志。每次修复都能说出依据。
本周学哪些题
- q-065 · 脏数据检查:缺失、非法价格、重复与冲突
区分完全重复、键冲突、缺失、非法价格。缺失原因不明时保留问题,不能猜成停牌。
- q-306 · DataFrame的索引哲学:标签即语义
先学行、列、索引和排序;本周只用普通长表,MultiIndex示例可暂跳过。
- q-312 · pct_change:分组、排序与缺失口径
按symbol、date排序后分组计算pct_change(fill_method=None);它不会自动补齐缺失日期。
对应面试练习
先按本周练习理解,再尝试面试题;不以记住答案原文为目标。
用什么资料,只读哪些部分
- pandas官方:读写表格 ↗
只练read_csv、head、dtypes和to_csv;Excel等输入先跳过。
- Python官方:输入与输出 ↗
查格式化输出和读写文件;用于输出日志与报告,不要求背API。
资料入口核验:2026-10-20。英文资料先抓指定示例和输入输出,不必逐页翻译。
五个学习单元 · 每次120分钟
单元1 · 认识同一套教学数据
20分钟读数据包README;30分钟练read_csv、shape、dtypes;50分钟查看prices_raw.csv,把date转日期、close转数值但不覆盖原始表;20分钟写字段字典。
留下什么:week2.py与data-dictionary.md,明确date、symbol、close;日期是教学标签,不推断真实交易日历。
单元2 · 先体检,不急着删除
25分钟读q-065;55分钟统计总行数、全行重复的额外行数、唯一键重复、冲突键组、缺失和非正价格;20分钟用小表手工核对;20分钟记录可疑行。
留下什么:audit.md。重复统计注明keep=False是全部涉及行,keep='first'是额外行;不要混为一项。
单元3 · 依据核验表修复并留痕
20分钟读q-306指定部分;60分钟先去完全重复,再用corrections.csv核验冲突/缺失/零价格,对每个修复保存原值、新值和reason;20分钟检查唯一键和正价格;20分钟按symbol/date排序输出。
留下什么:cleaned.csv共10行、change-log.csv。教学核验表只用于事后质量练习,不能当历史实盘当时已知数据。
单元4 · 按标的计算相邻记录收益
25分钟读q-312;55分钟在清洗结果按symbol分组计算收益,首条保留NaN;20分钟把A的价格交给第1周函数比对;20分钟做I20,口述数据缺失时怎么排查。
留下什么:returns.csv;两只标的的首行收益均缺失,不能跨股票相除。
单元5 · 独立验收与补漏
45分钟只拿原始CSV和核验表重做清洗;15分钟评分;40分钟修一个薄弱环节;20分钟整理数据字典、日志与复测计划。
留下什么:独立重建的cleaned.csv、审核记录和评分。
本周交付物
- week2.py:可重复运行的读取、检查、核验修复和收益计算。
- cleaned.csv与returns.csv:保持清楚的行粒度和排序。
- audit.md与change-log.csv:记录异常统计、依据和每次修复。
独立验收:先做,再展开参考结果
45分钟关闭旧代码:读取数据包原始12行,说明重复/冲突/缺失/非法值数量;依据核验表修复成唯一(date,symbol)记录,排序后计算收益;写3个断言验证行数、唯一键和正价格。禁止无条件ffill或静默保留冲突的第一条。
评分表 · 每项0–2分
- 异常识别有准确口径
分清完全重复额外1行、冲突键组1个、缺失1行和零价1行。
- 修复有证据关键 · 必须2分
冲突按核验表处理并记日志,没依据不填值、不猜停牌。
- 时序与分组正确关键 · 必须2分
排序后按标的计算;每组首条缺失,不跨组、不伪造收益。
- 可重复与有检查
原始文件不变,脚本再跑结果一致,至少3个断言。
- 独立解释与记录
能指认修复前后具体行,并解释没有数据时应该怎样报告。
第2周参考结果与核对口径
原始12行。全行完全重复额外1行(A的01-06);按(date,symbol)去重前额外2行,其中A的01-07有120/121冲突,冲突键组1个;缺失close为1行,非正close为1行。去完全重复剩11行,按核验表处理后10个唯一键。A价格[100,110,121,110,121];B价格[50,52.5,55,60.5,60.5]。各组第一条收益缺失,A累计21%、B累计21%。异常类别可能交叉,不把所有统计机械相减。
隔24–48小时再做:换数据复测
隔24–48小时使用第2周跟练包的transfer_exam.csv(6条乱序记录,两标的,没有核验表)。20分钟内独立排序分组,标记缺失并计算相邻记录收益;说明哪些收益能算、哪些不能算,再解释删掉缺失行会怎样。跟练中已经演示的transfer_missing.csv不作为唯一复测证据。
第2周迁移复测参考结果
保留6行:A按日期为20、缺失、24,三条收益都缺失;B为50、55、60.5,首条缺失,其后10%、10%,累计21%。总计4个缺失收益。A首末价格涨20%只是跨缺口变化,不能据此补造每日收益;删掉中间行后会出现20%的跨缺口相邻记录收益。不能无依据填值或认定停牌。
没通过怎么办
异常数对不上,先手工圈出12行的键;收益错位,打印每组前三行;一遇NaN就想填值,先做迁移小表。最小表核对通过后再回到整表。
第3周|分组、合并与一小段SQL
能说清一张表的每行代表什么,发现JOIN扩行;用pandas和SQL计算同一列并逐行核对。
本周学哪些题
- q-309 · groupby:先定义分组,再核对输出粒度
区分agg汇总与transform贴回;截面统计要包含date分组,不能把未来日期一起平均。
- q-310 · merge:检查连接键、缺配和历史时点
使用validate和indicator;同键冲突先解释,不能为让合并成功而盲目去重。
- q-316 · 缺失值处理:先说明原因与假设
缺失的成因、处理假设和日志;行数不变并不等于处理正确。
对应面试练习
先按本周练习理解,再尝试面试题;不以记住答案原文为目标。
用什么资料,只读哪些部分
- pandas官方:汇总统计 ↗
练按symbol计数、均值与groupby;每次先预测输出行数。
- pandas官方:合并表格 ↗
只学concat与merge的区别,再用本周静态行业表练left join。
- SQLite官方:窗口函数 ↗
只查PARTITION BY、ORDER BY与lag的示例。第3周跟练包的03_sql.py使用Python自带sqlite3执行returns.sql,无需安装数据库服务;首月包sql_lab.py保留为可选空白脚手架。
资料入口核验:2026-10-20。英文资料先抓指定示例和输入输出,不必逐页翻译。
五个学习单元 · 每次120分钟
单元1 · 分组前先说行粒度
25分钟读q-309;55分钟从cleaned.csv按symbol输出记录数、首末价格和累计收益,再按date输出记录数;20分钟用纸写每张输出表的键;20分钟解释为什么不能只按行业对全部日期平均。
留下什么:summary.csv:每标的1行;notes.md说明原始表与汇总表的行粒度。
单元2 · 故意制造一次合并错误
25分钟读q-310;45分钟用sectors.csv按symbol做left merge,设置validate='many_to_one'和indicator;30分钟把B的行业行复制后改成另一行业,确认程序拒绝;20分钟做I08。
留下什么:join-check.md:正确合并10行、缺配0;冲突右表触发错误,记录怎么查而非直接drop_duplicates。
单元3 · 用已有脚手架开始SQL
30分钟运行并读第3周跟练包的03_sql.py(先把第2周cleaned.csv复制到week3.py同目录);30分钟手写SELECT、ORDER BY、GROUP BY计数;40分钟修改returns.sql练LAG窗口查询;20分钟做I09。
留下什么:自己编写并注释的returns.sql:按symbol分区、按date排序,取前一期价格并计算收益。
单元4 · 双实现核对与缺口复盘
20分钟读q-316;60分钟将SQL收益和pandas收益按(date,symbol)合并,对非缺失数值用容差比较、对缺失单独比较;20分钟删除中间日期重新观察;20分钟写口径说明。
留下什么:compare.csv和断言:10行、2个首条缺失;说明LAG和shift都按记录而非自动按交易日。
单元5 · 独立验收与补漏
45分钟做合并与SQL验收;15分钟评分;40分钟修边界/排序错误;20分钟收集代码、对照表与复测安排。
留下什么:能从cleaned.csv重现pandas/SQL对照,不要求记住全部SQL语法。
本周交付物
- summary.csv与join-check.md:行粒度、键、合并前后行数、缺配与冲突处理。
- SQL查询与compare.csv:两种实现逐行对照。
- 至少一个坏连接键测试,以及缺失值口径说明。
独立验收:先做,再展开参考结果
45分钟可保留第3周week3.py中的连接与读文件脚手架,但自行重写分组、合并、returns.sql查询与核对。先正确合并行业表,再主动构造重复右键并使检查报错;用LAG计算收益并与pandas逐行比较。解释B的01-07收益与01-08收益。首月包sql_lab.py也可作为空白连接脚手架,选一种即可。
评分表 · 每项0–2分
- 键和行粒度
说清原始表每行一个(date,symbol),汇总每行一个symbol。
- 合并边界关键 · 必须2分
检查基数和缺配,重复右键被拒绝,不盲目删冲突。
- SQL分组与顺序关键 · 必须2分
LAG含PARTITION BY与ORDER BY;前值缺失正确传播。
- 双实现验证
按键比较、数值用容差、缺失单独判断,并得到一致结果。
- 解释缺口与失败
知道相邻记录不必是相邻交易日,能讲出一次错误及定位过程。
第3周参考结果与核对口径
正确合并10行且行业无缺配;重复右键应被validate='many_to_one'拒绝。SQL先用LAG(close) OVER (PARTITION BY symbol ORDER BY date) AS prev_close,再计算1.0*close/NULLIF(prev_close,0)-1。B的01-07收益55/52.5-1=约4.761905%;01-08为60.5/55-1=10%。10行中2行首条收益缺失。累计收益与groupby平均单期收益不是同一个量。
隔24–48小时再做:换数据复测
隔24–48小时使用第3周跟练包transfer_prices.csv与transfer_sectors.csv:A=[100,105]、B=[20,18],日期为2026-02-02/03且输入乱序,行业只有A。20分钟内独立完成左连接、pandas和SQL收益,按键、缺失位置与数值核对,解释缺配和应保留的行数。
第3周迁移复测参考结果
左连接保留4行;B两行行业缺失并被标记,不能静默删掉。A第二期收益5%,B为-10%;每组首条缺失。若漏PARTITION BY或漏按标的分组,会跨组配对,不能通过。
没通过怎么办
JOIN有问题就退回2×2小表手工列匹配;LAG有问题先输出prev_close,不急着算收益;SQL语法不熟可练一条SELECT,再加分组和窗口,保留中间结果。
第4周|做一次可复现的研究交付
把计算、数据与时间边界串起来,交付一份小报告;能说明失败、个人贡献和下一步。
本周学哪些题
- q-010 · 量化投资的完整工作流是什么?(全局地图)
只看数据→研究→回测→复核的关系,把本月文件放进对应环节;暂不做实盘。
- q-313 · shift:方向、标签与成交时点
在小表上看shift正负方向,再区分数据可得、信号产生、成交和收益区间。
对应面试练习
先按本周练习理解,再尝试面试题;不以记住答案原文为目标。
用什么资料,只读哪些部分
- 本站研究项目 ↗
第4周跟练包已包含原research.py与5个计算测试,另加5个交付检查;读README的时间/费用假设和backtest,不急着引入Qlib。原项目包仍可独立使用。
- Pro Git中文:起步与基础 ↗
会status、diff、add、commit即可。若不使用Git,先保存明确命名的版本及修改记录,不要阻塞本周交付。
- scikit-learn:常见陷阱 ↗
只读数据泄漏部分的解释,能说出为何不能用全样本信息选参数;本月不要求训练模型。
资料入口核验:2026-10-20。英文资料先抓指定示例和输入输出,不必逐页翻译。
五个学习单元 · 每次120分钟
单元1 · 用三行数据画时间轴
25分钟读q-313;45分钟手写[10,11,12]的shift(1)和shift(-1);30分钟做I10并画可得/信号/成交/收益四个时点;20分钟给旧代码中的每个中间列注明时间。
留下什么:timing.md:不能只说“shift了所以安全”,要指出计算与成交假设。
单元2 · 复现教学项目
25分钟读第4周跟练包README;45分钟运行10项测试(原计算5项+交付5项)和02_reproduce.py;30分钟手算daily.csv前6行;20分钟把项目种子、代码/数据哈希与环境写入实验记录。
留下什么:项目原始运行结果、manifest和手算表;区分模板自带与自己的改动。
单元3 · 一个改变,一组对照
20分钟做I17;50分钟比较0/5/20bp费用下同一策略结果,说明换手定义;30分钟改末尾价格验证更早结果不变;20分钟记录全部结果与解释,不挑最好的一行。
留下什么:experiments.csv和prefix-check记录;本月以流程正确为目标,不追求正收益。
单元4 · 写报告并讲给别人听
20分钟做I21/I23;60分钟写1–2页报告:问题、数据、方法、基准、结果、局限、贡献、下一步;20分钟录制或口述5分钟讲解;20分钟根据自己讲不清的地方修改。
留下什么:report.md或PDF、一段5分钟讲解提纲、3个局限与一个可执行的下一步。
单元5 · 月度验收与下月入口
60分钟按下方任务重新运行与讲解;15分钟评分;25分钟修薄弱点;20分钟决定下月先补Python/SQL还是进入更完整的研究。
留下什么:完整交付目录、验收记录与一条下月优先任务;隔24–48小时做迁移复测。
本周交付物
- 可重跑的代码、数据说明、环境与测试记录。
- experiments.csv:原始实验、成本对照、失败与修正。
- 1–2页报告和5分钟讲解,明确教学数据与模板贡献。
独立验收:先做,再展开参考结果
60分钟:把项目复制到新文件夹(或重新解压),按README跑通测试与结果;从更早价格推出一笔持仓;解释为什么提高费用不应改善这套固定持仓策略的终值;修改序列末尾并核对过去结果不变;不用AI做5分钟项目汇报。验收可用自己的README和代码,不能照念答案。
评分表 · 每项0–2分
- 时间边界关键 · 必须2分
手算持仓正确;明确可得/决策/成交/收益,未来变动不影响过去。
- 计算与成本关键 · 必须2分
收益、回撤、基准与费用口径说得清,成本对照符合固定路径预期。
- 可复现交付
按第4周README在新目录运行,10项测试通过,关键CSV可复现,版本和数据记录齐全。
- 研究表达
5分钟讲清问题、证据、失败、局限和下一步,不把收益高当唯一结论。
- 独立贡献
能指出自己改了什么,现场解释或修改小函数,并如实说明AI辅助。
第4周参考结果与核对口径
项目区间i指close[i-1]→close[i],持仓看截至close[i-2]的价格变化,留出一整期延迟;同一持仓路径下,费用上升应降低终值或在无成交时不变。只修改未来输入不得改变此前的持仓和收益。第4周包全部10项测试应通过(原计算5项+交付5项),但这并不等于策略真实可交易;必须解释合成数据、简化成交、费用口径和期末不强制平仓。
隔24–48小时再做:换数据复测
24–48小时后,用价格[100,120,100,110,100,110]、费用0,手算项目的5段持仓、收益与累计收益;指出哪一段退出持仓,以及所用信号来自哪段历史。随后从空白提纲讲出项目假设、最薄弱证据和一个下一步实验。限20分钟。
第4周迁移复测参考结果
5段持仓[0,0,1,0,1];对应收益[0,0,10%,0,10%],累计收益21%。第3段持仓来自更早的100→120;第4段退出来自120→100的下跌,不由当期价格决定。新数据结果必须与代码一致。下一步实验须能区分一个具体原因,例如只改变费用或检查时点;不能只说继续调参。
没通过怎么办
时间题没过,先回第1周和q-313用四个价格画图;复现失败,先补README与环境记录;讲不清项目,删掉复杂指标只保留一个问题和一组对照。四周通过后再增加模型复杂度。
第一个月 · 验收与复测记录
0 / 8 项已自查。这8项记录独立验收和迁移复测,不记录看过多少页。每周两项都完成再记为掌握;不会自动判分。
仅存当前浏览器;导出为文本备份。不会自动投递或联系招聘方。