毕业项目②:计算累计净值曲线
我的掌握程度:
先掌握这个答案
计算链:后复权价→日收益(pct_change,注意第一行NaN)→净值=cumprod(1+收益)。基准同步计算。三个常见bug:①用了未复权价(除权跳空变成假暴跌);②第一行NaN没处理(cumprod直接全NaN);③股票与指数日期没对齐(区间差一天,对比全偏)。产出:一列日期+两列净值(股票/基准)的DataFrame。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 把行情数字变成可比较的收益
看股票、基金或策略业绩时,先对齐本金、起止日期、现金流与费用。
- 选一个固定区间,记录期初价值、期末价值、分红、出入金和交易费用。
- 没有中途出入金时,用(期末价值+已取出分红-期初价值-费用)÷期初价值计算收益;有出入金时先区分时间加权与资金加权。
- 用相同区间的基准作比较,同时记录最大亏损;不要单凭一次盈利评价能力。
使用边界
- 不同期限的收益不可直接排名;年化只是换算,不是未来收益承诺。
- 模拟价格不是实时行情。普通股票交易手数、T+1和费用应按具体市场规则核对。
背景 · 从一个困惑说起
数据躺平在parquet里,现在把它变成研究语言:净值曲线——从1出发,按每日收益复利累乘。这条线是接下来所有分析(指标/回撤/对比)的母体。
由此产生的问题
从价格序列到净值序列的正确计算链是什么?常见的实现bug有哪些?
核心概念
计算链:后复权价→日收益(pct_change,注意第一行NaN)→净值=cumprod(1+收益)。基准同步计算。三个常见bug:①用了未复权价(除权跳空变成假暴跌);②第一行NaN没处理(cumprod直接全NaN);③股票与指数日期没对齐(区间差一天,对比全偏)。产出:一列日期+两列净值(股票/基准)的DataFrame。
为什么需要它
①母体地位:年化/波动/回撤/超额全部从净值序列导出;②工程细节即金融正确性:一个NaN处理不当=曲线断头=后续全部作废;③基准对齐是比较的前提(q-036选股域思想的微缩应用)。
实际应用场景
产出net_value.parquet+一行统计(区间总收益:股票X% vs 基准Y%)——这是你研究报告的第一行结论。
与之前知识的联系
q-015概念的手工落地。下一步(q-093/094)在净值序列上提取指标。
⚠ 常见误解
- 净值=价格归一化(price/price[0]):对后复权价确实等价,但要养成「经收益率算净值」的习惯——它兼容含分红、缺失、增减仓的一般情形
- NaN drop掉就行:首行NaN应fillna(0)或从第二行开始,不能dropna破坏日期连续性
- 基准曲线可有可无:没有基准的收益是「温度没有刻度」(q-004)——项目从这一步就要带上基准
🛠 本题实践任务
运行净值计算,输出区间总收益对比(股票vs基准)。检查:净值曲线首日=1.000;两条曲线日期数一致。
💡 提示(先自己想5分钟再看)
如果日期数不一致,说明股票/指数有停牌差异(指数不会停牌)——merge内连接自动处理,但要记录少了哪些天。
✅ 验收标准
净值表+区间收益对比数字。项目进度2/7。你已能回答「这五年它跑赢大盘多少」。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(净值曲线、复权数据),再用案例、公式和代码帮助理解。此功能需要先启用服务。