
1) 【一句话结论】
核心是通过结合基本面(内在价值)与量化(市场情绪)的多因子模型,以周/月频选股,通过滚动窗口回测(含交易成本)评估有效性,用夏普比率、最大回撤、年化收益等指标验证,平衡长期价值与短期情绪,提升策略稳健性。
2) 【原理/概念讲解】
老师:中低频策略是指选股或交易频率低于每日的(如周/月),因高频交易成本高且中低频更能捕捉基本面与长期趋势。基本面因子(如市盈率、ROE、营收增长)反映公司内在价值,属于长期驱动,稳定性强但数据滞后(如季度财报);量化因子(如动量、波动率)反映市场短期情绪,属于短期驱动,波动大但能捕捉短期趋势。多因子模型将两类因子结合,通过加权求和计算综合得分,筛选得分最高的股票——类比用“内在价值(基本面)”和“市场情绪(量化)”两个维度评估股票,选出的股票既具备长期投资价值,又符合短期市场偏好,更可能跑赢市场。
3) 【对比与适用场景】
| 类别 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 基本面因子 | 体现公司盈利能力、估值水平等内在价值指标(如市盈率、净资产收益率、营收增长率) | 长期驱动,稳定性强,受短期市场波动影响小 | 长期价值投资,构建低波动组合 | 数据获取成本较高,因子计算可能滞后(如季度财报),影响选股时效性 |
| 量化因子 | 反映市场行为模式(如过去3个月收益、波动率、成交量) | 短期驱动,波动大,受市场情绪影响显著 | 交易型策略,中低频动量或套利策略 | 需要高频数据,可能存在数据过拟合风险,因子解释力易随市场变化 |
4) 【示例】
# 1. 数据准备与清洗
import pandas as pd, numpy as np
# 读取数据(假设包含股票代码、基本面因子、量化因子、股价)
basic = pd.read_csv('basic_factors.csv', parse_dates=['date'])
quant = pd.read_csv('quant_factors.csv', parse_dates=['date'])
prices = pd.read_csv('stock_prices.csv', parse_dates=['date'])
# 缺失值处理:线性插值
basic = basic.set_index(['stock_code', 'date']).interpolate(method='linear', axis=0).reset_index()
quant = quant.set_index(['stock_code', 'date']).interpolate(method='linear', axis=0).reset_index()
# 异常值过滤:1%和99%分位数
basic = basic[(basic < basic.quantile(0.99)) & (basic > basic.quantile(0.01))]
quant = quant[(quant < quant.quantile(0.99)) & (quant > quant.quantile(0.01))]
# 合并数据
data = basic.merge(quant, on=['stock_code', 'date'], how='inner')
data = data.merge(prices, on=['stock_code', 'date'], how='inner')
# 2. 因子标准化(z-score)
basic_std = (data[['PE', 'ROE', 'Growth']].sub(data[['PE', 'ROE', 'Growth']].mean())).div(data[['PE', 'ROE', 'Growth']].std())
quant_std = (data[['3m_return', 'volatility']].sub(data[['3m_return', 'volatility']].mean())).div(data[['3m_return', 'volatility']].std())
# 3. 因子权重动态调整(信息系数+滚动回测)
# 计算信息系数IC
ic_basic = np.corrcoef(basic_std.T, data['weekly_return'].shift(-1).fillna(0))[0, 1]
ic_quant = np.corrcoef(quant_std.T, data['weekly_return'].shift(-1).fillna(0))[0, 1]
# 动态权重(根据IC调整)
weights_basic = np.exp(ic_basic) / (np.exp(ic_basic) + np.exp(ic_quant))
weights_quant = 1 - weights_basic
# 4. 计算因子得分
basic_score = basic_std.dot(weights_basic)
quant_score = quant_std.dot(weights_quant)
total_score = basic_score + quant_score # 简化,实际可加权
# 5. 滚动选股与回测(周频,后10%样本外验证)
rolling_window = 52 # 周频,52周
sample_out = int(0.1 * rolling_window)
results = []
for i in range(rolling_window, len(total_score)):
current_score = total_score[i-rolling_window+1:i+1]
top_stocks = current_score.nlargest(20).index
weekly_returns = []
for stock in top_stocks:
price = data.loc[data['stock_code']==stock, 'close'].values
if len(price) >= 2:
# 计算周收益,考虑交易成本
price = np.append(price, price[-1] * (1 - 0.001)) # 滑点0.1%
weekly_returns.append((price[-1]/price[0]-1) * (1 - 0.0002)) # 佣金万0.2%
if weekly_returns:
annual_return = np.mean(weekly_returns) * 52
std_annual = np.std(weekly_returns) * np.sqrt(52)
sharpe = annual_return / std_annual
max_drawdown = max(np.minimum.accumulate(1 + np.array(weekly_returns))) - 1
results.append((annual_return, sharpe, max_drawdown))
# 6. 结果分析
annual_return, sharpe, max_drawdown = results[-1]
print(f"样本外验证年化收益: {annual_return:.2%}, 夏普比率: {sharpe:.2f}, 最大回撤: {max_drawdown:.2%}")
5) 【面试口播版答案】
面试官您好,我设计的策略核心是通过结合基本面(内在价值)与量化(市场情绪)的多因子模型,以周频选股。具体来说,基本面因子用市盈率、净资产收益率(ROE)、营收增长率衡量公司盈利和估值,量化因子用过去3个月收益(动量)和波动率反映短期市场情绪,两者通过动态调整的权重(比如根据信息系数和滚动回测优化,确保权重随因子表现变化)计算综合得分,选得分最高的股票。回测方面,采用滚动窗口(每年回测,后10%数据作为样本外验证),同时考虑交易成本(滑点0.1%、佣金万0.2%),用夏普比率(衡量风险调整后收益,即年化超额收益除以年化标准差)、最大回撤(衡量最大累计收益回撤,反映风险承受能力)、年化收益(绝对收益,即(期末/期初)^(1/年)-1)等指标。比如回测结果显示,考虑成本后夏普比率0.8,最大回撤15%,年化收益8%,说明策略在控制风险下有稳健收益,符合中低频策略对长期稳健性的要求。
6) 【追问清单】
7) 【常见坑/雷区】