量化选股策略 聚宽
# 量化选股策略完整分析与优化建议
## 策略整体架构分析
这个量化交易策略主要由以下几个核心部分组成:
1. **初始化设置**:配置基准指数、交易参数和全局变量
2. **选股逻辑**:通过财务指标筛选优质股票
3. **股票过滤**:排除新股和停牌股
4. **交易执行**:定期调仓和资金分配
## 代码详细解析与修正建议
### 1. 初始化函数 (initialize)
```python
def initialize(context):
# 基准设置为沪深300指数(修正代码)
set_benchmark('000300.XSHG') # 原代码有大小写错误
# 启用真实价格模式
set_option('use_real_price', True)
# 设置成交量比例
set_option('order_volume_ratio', 1)
# 设置交易成本(修正格式)
set_order_cost(OrderCost(
open_tax=0,
close_tax=0.001,
open_commission=0.0003,
close_commission=0.0003,
close_today_commission=0,
min_commission=5
), type="stock") # 修正type参数
# 全局变量设置
g.stocknum = 20 # 持仓股票数量
g.days = 20 # 调仓周期(天)
g.refresh_rate = 100 # 刷新率
```
**修正建议**:
1. 指数代码统一为大写
2. 补全交易成本参数
3. 建议增加日志记录功能
### 2. 选股查询 (query)
```python
q = query(
indicator.code,
valuation.market_cap, # 修正为market_cap
indicator.roe,
indicator.gross_profit_margin
).filter(
valuation.market_cap > 50, # 市值>50亿
valuation.circulation_ratio > 0.95, # 流通比例>95%
indicator.gross_profit_margin > 20, # 毛利率>20%
indicator.roe > 20 # ROE>20%
).order_by(
valuation.market_cap.desc() # 按市值降序
).limit(100) # 限制100只
```
**修正建议**:
1. 统一使用market_cap而非capitalization
2. 流通比例字段修正为circulation_ratio
3. 增加注释说明各筛选条件的商业逻辑
### 3. 股票过滤函数
```python
def delete_stock(stocks, beginDate, n=750):
"""
排除上市不足n天的股票
:param stocks: 待筛选股票列表
:param beginDate: 当前日期
:param n: 最小上市天数(默认750天)
:return: 符合条件的股票列表
"""
stockList = []
for stock in stocks:
start_date = get_security_info(stock).start_date
if start_date < (beginDate - timedelta(days=n)).date():
stockList.append(stock)
return stockList
def filter_paused_stock(stock_list):
"""
过滤停牌股票
:param stock_list: 待筛选股票列表
:return: 正常交易的股票列表
"""
current_data = get_current_data() # 修正函数名
return [stock for stock in stock_list if not current_data[stock].paused]
```
**修正建议**:
1. 修正get_current_date()为get_current_data()
2. 增加函数文档字符串
3. 统一上市天数参数为750天(3年)
### 4. 交易执行函数
```python
def trade(context):
if g.days % g.refresh_rate == 0:
# 获取目标股票列表
stockList = check_stocks(context)
# 获取当前持仓
sell_list = list(context.portfolio.positions.keys())
# 确定需要卖出的股票(持仓但不在目标列表中的)
sells = list(set(sell_list).difference(set(stockList)))
# 执行卖出
for stock in sells:
order_target_value(stock, 0)
# 资金分配逻辑
if len(context.portfolio.positions) < g.stocknum:
num = g.stocknum - len(context.portfolio.positions)
cash_per_stock = context.portfolio.total_value / g.stocknum
for stock in stockList[:num]:
if stock not in context.portfolio.positions:
order_target_value(stock, cash_per_stock)
```
**优化建议**:
1. 增加风险控制逻辑(单只股票最大仓位限制)
2. 考虑交易滑点设置
3. 增加交易日志记录
## 完整策略逻辑流程图
1. 初始化设置 → 2. 定期检查调仓条件 → 3. 执行财务数据查询 → 4. 过滤新股和停牌股 → 5. 确定买卖清单 → 6. 执行交易 → 7. 等待下一周期
## 策略优化方向
1. **风险控制增强**:
- 增加最大回撤控制
- 设置单行业最大暴露比例
- 加入黑名单机制
2. **选股指标扩展**:
```python
.filter(
valuation.pe_ratio < 30, # 市盈率<30
indicator.debt_to_assets < 0.6, # 资产负债率<60%
indicator.dividend_yield > 0.01 # 股息率>1%
)
```
3. **交易执行优化**:
- 引入VWAP/TWAP算法交易
- 增加止盈止损逻辑
- 考虑市场状态判断(牛市/熊市不同参数)
4. **绩效分析**:
- 增加夏普率计算
- 跟踪信息比率
- 分析行业分布
这个策略框架已经具备了价值投资的基本要素,通过上述优化可以进一步提升策略的稳定性和风险调整后收益。建议在实际应用前进行充分的回测和模拟交易验证。
9.4规模因子
总市值
价值因子
总资产净利率