查看全集:💎Quantopia量化分析56讲
130/30策略通过130%多头仓位 + 30%空头仓位实现市场中性,既能保留传统多头策略的优点,又能通过做空机制捕捉下跌机会。本教程将基于Andrew Lo和Pankaj Patel提出的四大价值因子构建选股策略。
import yfinance as yf
stock = yf.Ticker("AAPL")
div_yield = stock.info.get('trailingAnnualDividendYield', 0)
pb_ratio = -stock.info.get('priceToBook', 0) # 取负实现价值反转
ps_ratio = -stock.info.get('priceToSalesTrailing12Months', 0)
pcf_ratio = -stock.info.get('operatingCashflow', 0) # 需根据实际数据调整
使用yfinance获取多只股票数据:
import pandas as pd
tickers = ['AAPL', 'MSFT', 'GOOGL']
factor_data = []
for ticker in tickers:
stock = yf.Ticker(ticker)
info = stock.info
factor_data.append({
'Ticker': ticker,
'Dividend Yield': info.get('trailingAnnualDividendYield', 0),
'PB Ratio': -info.get('priceToBook', 0),
'PS Ratio': -info.get('priceToSalesTrailing12Months', 0),
'PCF Ratio': -info.get('operatingCashflow', 0)
})
df = pd.DataFrame(factor_data).set_index('Ticker')
其中:
该公式将数据转换为均值为0、标准差为1的标准正态分布
def standardize(series):
mu = series.mean()
sigma = series.std()
z_scores = (series - mu) / sigma
return z_scores.clip(-10, 10)
# 对各因子分别标准化
df_standardized = df.apply(standardize)
df['Composite Score'] = df_standardized.mean(axis=1)
long_candidates = df.nlargest(30, 'Composite Score').index.tolist()
short_candidates = df.nsmallest(6, 'Composite Score').index.tolist()
组合类型 | 股票数量 | 单股权重 | 总仓位 |
多头 | 26 | 5% | 130% |
空头 | 6 | 5% | 30% |
# 练习1示例代码
financial_stocks = ['JPM', 'BAC', 'C']
for ticker in financial_stocks:
stock = yf.Ticker(ticker)
print(f"{ticker} P/B Ratio: {stock.info.get('priceToBook')}")
注意:实际应用中需考虑交易成本、滑点等现实约束。建议在Paper Trading环境中充分测试策略后再实盘操作。