3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资中,除了技术面指标,基本面排雷是构建稳健投资组合的关键步骤。高负债、偿债能力弱的企业极易发生资金链断裂或债务违约(爆雷)风险。本文将详细介绍如何利用 ptrade 的 get_fundamentals 接口获取流动比率(current_ratio)和速动比率(quick_ratio),并实现自动排雷选股。
在 ptrade 的财务数据中,偿债能力指标存放在 debt_paying_ability 表中:
通过 get_fundamentals 接口查询偿债能力数据的基本格式如下:
get_fundamentals(security, table='debt_paying_ability', fields=['current_ratio', 'quick_ratio'], date=None)
注意:获取
debt_paying_ability表数据时,不支持传入merge_type参数。
以下是一个完整的 ptrade 策略示例。该策略在每天开盘前,获取沪深300成分股的流动比率和速动比率,剔除流动比率小于 $1.2$ 或速动比率小于 $1.0$ 的高风险股票,从而实现基本面排雷选股。
def initialize(context):
# 设置基准为沪深300
set_benchmark('000300.SS')
# 设定初始股票池(以沪深300成分股为例)
g.security_pool = get_index_stocks('000300.XBHS')
set_universe(g.security_pool)
# 每天 9:15 执行排雷选股
run_daily(context, filter_high_debt_stocks, time='09:15')
def filter_high_debt_stocks(context):
log.info("开始进行基本面偿债能力排雷选股...")
# 1. 获取当前交易日日期
current_date = context.blotter.current_dt.strftime('%Y%m%d')
# 2. 查询偿债能力指标
try:
df_debt = get_fundamentals(
security=g.security_pool,
table='debt_paying_ability',
fields=['current_ratio', 'quick_ratio'],
date=current_date
)
except Exception as e:
log.error("获取财务数据失败: %s" % e)
return
if df_debt is None or df_debt.empty:
log.warning("未获取到财务数据,保持原股票池")
return
# 3. 设定排雷阈值
min_current_ratio = 1.2 # 流动比率下限
min_quick_ratio = 1.0 # 速动比率下限
# 4. 过滤高负债风险股
# 剔除流动比率 < 1.2 或 速动比率 < 1.0 的股票
safe_stocks = []
for stock in df_debt.index:
current_ratio = df_debt.loc[stock, 'current_ratio']
quick_ratio = df_debt.loc[stock, 'quick_ratio']
# 排除 NaN 数据并进行阈值筛选
if not (current_ratio != current_ratio) and not (quick_ratio != quick_ratio):
if current_ratio >= min_current_ratio and quick_ratio >= min_quick_ratio:
safe_stocks.append(stock)
g.filtered_stocks = safe_stocks
log.info("排雷完成!原始股票数量: %d, 过滤后安全股票数量: %d" % (len(g.security_pool), len(g.filtered_stocks)))
log.info("被剔除的高负债风险股票包括: %s" % list(set(g.security_pool) - set(g.filtered_stocks)))
def handle_data(context, data):
# 在此编写您的交易逻辑,例如只在安全股票池 g.filtered_stocks 中进行买入操作
if hasattr(g, 'filtered_stocks') and len(g.filtered_stocks) > 0:
# 示例:买入安全股票池中的第一只股票
target_stock = g.filtered_stocks[0]
if context.portfolio.positions[target_stock].amount == 0:
order(target_stock, 100)
get_fundamentals 中,建议显式传入 date 参数(如前一交易日或当前交易日),避免不传 date 时默认获取最新发布数据而引入未来函数。current_ratio != current_ratio 剔除了 NaN 异常值。get_industry_stocks 接口进行行业中性化排雷。