拓冰建站拓冰建站
首页 / 资讯中心 / 正文

普通人学量化,到底要会哪些技能(第二篇):因子挖掘与截面分析——策略的“灵魂锻造”

一、进阶技能树从「会取数」到「会造因子」如果说第一篇是「量化民工」的必备技能那么第二篇就是「量化研究员」的分水岭。你需要掌握1️⃣ 财务数据分析能力读懂资产负债表、利润表、现金流量表提取价值/成长/质量因子2️⃣ 时序特征工程用移动平均、EMA、标准差等构造技术因子3️⃣ 截面分析能力行业中性、市值中性、Z-Score标准化消除冗余信息4️⃣ 多因子合成IC测试、因子相关性、因子加权二、财务数据量化因子的「金矿」AmazingData的InfoData类提供了完整的财务数据接口涵盖三大报表业绩快报业绩预告。对于普通人来说你不需要像会计师那样逐行分析只需要提取几个关键字段即可。三大报表核心字段速查资产负债表Balance Sheet• TOTALASSETS资产总计 → 用于计算ROA• TOT_SHARE_EQUITY_INCL_MININT股东权益合计 → 用于计算ROE、PB• TOT_SHARE期末总股本股 → 用于计算每股指标利润表Income• NETPROINCLMIN_INT_INC净利润含少数股东损益 → 用于计算ROE• TOTOPERAREV营业总收入 → 用于计算营收增长率• BASIC_EPS基本每股收益 → 价值因子现金流量表Cash Flow• NETCASHFLOWS_OPERA_ACT经营活动现金流净额 → 用于计算经营性现金流/市值• FREECASHFLOW企业自由现金流量 → 质量因子实战代码批量获取全市场财务数据import AmazingData as adfrom AmazingData.operator.math_function import MathFunctionfrom AmazingData.operator.statistics_function import StatisticsFunctionfrom AmazingData.operator.time_series_function import TimeSeriesFunctionfrom AmazingData.operator.cross_section_function import CrossSectionFunctionimport pandas as pdimport numpy as np# 登录略同第一篇# ad.login(...)base_data ad.BaseData()info_data ad.InfoData()calendar base_data.get_calendar()today calendar[-1]# 获取全市场历史代码防幸存者偏差all_codes base_data.get_hist_code_list(security_typeEXTRA_STOCK_A_SH_SZ,start_date20200101,end_datetoday,local_pathD://AmazingData_local_data//)# 获取资产负债表本地缓存第一次较慢balance_sheet info_data.get_balance_sheet(code_listall_codes,local_pathD://AmazingData_local_data//,is_localTrue)# 获取利润表income info_data.get_income(code_listall_codes,local_pathD://AmazingData_local_data//,is_localTrue)print(资产负债表字段示例)print(list(balance_sheet[all_codes[0]].columns)[:10])print(利润表字段示例)print(list(income[all_codes[0]].columns)[:10])数据说明财务数据返回的是dictkey为股票代码value为DataFrame。每个股票的报表包含多个报告期季报、年报需要通过REPORTING_PERIOD字段筛选最新报告期。三、构建经典因子PB-ROE模型PB-ROE是价值投资最经典的框架之一低PB便宜 高ROE质量好 潜在超额收益。我们用AmazingData的财务数据来构造这两个因子。Step 1计算ROE和PBdef calc_factors(balance_sheet, income, market_data, trade_date):计算单期PB和ROE因子pb_list []roe_list []codes []for code in balance_sheet.keys():try:bs balance_sheet[code]inc income[code]# 取最新报告期合并报表bs_latest bs[bs[STATEMENTTYPE] 1].sort_values(REPORTINGPERIOD).iloc[-1]inc_latest inc[inc[STATEMENTTYPE] 1].sort_values(REPORTINGPERIOD).iloc[-1]# 股东权益equity bs_latest[TOT_SHARE_EQUITY_INCL_MININT]# 总股本股total_share bs_latest[TOT_SHARE]# 净利润net_profit inc_latest[NETPROINCLMIN_INT_INC]# 获取当日收盘价从market_data.query_kline或本地缓存# 这里假设price_df是已获取的收盘价DataFrameif code in price_df.columns and trade_date in price_df.index:close_price price_df.loc[trade_date, code]# 计算PB 总市值 / 净资产 收盘价 * 总股本 / 股东权益market_cap close_price * total_sharepb market_cap / equity if equity 0 else np.nan# 计算ROE 净利润 / 股东权益roe net_profit / equity if equity 0 else np.nanpb_list.append(pb)roe_list.append(roe)codes.append(code)except Exception as e:continuefactor_df pd.DataFrame({code: codes,PB: pb_list,ROE: roe_list}).set_index(code)return factor_df# 假设已获取某日全市场收盘价factor_df calc_factors(balance_sheet, income, market_data, 20240630)print(factor_df.describe())Step 2截面标准化Z-Score不同行业的PB天然不同银行PB低、科技PB高直接比较不公平。AmazingData的截面函数CrossSectionFunction提供了CSZSCORE可以对因子进行Z-Score标准化# 构建截面数据行日期列股票# 假设我们有多个交易日的PB和ROE数据pb_panel pd.DataFrame({date: pb_series for date, pb_series in pb_dict.items()}).Troe_panel pd.DataFrame({date: roe_series for date, roe_series in roe_dict.items()}).T# 截面Z-Score标准化pb_zscore CrossSectionFunction.CSZSCORE(pb_panel)roe_zscore CrossSectionFunction.CSZSCORE(roe_panel)# 合成因子低PB取负 高ROE# 注意PB是越低越好所以取负号ROE越高越好保持正值combined_factor -pb_zscore roe_zscore# 截面排名取前50只daily_top50 CrossSectionFunction.CSRANK(combined_factor, ascendingFalse).apply(lambda x: x 50, axis1)print(每日选股结果True表示入选)print(daily_top50.tail())因子中性化实际研究中还需要做市值中性化和行业中性化。AmazingData提供了get_industry_constituent和get_industry_base_info接口可以获取行业分类配合回归去残差即可完成中性化。四、时序特征工程技术因子的「自动化工厂」除了财务因子技术因子也是量化策略的重要组成部分。AmazingData内置了丰富的时序函数和统计函数让你不用自己写循环就能实现复杂计算。常用时序函数一览• MA(X,N)N日简单移动平均• EMA(X,N)N日指数移动平均• HHV(X,N)N周期内最高值• LLV(X,N)N周期内最低值• STD(X,N)N周期标准差波动率因子• REF(X,N)引用N周期前的值计算环比• SUM(X,N)N周期求和• CROSS(A,B)A上穿B时返回1金叉信号实战用AmazingData算20日波动率 5日均价偏离度# 获取某股票日线同第一篇df kline_dict[600519.SH]# 计算20日收益率标准差波动率因子returns df[close].pct_change()vol_20 StatisticsFunction.STD(returns, 20)# 计算5日均价ma5 TimeSeriesFunction.MA(df[close], 5)# 计算价格偏离度 (收盘价 - 5日均价) / 5日均价deviation (df[close] - ma5) / ma5# 金叉信号5日均线上穿20日均线ma20 TimeSeriesFunction.MA(df[close], 20)golden_cross TimeSeriesFunction.CROSS(ma5, ma20)# 整合到DataFramedf[vol_20] vol_20df[deviation_ma5] deviationdf[golden_cross] golden_crossprint(df[[close, vol_20, deviation_ma5, golden_cross]].tail(20))五、截面分析消除「苹果比橘子」的谬误截面函数是量化多因子策略的核心工具。AmazingData的CrossSectionFunction提供了16个截面算子覆盖从基础统计到标准化排名的全链路。核心截面算子• CSMEAN / CSSTD / CSVAR截面均值、标准差、方差• CSZSCOREZ-Score标准化零均值、单位方差• CSNORMALIZEMin-Max归一化到[0,1]• CSRANK截面排名处理极端值的神器• CSPCTRANK百分位排名0-1之间• CSCORR截面相关度计算两个因子的共线性• CSDEMEAN截面去均值常用于行业中性化实战因子IC值计算信息系数IC值衡量因子对未来收益的预测能力是因子评价的金标准。# 计算下期收益率未来5日future_return price_df.pct_change(5).shift(-5) # 未来5日收益# 截面IC 因子值与下期收益的截面相关系数ic_series CrossSectionFunction.CSCORR(combined_factor, future_return)print(fIC均值{ic_series.mean():.4f})print(fIC标准差{ic_series.std():.4f})print(fIR比率{ic_series.mean()/ic_series.std():.4f})# IC 0.02 通常认为因子有效IR 0.5 认为因子稳定
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门