来源:雪球App,作者: DrChuck,(https://xueqiu.com/1039527614/311310908)
机器学习小市值策略
有幸入选雪球2024年度十大影响力用户提名,插个投票链接在此,感谢大家支持DrChuck:网页链接
经过几次大幅波动,小市值组合又新高了:网页链接
这个组合的灵感,来自聚宽wywy1995,大意是用机器学习做数据挖掘,从海量的股票因子中找出最佳的因子组合,权重既可以用历史数据拟合,也可直接用IC均值。
具体挖掘过程可参考昨天介绍的GPlearn遗传算法库,这里只列出关键的因子组合:
factor_list = [
(#ARBR-SGAI-NPtTORttm-RPps
[
'ARBR', #情绪类因子 ARBR
'SGAI', #质量类因子 销售管理费用指数
'net_profit_to_total_operate_revenue_ttm', #质量类因子 净利润与营业总收入之比
'retained_profit_per_share' #每股指标因子 每股未分配利润
],
[
df[df['code'] == 'ARBR']['ic_mean'].item(),
df[df['code'] == 'SGAI']['ic_mean'].item(),
df[df['code'] == 'net_profit_to_total_operate_revenue_ttm']['ic_mean'].item(),
df[df['code'] == 'retained_profit_per_share']['ic_mean'].item()
]
),
(#P1Y-TPtCR-VOL120
[
'Price1Y', #动量类因子 当前股价除以过去一年股价均值再减1
'total_profit_to_cost_ratio', #质量类因子 成本费用利润率
'VOL120' #情绪类因子 120日平均换手率
],
[
df[df['code'] == 'Price1Y']['ic_mean'].item(),
df[df['code'] == 'total_profit_to_cost_ratio']['ic_mean'].item(),
df[df['code'] == 'VOL120']['ic_mean'].item()
]
),
(#PNF-TPtCR-ITR
[
'price_no_fq', #技术指标因子 不复权价格因子
'total_profit_to_cost_ratio', #质量类因子 成本费用利润率
'inventory_turnover_rate' #质量类因子 存货周转率
],
[
df[df['code'] == 'price_no_fq']['ic_mean'].item(),
df[df['code'] == 'total_profit_to_cost_ratio']['ic_mean'].item(),
df[df['code'] == 'inventory_turnover_rate']['ic_mean'].item()
]
),
(#DtA-OCtORR-DAVOL20-PNF-SG
[
'debt_to_assets', #风格因子 资产负债率
'operating_cost_to_operating_revenue_ratio', #质量类因子 销售成本率
'DAVOL20', #情绪类因子 20日平均换手率与120日平均换手率之比
'price_no_fq', #技术指标因子 不复权价格因子
'sales_growth' #风格因子 5年营业收入增长率
],
[
df[df['code'] == 'debt_to_assets']['ic_mean'].item(),
df[df['code'] == 'operating_cost_to_operating_revenue_ratio']['ic_mean'].item(),
df[df['code'] == 'DAVOL20']['ic_mean'].item(),
df[df['code'] == 'price_no_fq']['ic_mean'].item(),
df[df['code'] == 'sales_growth']['ic_mean'].item(),
]
),
(#TVSTD6-CFpsttm-SR120-NONPttm
[
'TVSTD6', #情绪类因子 6日成交金额的标准差
'cashflow_per_share_ttm', #每股指标因子 每股现金流量净额
'sharpe_ratio_120', #风险类因子 120日夏普
'non_operating_net_profit_ttm' #基础科目及衍生类因子 营业外收支净额TTM
],
[
df[df['code'] == 'TVSTD6']['ic_mean'].item(),
df[df['code'] == 'cashflow_per_share_ttm']['ic_mean'].item(),
df[df['code'] == 'sharpe_ratio_120']['ic_mean'].item(),
df[df['code'] == 'non_operating_net_profit_ttm']['ic_mean'].item()
]
)]