技术背景
许多投资者将量化交易视为门槛极高的领域。然而,经验表明,部分量化策略逻辑清晰,易于掌握。本文介绍的策略仅基于三个核心因子进行分层筛选,策略回测显示其年化收益可达41.59%(2019年1月至2025年12月模拟期总收益940%)。

需要说明的是,本文的目的并非宣扬一个“完美”的策略。该策略本身存在回撤较大的瑕疵,但通过引入大盘择时系统,能够将整体回撤有效控制在20%左右。此前关于择时系统在多因子策略中的应用的文章介绍过相关思路。
本文的核心价值在于,通过一个简洁明了的多因子策略示例,向无编程基础的交易者证明,量化交易并非遥不可及。
量化交易的核心优势在于两点:1. 基于大量历史数据的验证;2. 严格的策略执行。 其中,执行力往往比策略构思更为关键。大多数投资者难以克服人性弱点,而量化交易的自动化特性恰好规避了这一问题。
策略、因子分析
量化选股的核心理念可概括为:选择优质公司、关注小市值、买入低估值标的、规避问题股、在市场关注度低时介入。
如何将理念转化为可执行的策略?答案是借助量化因子。后期我们将构建并开放因子库,对因子进行标签化与评分,方便用户直接调用与学习。对于希望深入研究的用户,可以关注数据处理、因子分析与合成等方法。而对于初学者,完全可以直接使用成熟的因子结论,通过简单的组合与筛选,快速构建自己的策略。
详细步骤
本策略的构建遵循以下清晰步骤:
- 股票池初筛:剔除ST股、上市未满一年的新股、北交所及科创板股票、停牌股票。
- PEG因子筛选:选取PEG值最小的前10%的股票。
- EBIT因子筛选:从上述股票中,再选取EBIT最小的前25%。
- 流通市值筛选:最后,选取流通市值最小的前N只股票作为最终持仓标的(本例中N=5)。
- 调仓规则:每周一进行调仓,采用等市值分配方式,盘中不进行干预。
优化与改进方向
该基础策略有明确的优化空间:
- 增加择时系统:这是控制整体回撤最有效的手段。
- 优化仓位管理:将等仓调整为基于风险的动态仓位配比。
- 细化交易规则:优化盘中卖出条件,例如结合技术指标。
Python代码实现
以下是用Python实现上述策略核心筛选逻辑的代码示例。数据分析与回测是量化策略的基石,强大的数据处理能力能显著提升策略开发效率。
def get_stock_list(context):
# 获取所有股票
initial_list = get_all_securities().index.tolist()
# 过滤掉新股(上市未满一年)
initial_list = filter_new_stock(context,initial_list)
# 过滤掉科创板股票
initial_list = filter_kcb_stock(context, initial_list)
# 过滤掉ST股票。
initial_list = filter_st_stock(initial_list)
peg_list = get_factor_filter_list(context, initial_list, 'PEG', True, 0.1) # 值越小越好
ebit_list = get_factor_filter_list(context, peg_list, 'EBIT', True, 0.25) # 同样值越小越好
test_list = get_factor_filter_list(context, ebit_list, 'turnover_volatility', True, 0.5)
q = query(valuation.code,valuation.circulating_market_cap).filter(valuation.code.in_(test_list)).order_by(valuation.circulating_market_cap.asc())
df = get_fundamentals(q)
final_list = list(df.code)
return final_list
#过滤停牌股票
def filter_paused_stock(stock_list):
current_data = get_current_data()
return [stock for stock in stock_list if not current_data[stock].paused]
#过滤ST及其他具有退市标签的股票
def filter_st_stock(stock_list):
current_data = get_current_data()
return [stock for stock in stock_list
if not current_data[stock].is_st
and 'ST' not in current_data[stock].name
and '*' not in current_data[stock].name
and '退' not in current_data[stock].name]
#过滤涨停的股票
def filter_limitup_stock(context, stock_list):
last_prices = history(1, unit='1m', field='close', security_list=stock_list)
current_data = get_current_data()
# 已存在于持仓的股票即使涨停也不过滤,避免此股票再次可买,但因被过滤而导致选择别的股票
return [stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] < current_data[stock].high_limit]
#过滤跌停的股票
def filter_limitdown_stock(context, stock_list):
last_prices = history(1, unit='1m', field='close', security_list=stock_list)
current_data = get_current_data()
return [stock for stock in stock_list if stock in context.portfolio.positions.keys()
or last_prices[stock][-1] > current_data[stock].low_limit]
#过滤科创板
def filter_kcb_stock(context, stock_list):
return [stock for stock in stock_list if stock[0:3] != '688']
#过滤次新股
def filter_new_stock(context,stock_list):
yesterday = context.previous_date
return [stock for stock in stock_list if not yesterday - get_security_info(stock).start_date < datetime.timedelta(days=365)]
总结
本文展示了一个结构简单、逻辑清晰的Python多因子选股策略,旨在说明量化策略的开发可以始于简洁的构思。普通投资者通过学习基本的因子知识,便能通过组合与分层筛选搭建自己的策略框架。若在此过程中能获得专业的大数据分析与策略优化辅助,则有望构建出更加稳健高效的交易体系。