问题描述
/
解决方案
在量化交易的单因子策略demo中,get_factor_values() 通常是一个自定义的封装函数,其核心作用是获取指定股票池在特定时间点的因子数值,以便后续根据这些数值进行排序、筛选和调仓。
需要注意的是,在 ptrade 官方 API 文档中,并没有直接提供名为 get_factor_values 的内置函数。这通常是策略编写者为了代码整洁和逻辑清晰,自己定义的一个辅助函数。
get_factor_values() 的通用作用
在一个标准的单因子策略中,该函数通常承担以下任务:
- 数据获取:调用底层 API 获取股票的财务数据(如 PE、PB、ROE)或量价数据(如动量、换手率)。
- 数据清洗:处理获取到的数据中的缺失值(NaN)、异常值(极值处理)。
- 数据标准化/中性化:有时为了消除行业或市值的影响,会在该函数内对因子值进行标准化(Z-score)或行业/市值中性化处理。
- 返回结果:返回一个结构化的数据(如 Pandas DataFrame 或 Series),供
handle_data或定时任务函数使用,决定买卖哪些股票。
在 ptrade 中如何实现类似功能?
在 ptrade 平台中,如果你想实现 get_factor_values 的功能,通常需要结合 get_fundamentals(获取基本面/估值因子)或 get_history(获取量价因子)来编写。
示例:自定义一个获取 PE(市盈率)因子的函数
以下是一个在 ptrade 中自定义 get_factor_values 函数的示例,用于获取股票池的动态市盈率(pe_dynamic),并过滤掉亏损(PE < 0)的股票:
import pandas as pd
def initialize(context):
# 设置股票池为沪深300成分股
g.security = get_index_stocks('000300.SS')
set_universe(g.security)
# 每天 9:31 运行调仓逻辑
run_daily(context, my_rebalance, time='9:31')
def get_factor_values(stock_list, date):
"""
自定义的获取因子值函数
:param stock_list: 股票代码列表
:param date: 查询日期
:return: 包含因子值的 Series,按因子值从小到大排序
"""
# 使用 ptrade 的 get_fundamentals 获取估值表中的动态市盈率
# 注意:valuation 表支持按天查询
df = get_fundamentals(stock_list, 'valuation', fields='pe_dynamic', date=date)
if df is None or df.empty:
return pd.Series(dtype=float)
# 提取 pe_dynamic 列
factor_data = df['pe_dynamic']
# 数据清洗:过滤掉 PE 为负数(亏损)或 NaN 的股票
factor_data = factor_data[factor_data > 0].dropna()
# 按 PE 从小到大排序(低估值因子)
factor_data = factor_data.sort_values(ascending=True)
return factor_data
def my_rebalance(context):
# 获取前一交易日的日期(格式 YYYYMMDD)
pre_date = context.previous_date.strftime('%Y%m%d')
# 调用自定义的 get_factor_values 函数获取因子数据
factor_series = get_factor_values(g.security, pre_date)
if factor_series.empty:
return
# 选出 PE 最低的 10 只股票作为目标持仓
target_stocks = factor_series.head(10).index.tolist()
log.info(f"今日选股结果: {target_stocks}")
# 后续可以编写卖出不在 target_stocks 中的股票,并买入 target_stocks 的逻辑
# ...
def handle_data(context, data):
pass
总结
get_factor_values() 是单因子策略中用于提取和预处理因子信号的核心逻辑块。在 ptrade 中,你需要利用 get_fundamentals 等数据接口自行封装此函数,以实现你的选股逻辑。