3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在股票量化投资中,仅看公司净利润可能存在财务操纵或应收账款过高的风险。**经营活动产生的现金流量净额与净利润的比率(现金净利润比)**是衡量企业盈利质量的核心指标。当该比率大于 1 时,说明企业的净利润有实打实的现金流入支撑。
本文将介绍如何在 ptrade 平台中使用 get_fundamentals 接口,构建基于盈利质量的量化选股策略。
在 ptrade 中,获取财务数据主要依赖 get_fundamentals 函数。
income_statement):获取净利润(net_profit)。cashflow_statement):获取经营活动产生的现金流量净额(net_operate_cash_flow)。# 获取指定股票的现金流量表数据
cf_df = get_fundamentals(stocks, 'cashflow_statement', fields=['net_operate_cash_flow'], date=current_date)
# 获取指定股票的利润表数据
in_df = get_fundamentals(stocks, 'income_statement', fields=['net_profit'], date=current_date)
以下为可在 ptrade 回测与交易模块中直接运行的源码:
import pandas as pd
import numpy as np
def initialize(context):
# 设置基准
set_benchmark('000300.SS')
# 设置初始持仓股票数
g.hold_count = 10
# 设为每日运行
run_daily(context, rebalance, time='09:35')
def rebalance(context):
# 1. 获取全市场 A 股列表
stocks = get_Ashares()
# 2. 过滤 ST、停牌、退市股票
stocks = filter_stock_by_status(stocks, filter_type=["ST", "HALT", "DELISTING"])
# 3. 获取上一个交易日日期
prev_date = str(get_trading_day(-1)).replace('-', '')
# 4. 获取经营现金流净额与净利润
try:
cf_data = get_fundamentals(stocks, 'cashflow_statement', fields=['net_operate_cash_flow'], date=prev_date)
in_data = get_fundamentals(stocks, 'income_statement', fields=['net_profit'], date=prev_date)
except Exception as e:
log.error("获取财务数据失败: %s" % e)
return
# 5. 合并数据并计算比率
df = pd.merge(cf_data, in_data, left_index=True, right_index=True)
df = df.dropna()
# 过滤净利润大于0的企业
df = df[df['net_profit'] > 0]
# 计算现金净利润比率
df['quality_ratio'] = df['net_operate_cash_flow'] / df['net_profit']
# 筛选比率大于 1.2 的高盈利质量公司
target_df = df[df['quality_ratio'] > 1.2]
# 按比率降序排序并取前 N 只
target_df = target_df.sort_values(by='quality_ratio', ascending=False)
target_stocks = target_df.index[:g.hold_count].tolist()
log.info("今日选股股票池: %s" % target_stocks)
# 6. 调仓卖出不在目标池的股票
for stock in list(context.portfolio.positions.keys()):
if stock not in target_stocks:
order_target(stock, 0)
log.info("卖出非目标股: %s" % stock)
# 7. 买入目标股票(均分资金)
if len(target_stocks) > 0:
cash_per_stock = context.portfolio.cash / len(target_stocks)
for stock in target_stocks:
if get_position(stock).amount == 0:
order_value(stock, cash_per_stock)
log.info("买入高质量盈利股: %s, 目标金额: %s" % (stock, cash_per_stock))
def handle_data(context, data):
pass
before_trading_start 或每日定时任务(run_daily)中调用,并加入 try-except 异常保护。get_index_stocks('000906.XBHS') 中证 800),以避免触发接口限流。valuation 表中的 pe_ttm(市盈率)或 pb(市净率)进行二次筛选,剔除估值过高的标的。