引言
在基金投资领域,如何挑选出能够持续创造超额收益的基金一直是投资者关注的核心问题。传统的人工选基方式依赖基金经理的历史业绩、评级机构排名或简单的大小盘风格判断,但这些方法往往存在滞后性,难以捕捉市场的动态变化。
本文将介绍一种基于AI量化选基的策略,通过历史数据回测筛选出兼具高收益与高风险调整后收益的基金,构建一个有望获取超额收益的基金组合。
策略核心逻辑
该策略的核心思想是:在海量基金中,筛选出夏普比率和收益率均排名靠前的基金。
为什么选择这两个指标?
夏普比率(Sharpe Ratio) 衡量的是每承担一单位风险所获得的超额收益,计算公式为:
$$夏普比率 = \frac{基金收益率 - 无风险收益率}{基金收益率标准差}$$
夏普比率越高,说明基金在承担相同风险的情况下获得的收益越高,风险调整后表现越好。
收益率直接反映基金的盈利能力和市场适应性。
通过同时筛选这两个指标靠前的基金,我们可以找到既能涨、抗跌能力又强的优质基金。
策略实现细节
1. 调仓频率
策略设定为每3个月调仓一次,这个频率兼顾了:
- 避免过度交易产生的摩擦成本
- 及时跟踪市场风格变化
- 让基金有足够时间体现其投资能力
2. 选基范围
策略主要筛选股票型基金和混合型基金,这两类基金具有较强的主动管理能力,更有可能创造超额收益。
具体筛选时,基金类型编码对应如下:
- 402001:股票型基金
- 402004:混合型基金
3. 筛选标准
策略的筛选流程如下:
- 获取所有符合条件的公募基金
- 计算每只基金最近1年的夏普比率和收益率
- 按基金类型分组,在每类基金中筛选:
- 对筛选后的基金按综合得分排序,取前5只
这种分组筛选的方式确保了组合在不同基金类型上的均衡配置,避免了单一风格的过度暴露。
4. 组合构建
最终构建5只基金的等权组合,并预留5%现金以应对赎回需求。
代码实现
以下是该策略在JoinQuant平台的核心实现代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| from jqdata import * from jqdata import finance import pandas as pd import numpy as np import datetime
def initialize(context): set_benchmark('000300.XSHG') set_option('use_real_price', True) set_option('avoid_future_data', True) set_subportfolios([SubPortfolioConfig(context.portfolio.cash, 'open_fund')]) set_redeem_latency(day=3, type='open_fund') g.holding_funds = [] g.select_count = 5 g.last_rebalance_date = None g.rebalance_months = 3
run_monthly(market_open, 1, time='open')
def select_funds(context): """筛选基金:夏普和收益双前10%""" current_date = context.current_dt.date() one_year_ago = current_date - datetime.timedelta(days=365) q = query(finance.FUND_MAIN_INFO).filter( finance.FUND_MAIN_INFO.operate_mode_id.in_([401001, 401005, 401006]) ).limit(4000) fund_info_df = finance.run_query(q) target_type_ids = [402001, 402004] fund_info_df = fund_info_df[fund_info_df['underlying_asset_type_id'].isin(target_type_ids)] fund_metrics = [] for idx, row in fund_info_df.iterrows(): fund_code = row['main_code'] q = query(finance.FUND_NET_VALUE).filter( finance.FUND_NET_VALUE.code == fund_code, finance.FUND_NET_VALUE.day >= one_year_ago, finance.FUND_NET_VALUE.day <= current_date ).order_by(finance.FUND_NET_VALUE.day.desc()).limit(4000) nav_df = finance.run_query(q) if nav_df is None or len(nav_df) < 100: continue nav_df = nav_df.sort_values('day') nav_df['refactor_net_value'] = nav_df['refactor_net_value'].astype(float) nav_df['daily_return'] = nav_df['refactor_net_value'].pct_change() one_year_return = (nav_df['refactor_net_value'].iloc[-1] / nav_df['refactor_net_value'].iloc[0] - 1) * 100 one_year_volatility = nav_df['daily_return'].std() * np.sqrt(252) * 100 one_year_sharpe = one_year_return / one_year_volatility if one_year_volatility > 0 else 0 fund_metrics.append({ 'code': fund_code, 'name': row['name'], 'type': row['underlying_asset_type'], 'one_year_return': one_year_return, 'one_year_sharpe': one_year_sharpe }) if len(fund_metrics) == 0: return [] metrics_df = pd.DataFrame(fund_metrics) selected_funds = [] for fund_type in metrics_df['type'].unique(): type_df = metrics_df[metrics_df['type'] == fund_type].copy() if len(type_df) < 10: continue type_df['sharpe_rank'] = type_df['one_year_sharpe'].rank(pct=True) type_df['return_rank'] = type_df['one_year_return'].rank(pct=True) filtered = type_df[ (type_df['sharpe_rank'] >= 0.9) & (type_df['return_rank'] >= 0.9) ] filtered['composite_score'] = (filtered['sharpe_rank'] + filtered['return_rank']) / 2 filtered = filtered.sort_values('composite_score', ascending=False) selected_funds.extend(filtered['code'].tolist()) return selected_funds[:g.select_count]
|
策略优势
- 数据驱动:完全基于历史业绩数据客观筛选,避免主观情绪干扰
- 风险收益兼顾:同时考虑收益和风险,避免”赌徒式”选基
- 动态调整:每季度调仓,跟踪市场风格变化
- 分散化:多基金配置,降低单基金踩雷风险
风险提示
- 历史业绩不代表未来:策略基于历史数据筛选,未来市场风格突变可能导致失效
- 流动性风险:部分小规模基金可能出现大额赎回受限
- 数据延迟:基金净值披露存在一定滞后
- 交易成本:频繁调仓会产生申购赎回费用
总结
AI量化选基策略通过科学的方法从数千只基金中筛选出优质标的,为投资者提供了一种系统化的基金投资思路。然而,任何策略都不是万能的,投资者应根据自身风险承受能力合理配置,并持续关注策略表现进行动态调整。