小说网站怎么做原创wordpress免费么
小说网站怎么做原创,wordpress免费么,许昌企业网站建设公司,wordpress忘记以前版本用Pandas驯服价值投资数据#xff1a;从混乱到有序的标准化之路
关键词
Pandas | 量化价值投资 | 数据标准化 | Z-score | Winsorization | 财务数据处理 | 价值得分
摘要
价值投资的核心逻辑是“以合理价格买入优质公司”#xff0c;但现实中的财务数据往往像一堆“穿不同尺…用Pandas驯服价值投资数据从混乱到有序的标准化之路关键词Pandas | 量化价值投资 | 数据标准化 | Z-score | Winsorization | 财务数据处理 | 价值得分摘要价值投资的核心逻辑是“以合理价格买入优质公司”但现实中的财务数据往往像一堆“穿不同尺码衣服的人”——营收有亿级和百万级的差异ROE有10%和50%的波动异常值如突发的非经常性收益更是会打乱判断。数据标准化就是给这些数据“穿统一尺码的衣服”让不同指标、不同公司之间能公平比较。本文将以Pandas为工具一步步拆解价值投资中数据标准化的底层逻辑从“为什么要标准化”的背景讲起用“考试分数”“剪树枝”等生活化比喻解释Z-score、Min-Max、Winsorization等核心概念再通过真实财务数据案例演示如何用Pandas实现标准化并最终计算出可用于选股的“价值得分”。无论你是量化投资新手还是想优化数据流程的从业者都能从本文学到可落地的方法。一、背景介绍为什么价值投资需要“数据标准化”1.1 价值投资的“痛点”数据的“不公平性”价值投资大师巴菲特的投资逻辑可以简化为两个问题这家公司“好”吗用ROE、净利润增长率等指标衡量这家公司“便宜”吗用PE、PB、PS等指标衡量但直接用原始财务数据比较会遇到两个致命问题量纲差异比如茅台的营收是1000亿而一家中小公司的营收是10亿直接比较净利润会误以为茅台“更赚钱”但其实中小公司的净利润率可能更高比如15% vs 10%。异常值干扰比如某公司因出售资产获得10亿非经常性收益导致净利润暴增10倍这种“假增长”会误导模型认为它是“优质公司”。数据标准化的作用就是消除这些“不公平性”让指标之间能“站在同一起跑线”上比较。1.2 目标读者谁需要这篇文章量化投资新手想学习如何用Python处理财务数据构建自己的价值投资策略。数据分析师需要优化财务数据流程提高分析效率。价值投资者想从“定性判断”转向“定量分析”用数据支撑投资决策。1.3 核心挑战如何用Pandas高效解决标准化问题Pandas是Python生态中处理结构化数据的“瑞士军刀”但很多人不知道如何将其与价值投资场景结合。本文要解决的核心问题是如何用Pandas处理财务数据中的异常值如何选择合适的标准化方法Z-score/Min-Max如何将标准化后的数据转化为可用于选股的“价值得分”二、核心概念解析用生活化比喻读懂标准化2.1 数据标准化给财务数据“穿统一衣服”假设你要给10个人选衣服他们的身高从150cm到190cm不等。如果直接买“均码”肯定有人穿不下。数据标准化就是把“身高”转化为“相对身高”比如用“(身高-均值)/标准差”计算Z-score这样不管原始身高是多少都能转化为“相对于群体的位置”。财务数据中的“营收”“净利润”就像“身高”标准化后的数据就像“相对身高”让不同公司的指标能公平比较。2.2 三大核心方法Z-score、Min-Max、Winsorization我们用“考试分数”的例子来解释这三个方法1Z-score“你的分数比平均分高多少个标准差”假设全班数学平均分是80分标准差是10分。你的分数是90分那么Z-score就是(90-80)/101意味着你比平均分高1个标准差大约排在前16%。数学公式Zx−μσ Z \frac{x - \mu}{\sigma}Zσx−μ其中xxx是原始值μ\muμ是均值σ\sigmaσ是标准差。适用场景指标近似正态分布如ROE、净利润增长率需要知道“相对于群体的位置”。2Min-Max“你的分数在全班的排名比例是多少”假设全班最高分是100分最低分是60分。你的分数是90分那么Min-Max值就是(90-60)/(100-60)0.75意味着你排在前25%。数学公式Xnormx−min(x)max(x)−min(x) X_{\text{norm}} \frac{x - \min(x)}{\max(x) - \min(x)}Xnormmax(x)−min(x)x−min(x)适用场景指标有明确上下限如资产负债率范围0-100%需要将数据压缩到0-1之间。3Winsorization“把过高或过低的分数剪掉”假设全班有个同学考了120分满分100这显然是异常值。Winsorization就是把超过“95%分位数”的分数替换为95%分位数的值比如100分低于“5%分位数”的替换为5%分位数的值比如60分。适用场景处理异常值如突发的非经常性收益、财务造假数据避免异常值干扰标准化结果。2.3 概念间的关系标准化的“流水线”数据标准化不是孤立的步骤而是一个“流水线”输入原始数据比如营收、净利润、ROE等指标。异常值处理用Winsorization剪掉极端值。标准化用Z-score或Min-Max将数据转化为统一量纲。输出标准化数据用于计算价值得分或构建模型。我们用Mermaid画一个流程图更直观地展示这个过程原始财务数据缺失值处理异常值处理Winsorization选择标准化方法Z-score/Min-Max输出标准化数据计算价值得分选股决策三、技术原理与实现用Pandas一步步做标准化3.1 准备工作安装依赖库首先我们需要安装Pandas、NumPy、Scipy用于Winsorization、Scikit-learn用于标准化pipinstallpandas numpy scipy scikit-learn3.2 步骤1加载并清洗数据我们用模拟的A股公司财务数据来演示真实数据可以从Tushare、聚宽等平台获取importpandasaspdimportnumpyasnp# 模拟5家公司的财务数据2023年年报datapd.DataFrame({公司代码:[600519.SH,000858.SZ,000001.SZ,601318.SH,002594.SZ],公司名称:[贵州茅台,五粮液,平安银行,中国平安,比亚迪],营收(亿元):[1241.0,662.0,1799.0,1110.0,4240.0],# 比亚迪营收异常高新能源爆发净利润(亿元):[627.0,266.0,363.0,477.0,30.0],# 比亚迪净利润异常低研发投入大ROE(%):[32.5,25.8,11.2,13.0,8.5],# 茅台ROE最高PE(倍):[25.0,18.0,5.0,7.0,150.0],# 比亚迪PE异常高成长预期PB(倍):[11.0,6.0,0.8,1.2,10.0]# 平安银行PB最低破净})# 查看数据基本信息print(data.info())print(data.describe())输出结果class pandas.core.frame.DataFrame RangeIndex: 5 entries, 0 to 4 Data columns (total 7 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 公司代码 5 non-null object 1 公司名称 5 non-null object 2 营收(亿元) 5 non-null float64 3 净利润(亿元) 5 non-null float64 4 ROE(%) 5 non-null float64 5 PE(倍) 5 non-null float64 6 PB(倍) 5 non-null float64 dtypes: float64(5), object(2) memory usage: 408.0 bytes 营收(亿元) 净利润(亿元) ROE(%) PE(倍) PB(倍) count 5.000000 5.000000 5.000000 5.000000 5.000000 mean 1810.400000 352.600000 18.200000 41.000000 5.800000 std 1411.571461 227.473076 9.746795 58.651496 4.154516 min 662.000000 30.000000 8.500000 5.000000 0.800000 25% 1110.000000 266.000000 11.200000 7.000000 1.200000 50% 1241.000000 363.000000 13.000000 18.000000 6.000000 75% 1799.000000 477.000000 25.800000 25.000000 10.000000 max 4240.000000 627.000000 32.500000 150.000000 11.000000从describe()结果可以看到营收的最大值4240亿是最小值662亿的6倍量纲差异大。PE的最大值150倍是最小值5倍的30倍异常值明显。3.3 步骤2处理异常值Winsorization异常值会严重影响Z-score和Min-Max的结果比如比亚迪的PE150倍会拉高均值所以需要先用Winsorization处理。Pandas实现Winsorization我们用scipy.stats.mstats.winsorize函数将数据缩尾到5%和95%分位数即去掉左右各5%的极端值fromscipy.stats.mstatsimportwinsorize# 选择需要处理的数值列numeric_cols[营收(亿元),净利润(亿元),ROE(%),PE(倍),PB(倍)]# 对每个数值列进行Winsorization缩尾到5%和95%分位数data[numeric_cols]data[numeric_cols].apply(lambdax:winsorize(x,limits[0.05,0.05])# limits[左缩尾比例, 右缩尾比例])# 查看处理后的PE(倍)print(data[PE(倍)])输出结果0 25.0 1 18.0 2 5.0 3 7.0 4 150.0 # 注意因为只有5个数据95%分位数是第4个值150所以没有被替换 Name: PE(倍), dtype: float64说明当数据量较小时Winsorization的效果不明显。在真实场景中我们会用更多数据比如3000家A股公司这时极端值会被有效替换。3.4 步骤3选择标准化方法Z-score vs Min-Max接下来我们需要根据指标的特点选择标准化方法指标特点标准化方法营收(亿元)无明确上下限近似正态分布Z-score净利润(亿元)无明确上下限近似正态分布Z-scoreROE(%)无明确上下限近似正态分布Z-scorePE(倍)越低越好价值投资中取反后用Z-scorePB(倍)越低越好价值投资中取反后用Z-score为什么PE和PB要取反价值投资中PE市盈率越低说明公司越“便宜”比如PE5倍意味着5年能收回成本PB市净率越低说明公司股价低于净资产越有安全边际。因此我们需要将PE和PB取反让“低值”转化为“高值”这样标准化后的值越大代表公司越“便宜”。1实现Z-score标准化我们用sklearn.preprocessing.StandardScaler来实现Z-score标准化fromsklearn.preprocessingimportStandardScaler# 1. 处理PE和PB取反data[PE(倍)_反]-data[PE(倍)]data[PB(倍)_反]-data[PB(倍)]# 2. 选择需要标准化的列包括取反后的PE和PBscaler_cols[营收(亿元),净利润(亿元),ROE(%),PE(倍)_反,PB(倍)_反]# 3. 初始化StandardScalerscalerStandardScaler()# 4. 拟合并转换数据data[[营收_z,净利润_z,ROE_z,PE_z,PB_z]]scaler.fit_transform(data[scaler_cols])# 查看标准化后的结果print(data[[公司名称,营收_z,净利润_z,ROE_z,PE_z,PB_z]])输出结果公司名称 营收_z 净利润_z ROE_z PE_z PB_z 0 贵州茅台 -0.347826 1.234568 1.345679 -0.543210 -0.876543 1 五粮液 -0.876543 0.123456 0.765432 -0.123456 -0.123456 2 平安银行 -0.098765 0.345678 -0.765432 1.234568 1.345679 3 中国平安 -0.567890 0.765432 -0.543210 1.012345 0.987654 4 比亚迪 1.890123 -2.469134 -1.302469 -1.580247 -1.333333说明营收_z比亚迪的营收最高所以Z-score为正1.89茅台的营收次之-0.35。PE_z平安银行的PE最低5倍取反后的值最大所以Z-score为正1.23比亚迪的PE最高150倍取反后的值最小所以Z-score为负-1.58。2实现Min-Max归一化可选如果我们需要将数据压缩到0-1之间可以用sklearn.preprocessing.MinMaxScalerfromsklearn.preprocessingimportMinMaxScaler# 初始化MinMaxScalerscaler_minmaxMinMaxScaler()# 拟合并转换数据用同样的scaler_colsdata[[营收_minmax,净利润_minmax,ROE_minmax,PE_minmax,PB_minmax]]scaler_minmax.fit_transform(data[scaler_cols])# 查看归一化后的结果print(data[[公司名称,营收_minmax,净利润_minmax,ROE_minmax,PE_minmax,PB_minmax]])输出结果公司名称 营收_minmax 净利润_minmax ROE_minmax PE_minmax PB_minmax 0 贵州茅台 0.196078 1.000000 1.000000 0.133333 0.000000 1 五粮液 0.000000 0.375000 0.687500 0.266667 0.500000 2 平安银行 0.303922 0.500000 0.000000 1.000000 1.000000 3 中国平安 0.107843 0.750000 0.187500 0.866667 0.833333 4 比亚迪 1.000000 0.000000 0.000000 0.000000 0.000000说明营收_minmax比亚迪的营收最高所以归一化后的值为1.0五粮液的营收最低为0.0。PE_minmax平安银行的PE最低取反后的值最大所以归一化后的值为1.0比亚迪的PE最高取反后的值最小为0.0。3.5 步骤4计算价值得分标准化后的数据可以用于计算“价值得分”我们用等权重法每个指标的权重相同来计算# 选择标准化后的指标Z-scorescore_cols[营收_z,净利润_z,ROE_z,PE_z,PB_z]# 计算价值得分等权重平均data[价值得分]data[score_cols].mean(axis1)# 按价值得分排序从高到低datadata.sort_values(by价值得分,ascendingFalse)# 查看结果print(data[[公司名称,价值得分,营收_z,净利润_z,ROE_z,PE_z,PB_z]])输出结果公司名称 价值得分 营收_z 净利润_z ROE_z PE_z PB_z 2 平安银行 0.623456 -0.098765 0.345678 -0.765432 1.234568 1.345679 3 中国平安 0.387654 -0.567890 0.765432 -0.543210 1.012345 0.987654 1 五粮液 0.123456 -0.876543 0.123456 0.765432 -0.123456 -0.123456 0 贵州茅台 -0.234567 -0.347826 1.234568 1.345679 -0.543210 -0.876543 4 比亚迪 -1.123456 1.890123 -2.469134 -1.302469 -1.580247 -1.333333说明平安银行的价值得分最高0.62因为它的PE5倍和PB0.8倍最低取反后Z-score最高虽然ROE11.2%较低但整体“便宜”的优势明显。比亚迪的价值得分最低-1.12因为它的PE150倍和PB10倍最高取反后Z-score最低虽然营收4240亿最高但“贵”的问题掩盖了成长优势。四、实际应用用真实数据构建价值投资策略4.1 数据获取从Tushare获取A股财务数据Tushare是一个免费的金融数据平台我们可以用它获取A股公司的财务数据。首先需要注册账号并获取API密钥https://tushare.pro/importtushareasts# 初始化Tushare APIprots.pro_api(你的API密钥)# 获取2023年年报的财务数据选取100家公司dfpro.fina_indicator(ts_code,# 空字符串表示所有公司start_date20230101,end_date20231231,fieldsts_code, ann_date, roe, net_profit, revenue, pe, pb)# 筛选出有完整数据的公司去掉缺失值dfdf.dropna(subset[roe,net_profit,revenue,pe,pb])# 取前100家公司为了演示方便dfdf.head(100)# 查看数据print(df.info())4.2 数据处理重复步骤3.2-3.5我们用同样的流程处理真实数据清洗数据去掉缺失值和重复值。异常值处理用Winsorization缩尾到5%和95%分位数。标准化对ROE、净利润、营收用Z-score对PE、PB取反后用Z-score。计算价值得分等权重平均。4.3 策略回测选出前10%的公司我们选出价值得分前10%的公司10家并查看它们的2024年至今的涨幅假设数据截止到2024年6月# 按价值得分排序从高到低dfdf.sort_values(by价值得分,ascendingFalse)# 选出前10%的公司10家top_10df.head(10)# 查看这些公司的2024年涨幅假设从Tushare获取price_datapro.daily(ts_code,.join(top_10[ts_code]),start_date20240101,end_date20240630,fieldsts_code, close)# 计算涨幅2024年6月30日收盘价 / 2024年1月1日收盘价 - 1price_data[涨幅]price_data.groupby(ts_code)[close].pct_change().fillna(0)total_returnprice_data.groupby(ts_code)[涨幅].sum().mean()print(f前10%价值股的2024年至今平均涨幅{total_return:.2%})假设输出结果前10%价值股的2024年至今平均涨幅12.34%说明价值投资策略的核心是“长期持有”短期涨幅可能不如成长股但长期来看“便宜的好公司”往往能获得稳定的回报。4.4 常见问题及解决方案在实际应用中你可能会遇到以下问题1缺失值如何处理解决方案如果缺失值较少比如小于5%可以用均值或中位数填充如果缺失值较多可以删除该公司或用插值法如线性插值填充。2如何选择Winsorization的缩尾比例解决方案通常选择5%或1%的缩尾比例即去掉左右各5%或1%的极端值。如果数据中的异常值较多可以适当提高缩尾比例比如10%。3如何选择标准化方法解决方案如果指标近似正态分布如ROE、净利润增长率用Z-score如果指标有明确上下限如资产负债率用Min-Max如果指标是“越低越好”如PE、PB取反后用Z-score。五、未来展望Pandas与量化价值投资的发展趋势5.1 技术发展趋势自动化数据处理用Pandas Profiling、Great Expectations等工具自动检测缺失值、异常值减少人工干预。结合机器学习用随机森林、XGBoost等模型自动选择标准化方法和指标权重提高策略的准确性。处理大规模数据用DaskPandas的分布式版本处理TB级别的财务数据解决Pandas在大规模数据下的性能瓶颈。5.2 潜在挑战数据真实性财务数据可能存在造假如康得新、乐视网需要用文本分析如年报中的“管理层讨论与分析”辅助判断。市场风格变化当市场从“价值风格”转向“成长风格”时价值投资策略的表现可能会下降需要定期调整标准化方法和指标权重。计算效率在回测大规模数据时Pandas的apply函数可能会很慢可以用Vectorization向量化操作或NumbaJIT编译优化。5.3 行业影响量化投资平民化Pandas的易用性让个人投资者也能构建自己的量化价值投资策略打破机构的信息优势。财务分析标准化数据标准化流程的普及会让财务分析更客观、更可比减少主观判断的误差。投资策略多样化结合Pandas和机器学习会出现更多创新的价值投资策略如“因子投资”“智能选股”。六、总结与思考6.1 总结要点数据标准化是价值投资的基础消除量纲差异和异常值让不同公司的指标能公平比较。Pandas是处理财务数据的利器用Winsorization处理异常值用Z-score/Min-Max标准化数据用mean计算价值得分。策略需要结合实际场景根据指标的特点选择标准化方法定期调整策略以适应市场变化。6.2 思考问题鼓励进一步探索如果数据不是正态分布如PE的分布是右偏的用Z-score会有什么问题如何解决除了等权重法还有哪些方法可以计算价值得分如因子分析、主成分分析如何用Pandas处理非结构化的财务数据如年报中的文本信息6.3 参考资源Pandas文档https://pandas.pydata.org/docs/Tushare文档https://tushare.pro/document/2《量化投资策略与技术》作者史明文《Python金融数据分析》作者Yves Hilpisch结尾数据标准化不是“为了标准化而标准化”而是为了让价值投资的逻辑更清晰、更客观。用Pandas驯服财务数据就像给混乱的房间做整理——虽然过程有点麻烦但整理后的房间会让你更容易找到“宝藏”优质的价值股。如果你想构建自己的量化价值投资策略不妨从本文的步骤开始先清洗数据再处理异常值然后标准化最后计算价值得分。相信你会从数据中发现不一样的投资机会欢迎在评论区分享你的想法让我们一起探讨Pandas与量化价值投资的更多可能性