问题描述
请问get_dominant_future(underlying_symbol,date , end_date )中的end_date按照说明:end_date:指定日期参数,获取自date到end_date的主力合约(pandas.Series格式)。默认值为 None,不填则返回 date 参数指定日期的主力合约标的。
但是实际使用过程中提示图中错误:TypeError: get_dominant_future() got an unexpected keyword argument 'end_date'。 请问这个怎么可以解决?我怎么可以获得一段时间主力每天对应的主力合约代码?谢谢!
解决方案
您好!出现 TypeError: get_dominant_future() got an unexpected keyword argument 'end_date' 这个错误,是因为 JoinQuant(聚宽)官方的 get_dominant_future API 实际上并不支持 end_date 参数。
根据聚宽最新的 API 文档,该函数的标准用法为:
get_dominant_future(underlying_symbol, date=None)
它每次只能返回**指定某一天(date)**的主力合约字符串(例如 'IF1608.CCFX'),无法直接通过传入 end_date 来获取一个时间段的 Series。
解决方案:如何获取一段时间内的主力合约序列?
如果您需要获取一段时间内每天对应的主力合约代码,可以通过结合 get_trade_days(获取交易日列表)和 get_dominant_future(循环获取每天的主力合约)来自定义一个函数实现。最后将其转换为 pandas.Series 格式即可。
以下是为您编写的实现代码:
import pandas as pd
from jqdata import *
def get_dominant_future_series(underlying_symbol, start_date, end_date):
"""
获取指定时间段内某期货品种每天的主力合约代码
:param underlying_symbol: 期货品种代码,如 'IF', 'AG'
:param start_date: 开始日期,如 '2023-01-01'
:param end_date: 结束日期,如 '2023-01-31'
:return: pandas.Series,索引为交易日,值为当日主力合约代码
"""
# 1. 获取指定时间段内的所有交易日
trade_days = get_trade_days(start_date=start_date, end_date=end_date)
# 2. 遍历交易日,逐日获取主力合约
dominant_futures = []
for date in trade_days:
dom_contract = get_dominant_future(underlying_symbol, date=date)
dominant_futures.append(dom_contract)
# 3. 组合成 pandas.Series 并返回
dom_series = pd.Series(dominant_futures, index=trade_days)
return dom_series
# ================= 测试示例 =================
# 获取沪深300股指期货(IF)在 2023年1月 的主力合约序列
# dom_series = get_dominant_future_series('IF', '2023-01-01', '2023-01-31')
# print(dom_series)
代码原理解析:
get_trade_days(start_date, end_date):获取您所需时间段内的有效交易日列表,避免在非交易日查询导致数据异常。for date in trade_days::通过循环,将每一天作为date参数传入get_dominant_future,获取当天的正确主力合约。pd.Series(...):将获取到的列表与交易日时间轴对齐,打包成您期望的pandas.Series格式,方便后续进行向量化计算或数据对齐。
您可以直接将上述 get_dominant_future_series 函数复制到您的研究环境或策略代码中使用。