数据 - get_data 详解
JHData.get_data() 是 jh_quant.data 最核心的方法,提供统一的数据获取体验。
方法签名
def get_data( self, data_type: DataTypes, bypass_cache: bool = False, **kwargs,) -> JhDataType时间参数(start / end)
通过 start 和 end 参数指定数据的时间范围:
df = jh.get_data( DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001", start="2024-01-01", end="2024-12-31",)支持的时间颗粒度
| 日期格式 | 示例 | 适用数据源 |
|---|---|---|
YYYY-MM-DD | "2024-01-01" | 所有数据源 |
YYYY-MM | "2024-01" | ak_ 数据源 |
YYYY-MM-DD HH:MM:SS | "2024-01-01 09:30:00" | ak_ 分钟线 |
- akshare 源(
ak_前缀):支持三种格式 - tushare 源(
ts_前缀):仅支持YYYY-MM-DD格式 - JiuHuang 源(
jh_前缀):仅支持YYYY-MM-DD格式
# 按月查询宏观经济数据df = jh.get_data( DataTypes.AK_MACRO_CHINA_CPI, start="2024-01", end="2024-12",)symbol 参数
单个标的
df = jh.get_data(DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001")批量查询(逗号分隔)
df = jh.get_data( DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001,600519,300750", start="2024-01-01", end="2024-12-31",)tushare 源的 ts_code 参数同样支持:
df = jh.get_data( DataTypes.TS_DAILY_QFQ, ts_code="000001.SZ,600519.SH,300750.SZ", start="2024-01-01", end="2024-12-31",)symbol 格式
- akshare 源:纯数字代码,如
"000001"、"600519" - tushare 源:带交易所后缀,如
"000001.SZ"、"600519.SH"
批量分片
当 symbol 列表很长时,系统会自动将列表二分,分批下载后合并。
缓存机制
缓存命中逻辑
- 查询远程总数:先调用 API 获取符合条件的数据总量
- 比较本地缓存:查询本地缓存中符合条件的记录数
- 缓存命中:本地数量 == 远程数量 → 直接返回缓存数据
- 缓存过期:本地数量 > 远程数量 → 清除缓存表后重新下载
- 缓存未命中:本地数量 < 远程数量 → 从 API 下载数据,写入缓存
跳过缓存
df = jh.get_data( DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001", start="2024-01-01", end="2024-12-31", bypass_cache=True,)对于实时数据,建议使用
bypass_cache=True
手动清除缓存
1. 清空整表缓存
jh.clear_cache(DataTypes.AK_STOCK_ZH_A_HIST_QFQ)2. 按条件删除缓存(delete_cache)
只删除符合筛选条件的行(支持 start/end、代码列、任意字段等值筛选),返回删除的行数:
n = jh.delete_cache(DataTypes.TS_DAILY, ts_code="000001.SZ") # 删除某只股票全部缓存jh.delete_cache(DataTypes.TS_DAILY, start="2020-01-01", end="2020-12-31")jh.delete_cache(DataTypes.TS_STOCK_BASIC, name="贵州茅台") # 任意字段等值筛选n = jh.count_cache(DataTypes.TS_STOCK_BASIC, name="贵州茅台") # dry-run,仅统计3. CLI 命令 jh-quant del
jh-quant del ts_daily --yes # 清空整表(--yes 跳过确认)jh-quant del ts_daily --ts-code 000001.SZ # 按代码删除jh-quant del ak_stock_zh_a_hist_qfq --symbol 000001jh-quant del ts_daily --start 2020-01-01 --end 2020-12-31jh-quant del ts_stock_basic --field name=贵州茅台 --dry-run # 预演服务通知与缓存失效
JHData 初始化会请求服务端 /news 与 /version,将服务通知用黄色字体打印到控制台。
当通知内容涉及数据变更/远端数据更新时,会额外提示「本地缓存可能已过期」——远端数据更新后,
本地缓存可能是旧版本,需要重新下载:
jh-quant del ts_daily --yes # 清理对应类型缓存# 下次 get_data 会自动重新下载最新数据bypass_cache 参数
bypass_cache 值 | 行为 |
|---|---|
False(默认) | 优先使用本地缓存 |
True | 跳过缓存,强制从 API 下载 |
返回值
get_data() 返回 JhDataType,一个包装了 pd.DataFrame 的对象:
df = jh.get_data(DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001")
# 和普通 DataFrame 一样使用print(df.head())print(df["close"].mean())
# 额外的便捷属性print(df.jh_dt) # 数据类型print(df.code_col) # code 列名print(df.date_col) # date 列名
# 转回普通 DataFrameplain = df.to_df()get_data_total(预查数据量)
total = jh.get_data_total( DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001", start="2020-01-01", end="2024-12-31",)print(f"共 {total} 条数据")
if total < 100000: df = jh.get_data(DataTypes.AK_STOCK_ZH_A_HIST_QFQ, symbol="000001", start="2020-01-01", end="2024-12-31")