3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,进行基于财务数据的策略回测时,最容易遇到的“陷阱”之一就是未来函数。上市公司在发布财报后,后续可能会对历史财务数据进行修正或重分类。如果我们在回测中直接使用了修正后的“最新数据”,就会导致回测时使用了当时根本无法获知的未来信息,从而使回测结果虚高。
为了解决这一痛点,ptrade 的 get_fundamentals 接口提供了 merge_type 参数。通过合理配置该参数,我们可以完美规避未来函数。
merge_type 参数解析在调用 get_fundamentals 获取三大报表(资产负债表、利润表、现金流量表)时,可以通过设置 merge_type 来控制数据更新版本:
merge_type = None(或不传):获取首次发布的数据。即使后续实际数据发生了修正或变化,也只返回最初公布的原样数据。在回测场景中,为了避免未来数据,强烈建议使用此默认模式。merge_type = 1:获取最新发布的数据。系统会返回经过修正、重分类后的最新财务数据。此模式更适用于研究场景或实盘交易场景。以下是一个实用的 ptrade 策略初始化与盘前处理示例,展示了如何正确获取首次发布的资产负债表数据:
import time
def initialize(context):
# 初始化策略,设置股票池
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def before_trading_start(context, data):
# 盘前获取财务数据
# 显式不传 merge_type 或传入 None,确保获取的是首次发布的数据,彻底规避未来函数
try:
# 获取 2023 年报的资产总计数据
funda_data = get_fundamentals(
security=g.security,
table='balance_statement',
fields='total_assets',
start_year='2023',
end_year='2023',
report_types='4',
merge_type=None # 关键点:获取首次发布数据,防范未来函数
)
log.info("成功获取首次发布的资产数据:")
log.info(funda_data)
except Exception as e:
log.error(f"获取财务数据失败: {e}")
# 接口限流保护:get_fundamentals 每秒不得调用超过 100 次,单次最大调用量 500 条
time.sleep(1)
def handle_data(context, data):
pass
get_fundamentals 接口有严格的流量限制,每秒不得调用超过 100 次,单次最大调用量是 500 条数据。在多股、多字段、多年份查询时,务必在代码中加入 time.sleep(1) 进行限流保护。valuation 是日频数据,不支持 start_year、end_year、report_types、date_type 和 merge_type 参数。获取估值数据时,建议通过 date 参数传入上一个交易日的日期,以防盘中未更新导致获取到 NaN。