# fox-ticks **Repository Path**: fierce_wolf/fox-ticks ## Basic Information - **Project Name**: fox-ticks - **Description**: No description available - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-08-26 - **Last Updated**: 2026-09-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 股票价格曲线查询工具 一个用 Go 语言编写的命令行工具,用于查询 A 股(沪深)股票的历史价格、基金净值与指数行情,并在终端中以 ASCII 图表直观展示走势曲线。 股票数据来源为**东方财富**(主源)、**腾讯财经**、**新浪财经**、**同花顺**四个免费行情接口;基金净值数据来源为**天天基金**(主源)、**新浪基金**。均无需注册、无需密钥。程序仅依赖 Go 标准库,无任何第三方依赖。股票主源请求失败时自动重试 3 次,仍失败则依次切换备用源,网络波动下也能稳定获取数据。 ## 功能特性 - 查询股票日线 / 周线 / 月线 K 线数据,支持指定起止日期查询任意时间区间 - 查询当日分时线(价格 + 均价 + 成交量 ASCII 图) - 查询基金历史净值走势(单位净值 + 累计净值 + 日增长率),支持指定起止日期查询任意时间区间 - 查询指数历史走势(内置 61 个常见指数:上证指数/深证成指/创业板指/科创50/沪深300/中证A500/北证50 等,也可直接按 6 位代码查询任意指数),支持按代码或名称查询 - 查询基金发布的交易规则(申购/赎回状态、金额限制、确认日、认购/申购/赎回费率) - 查询新发基金一览(即将发售 / 正在发行 / 新成立三个发行阶段,含销售状态与发行期) - 批量查询一批基金的前一日净值(一次请求最多 20 只,比逐只查询快一个量级) - 交易日历判断:识别确定的非交易日(周末 + 法定节假日),跳过无谓的数据同步 - 查询基金状态(募集期 / 开放期 / 封闭期 / 暂停申购 / 暂停赎回 / 终止),覆盖基金成立前后的完整生命周期 - 查询 A 股股票代码+名称名单(沪深北全市场,东方财富 → 新浪财经) - 查询中国公募基金代码+名称名单(天天基金全量列表,约 2.7 万只) - 终端 ASCII 图表绘制价格曲线(`*` 收盘折线、`.` 当日高低范围) - 输出区间统计摘要(最新收盘/净值、区间涨跌、区间最高/最低) - 展示最近 K 线 / 净值明细(开高低收、涨跌幅、成交量) - 支持复权设置:不复权 / 前复权 / 后复权(股票) - 可选导出 CSV 数据,便于二次分析 - 自动识别沪深市场 - 内置 `-h` / `-help` 帮助说明,随程序查看用法 ## 环境要求 - Go 1.22 及以上(`go version` 查看) - 可访问互联网(用于请求行情接口) ## 快速开始 ```bash # 查询贵州茅台日 K 线(默认最近 60 根) go run . -code 600519 # 查询平安银行最近 30 根日 K 线 go run . -code sz000001 -days 30 # 查询周 K 线 go run . -code 600519 -period w # 查询指定日期区间的 K 线(起止均含,支持 YYYYMMDD 或 YYYY-MM-DD) go run . -code 600519 -start 20240101 -end 20240301 go run . -code 600519 -start 2024-01-01 # 仅起始日期:从该日至今日 go run . -code 600519 -end 20240301 -days 30 # 仅结束日期:截至该日的最近约 30 根 # 查询当日分时线(价格 + 均价 + 成交量图) go run . -code 600519 -period min # 查询基金净值走势(如易方达消费行业 110022) go run . -fund -code 110022 # 查询指定日期区间的基金净值(起止均含) go run . -fund -code 110022 -start 20240101 -end 20240301 go run . -fund -code 110022 -start 2024-01-01 # 仅起始日期:从该日至今日 go run . -fund -code 110022 -end 20240301 -days 30 # 仅结束日期:截至该日的最近约 30 条 # 指定新浪基金数据源查询净值 go run . -fund -source sina -code 110022 # 查询 A 股股票代码+名称名单(沪深北全市场) go run . -list go run . -list -csv stocks.csv # 导出 CSV(代码/名称/市场) # 查询基金代码+名称名单(天天基金全量) go run . -fund -list go run . -fund -list -csv funds.csv # 导出 CSV(代码/名称/类型/拼音) # 查询指数历史数据(按代码或名称,如 000001 / 沪深300) go run . -index -code 000001 go run . -index -code 沪深300 -days 30 go run . -index -code 000688 -start 20240101 -end 20240301 # 指定日期区间 go run . -index -info -code 上证指数 # 指数最新行情快照 go run . -index -list # 查看内置指数列表 # 查询并将数据导出为 CSV go run . -code 600519 -csv data.csv go run . -fund -code 110022 -csv nav.csv ``` 编译为可执行文件(可选): ```bash go build -o stockchart.exe . ./stockchart.exe -code 600519 ``` ## 命令行参数 | 参数 | 说明 | 默认值 | |------|------|--------| | `-code` | 股票代码或基金代码(必填),见下方"代码格式说明" | - | | `-fund` | 查询基金净值走势(`-code` 填 6 位基金代码) | `false` | | `-info` | 查询股票/基金信息(股票如 `-info -code 600519`;基金需配合 `-fund`,如 `-fund -info -code 110022`) | `false` | | `-stock` | 股票模式(默认行为,显式声明以便 `-stock -source ?` 仅查看股票数据源) | `false` | | `-index` | 查询指数历史数据(`-code` 填指数代码或名称,如 `000001` / `沪深300`;`-index -list` 查看内置指数列表) | `false` | | `-source` | 指定数据源查询;特殊值 `?` 查看数据源信息(见下) | 空(自动切换) | | `-days` | K 线根数 / 净值条数(日线约等于天数;指定 `-start`/`-end` 后仅用于缺省端的回溯根数) | 60 | | `-start` | 起始日期(`YYYYMMDD` 或 `YYYY-MM-DD`),与 `-end` 组合可查询任意时间区间;缺省按 `-days` 向前回溯 | 无 | | `-end` | 结束日期(`YYYYMMDD` 或 `YYYY-MM-DD`);缺省为今天 | 无 | | `-period` | 周期:`d`=日线、`w`=周线、`m`=月线、`min`=当日分时线 | `d` | | `-fqt` | 复权方式:`0`=不复权、`1`=前复权、`2`=后复权 | `1` | | `-height` | 图表高度(行数) | 20 | | `-csv` | 可选,将 K 线/净值/名单数据导出到指定 CSV 文件 | 无 | | `-list` | 查询代码+名称名单:`-list` 查 A 股股票(沪深北全市场);`-fund -list` 查基金(天天基金全量约 2.7 万只);可配合 `-csv` 导出 | `false` | | `-rule` | 查询基金发布的交易规则(配合 `-fund`),如 `-fund -rule -code 110022` | `false` | | `-h` / `-help` | 显示命令行帮助信息 | - | > 运行 `stockchart -h` 或 `stockchart -help` 可在终端直接查看完整用法与示例。 ## 选择数据源 默认情况下程序按 **东方财富 → 腾讯财经 → 新浪财经 → 同花顺** 的顺序自动尝试,命中的来源会在输出中标出。也可用 `-source` 手动指定: ```bash # 查看全部数据源(股票 + 基金)及别名 stockchart -source ? # 仅查看股票数据源 / 仅查看基金数据源 stockchart -stock -source ? stockchart -fund -source ? # 指定数据源查询(仅尝试该源,失败不再自动切换) stockchart -source 东方财富 -code 600519 stockchart -source 腾讯 -code 600519 # 支持别名,大小写不敏感 stockchart -source sina -code 000001 # 别名见下方列表 ``` | 数据源 | 可用别名 | 支持范围 | |--------|----------|----------| | 东方财富 | 东方财富、东财、eastmoney、em、dfcf | 日/周/月 K 线、当日分时线、股票信息 | | 腾讯财经 | 腾讯财经、腾讯、tencent、tx、qq | 日/周/月 K 线、当日分时线、股票信息 | | 新浪财经 | 新浪财经、新浪、sina | 日/周/月 K 线 | | 同花顺 | 同花顺、ths、10jqka | 日/周/月 K 线 | > 提示:在 Windows PowerShell(5.1)中直接输入中文参数可能出现乱码,此时可用英文别名(如 `eastmoney`、`tencent`、`sina`、`ths`),或在 `cmd` 中先执行 `chcp 65001` 切换为 UTF-8 代码页。 分时线(`-period min`)当前支持**东方财富**与**腾讯财经**两个数据源(新浪、同花顺无稳定的分时接口),同样可用 `-source` 指定。 ## 股票信息查询 用 `-info` 查询股票基本信息(行情快照 + 公司概况): ```bash # 查询贵州茅台基本信息(默认自动选择数据源) stockchart -info -code 600519 # 指定行情数据源(仅东方财富 / 腾讯财经提供信息查询) stockchart -info -source 腾讯 -code 600519 ``` 输出包含:公司全称、证券类型、所属行业、上市交易所、上市日期、成立日期、发行价,以及最新行情快照(最新价、涨跌幅、今开/昨收、最高/最低、成交量/额、换手率、振幅、市盈率、市净率、总市值、流通市值)和公司简介。行情来源为**东方财富 → 腾讯财经**,公司概况由东方财富 F10 接口补充(失败不阻塞,仅显示行情部分)。 ## 基金查询 用 `-fund` 开关将 `-code` 解释为基金代码,支持查询基金基本信息和历史净值走势: ```bash # 查询基金基本信息(名称、类型、基金经理、规模、费率、业绩基准、投资策略等) stockchart -fund -info -code 110022 # 查询易方达消费行业(110022)最近 60 条净值 stockchart -fund -code 110022 # 指定数据源(天天基金 / 新浪基金 / 蛋卷基金),-fund -source ? 查看全部基金数据源 stockchart -fund -source danjuan -code 110022 # 导出净值 CSV stockchart -fund -code 110022 -csv nav.csv ``` | 基金数据源 | 可用别名 | 净值历史 | 基本信息 | |------------|----------|----------|----------| | 天天基金 | 天天基金、天天、eastmoney、em、ttjj | ✅ 主源,日增长率原生字段,自动分页支持长区间 | ✅ 主源,覆盖所有公募基金 | | 新浪基金 | 新浪基金、新浪、sina | ✅ 备用源,约 21 条/次,日增长率由相邻净值推算 | - | | 蛋卷基金 | 蛋卷基金、蛋卷、danjuan、dj | ✅ 备用源(雪球旗下),单页最多 70 条可翻页,日增长率原生字段;不提供累计净值 | ✅ 备用源,含各期收益率、最大回撤 | 净值输出包含:基金名称(天天基金源)、净值区间摘要、ASCII 走势曲线(`*` 单位净值折线)、最近 5 条净值明细(单位净值 / 累计净值 / 日增长率,蛋卷源累计净值显示为 `-`)。基金代码同样支持 `110022`、`sh110022`、`110022.sh` 等写法。 基金信息输出包含:名称/全称、类型、成立日期、基金经理、基金管理人、托管银行、最新规模、风险等级、业绩比较基准、费率(管理/托管)、最新净值与日增长率、各期收益率、最大回撤、投资目标与投资策略。基金信息查询默认走天天基金(覆盖全),蛋卷基金为备用源(部分基金如货币基金在蛋卷平台不销售时会自动降级)。B/C 类后端份额等净值挂靠主代码的基金(如 `000002` 华夏成长混合(后端))天天基金详情接口无数据时,会自动经搜索接口兜底基础信息并标注净值来源。 ## 基金交易规则 用 `-fund -rule -code <基金代码>` 查询该基金**发布的交易规则**,方便投资参考: ```bash stockchart -fund -rule -code 110022 ``` 输出包含: - **交易状态**:申购状态、赎回状态、定投状态、普通/极速回活期宝、超级转换 - **申购与赎回金额**:申购起点、定投起点、日累计申购限额、首次/追加购买、持仓上限、最小赎回份额、部分赎回最低保留份额 - **交易确认日**:买入确认日(T+N)、卖出确认日(T+N) - **运作费用**:管理费率、托管费率、销售服务费率(从基金资产每日计提) - **费率表**:认购费率、申购费率(原费率 → 天天基金优惠费率)、赎回费率(按持有期限) 数据来源为天天基金 F10 购买信息页(服务端渲染,UTF-8)。货币基金等无申购/赎回费用的基金,费率表显示"暂无费率数据"。查询失败时(如代码不存在)会给出明确提示。 ## 新发基金一览(发行 / 销售阶段) 用 `-fund -sale` 查询基金的**发行阶段**信息,即天天基金「新发基金一览」: ```bash # 查询全部三个阶段(即将发售 → 正在发行 → 新成立) stockchart -fund -sale # 只看某一个阶段(-stage 支持中文名与接口参数,忽略大小写) stockchart -fund -sale -stage 即将发售 stockchart -fund -sale -stage 认购期 stockchart -fund -sale -stage upc # -days 控制每个阶段最多返回多少只(默认 60) stockchart -fund -sale -days 20 ``` 三个阶段与 `-stage` 取值: | 阶段 | `-stage` 取值 | 含义 | |------|--------------|------| | 即将发售 | `upc` / `即将发售` / `即将发行` / `准备销售` | 已公布发行计划,尚未开始认购 | | 正在发行 | `zsn` / `认购期` / `在售` / `发行中` | 处于认购期,正在募集 | | 新成立 | `xcln` / `新成立` / `新基金` | 募集结束,基金已成立 | 每只基金返回:代码、名称、基金管理人、类型、**销售状态**(认购期 / 开放申购 / 限大额 / 封闭期 等)、**发行期区间**(如 `26/09/02~26/09/15`)、基金经理、认购费率。 基金的阶段性信息由三处共同提供,按需选用: | 想了解 | 用哪个命令 | |--------|-----------| | 哪些基金即将发行 / 正在认购 / 刚成立 | `-fund -sale`(本接口) | | 某只基金处于哪个阶段(募集期 / 开放期 / 封闭期 / 暂停申赎 / 终止) | `-fund -state -code <代码>` | | 某只基金的详细交易规则(金额限制、确认日、费率表) | `-fund -rule -code <代码>` | > 说明:某阶段当前无基金时返回空列表(而非报错),例如市场暂无「即将发售」的基金。 ## 基金状态查询(生命周期阶段) 用 `-fund -state -code <基金代码>` 查询该基金**当前所处的阶段**: ```bash stockchart -fund -state -code 110022 stockchart -fund -state -code 161117 # 定开基金,通常处于封闭期 ``` 输出「当前阶段 + 阶段说明 + 申购/赎回状态 + 发行/成立日期」,阶段与判定依据如下: | 阶段 | 专业术语 | 状态说明 | 判定依据(天天基金原始状态) | |------|---------|---------|--------------------------| | 基金成立前 | 募集期 / 发行期 | 新基金发售,投资者认购,无每日净值 | 申购状态 = `认购期` | | 基金成立后 | 存续期 | 基金合同生效后的整个生命周期 | — | | ├─ 日常状态 | 开放期 | 可以正常申购、赎回(多数老基金的状态) | 申购 `开放申购`/`限大额` + 赎回 `开放赎回` | | ├─ 特殊状态 | 封闭期 | 封闭运作期,暂停申购与赎回 | 申购 `暂停申购` + 赎回 `暂停赎回` | | ├─ 特殊状态 | 暂停申购期 | 已开放基金临时暂停买入(如规模过大) | 申购 `暂停申购` + 赎回 `开放赎回` | | ├─ 特殊状态 | 暂停赎回期 | 极特殊情况,通常不会出现 | 申购 `开放申购` + 赎回 `暂停赎回` | | └─ 结束状态 | 终止 / 清盘 | 基金合同终止,进入清算程序 | 费率页不可用 + 净值停更超 180 天 | 补充说明: - **终止(清盘)** 由「费率页已下线 + 净值长期停更」判定。例如 `150001` 净值停在 2015-08-13,判定为终止; - **新基金建仓期**:数据源不给「封闭期」取值(新基金建仓期在天天基金上仍显示开放申购),故建仓期按「成立未满 3 个月」推断并单独提示,不改变实际申赎状态的判定; - 输出保留数据源的**原始申购 / 赎回状态**,便于核对标准化结果; - 概况页(发行/成立日期)为弱依赖,取不到时仅缺失日期与建仓期提示,不影响阶段判定。 ## 批量净值查询(一次最多 20 只) 用 `-fund -navs` 一次请求批量获取多只基金的前一日(最新已公布)净值,比逐只查询快一个量级: ```bash # 多只基金用英文逗号分隔(部分 shell 会把逗号当分隔符,此时需加引号) stockchart -fund -navs -code 110022,161725,000001 # 指定数据源(sina 源不提供基金名称) stockchart -fund -navs -code 110022,161725 -source sina ``` 输出「代码 / 名称 / 净值日期 / 单位净值 / 累计净值 / 日增长率」,并提示未返回净值的基金。 | 项 | 说明 | |------|------| | 数据源 | 天天基金(主源)→ 新浪基金(备用);蛋卷无批量接口 | | 数量上限 | **20 只/次**,超过直接报错,需分批调用 | | 去重 | 同一只基金重复传入只请求一次,支持 `sh110022` / `110022.sh` 等写法 | | 部分返回 | 数据源无净值的基金(已清盘、认购中、代码无效)不出现在结果中,会单独提示 | > 说明:返回的是**最新已公布净值**及其日期,不等于自然日的"昨天"。QDII 基金因时差通常再滞后一个交易日(同日查询,普通基金为 `2026-09-04`、QDII `161129` 为 `2026-09-03`);货币基金的"净值"实为**万份收益**、"累计净值"为**七日年化**。 ## 交易日历(非交易日判断) 用 `-date` 查询某日期是否为**非交易日**,便于在非交易日跳过无谓的数据同步: ```bash stockchart -date 2026-10-01 stockchart -date 2026-09-07 ``` 输出示例: ``` 日期:2026-10-01(周四) 结论 非交易日(国庆节) 是否周末 否 法定节假日 国庆节 确定非交易日 是 ``` 判断规则为**保守判断**: | 类型 | 能否确定 | 说明 | |------|---------|------| | 周六、周日 | ✅ 确定非交易日 | A 股在所有周末均休市,**没有例外**。即使国务院安排调休上班(如 2024-09-29 周日、2024-10-12 周六为国庆补班),交易所仍休市 | | 法定节假日 | ✅ 确定非交易日 | 元旦、春节、清明、劳动节、端午、中秋、国庆,依据国务院办公厅通知维护 | | 工作日(非节假日) | ⚠️ 不确定 | 理论上应为交易日,但存在极罕见的临时休市,且数据源无预告接口,故不断言为交易日 | > **重要**:返回「非交易日」即**确定**不开市;返回「可能是交易日」**不保证**一定开市, > 请勿把 `false` 当作"一定是交易日"使用。 数据准确性:节假日表已用交易所实际 K 线反推核验(2025-01-01 ~ 2026-09-04,438 个工作日样本, **零误判、零漏判**)。数据按年维护,目前收录 2025、2026 年;国务院通常在前一年 11 月发布次年安排, 未收录年份只能判断周末,命令行会明确提示。 ## 指数查询 用 `-index` 开关将 `-code` 解释为指数(代码或名称),支持查询主要指数的历史走势与最新行情快照: ```bash # 查询上证指数最近 60 根日 K 线(代码或名称均可) stockchart -index -code 000001 stockchart -index -code 沪深300 # 指定数据源 / 周期 / 日期区间 stockchart -index -source 东方财富 -code 000688 stockchart -index -code 000300 -period w stockchart -index -code 000688 -start 20240101 -end 20240301 # 查询指数最新行情快照(点位、涨跌幅、成交量/额等) stockchart -index -info -code 上证指数 # 查看内置指数列表与数据源 stockchart -index -list stockchart -index -source ? ``` 内置指数(61 个,覆盖沪/深/北三大市场,按综合 / 规模 / 行业 / 策略四类组织): | 分类 | 指数(代码) | |------|------| | 综合(8) | 上证指数(000001)、深证成指(399001)、创业板指(399006)、创业板综(399102)、科创综指(000680)、北证50(899050)、深证综指(399106)、上证全指(000047) | | 规模(20) | 沪深300(000300)、中证500(000905)、中证1000(000852)、中证A500(000510)、中证A100(000903)、中证800(000906)、上证50(000016)、上证180(000010)、上证380(000009)、科创50(000688)、科创100(000698)、创业300(399012)、深证100(399330)、中小100(399005)、中小综指(399101)、国证2000(399303)、超大盘(000043)、上证中盘(000044)、上证小盘(000045)、上证中小(000046) | | 行业(28) | 中证白酒(399997)、中证酒(399987)、中证医疗(399989)、300医药(000913)、全指医药(000991)、中证军工(399967)、全指能源(000986)、上证能源(000032)、中证煤炭(399998)、全指材料(000987)、全指工业(000988)、有色金属(000819)、全指可选(000989)、全指消费(000990)、中证消费(000932)、全指信息(000993)、全指通信(000994)、全指公用(000995)、全指金融(000992)、中证金融(000934)、中证银行(399986)、证券公司(399975)、中证环保(000827)、中证新能(399808)、CS新能车(399976)、基建工程(399995)、800地产(399965)、地产指数(000006) | | 策略(5) | 中证红利(000922)、红利指数(000015)、深证红利(399324)、300价值(000919)、基本面50(000925) | 完整列表(含东财 secid 与腾讯代码)运行 `stockchart -index -list` 查看。 指数查询说明: - 指数无复权概念,`-fqt` 参数对指数无效(始终按不复权查询); - 支持日/周/月 K 线(`-period d/w/m`),不支持当日分时线; - 数据源与股票一致(东方财富 → 腾讯财经 → 新浪财经 → 同花顺),`-source` 可指定; - 指数模式下 `000001` 匹配上证指数(而非深市股票平安银行),指数与股票模式通过 `-index` 开关区分; - **内置表外的指数可直接使用 6 位代码查询**(如 `-index -code 399550` 查央视50、`-index -code 000832` 查中证转债),程序按代码规则自动推断市场归属,名称由数据源返回; - 930 / 931 / 932 系列(中证A50 930050、中证2000 932000、光伏产业 931151 等)为东方财富独占,腾讯 / 新浪 / 同花顺均无数据,仅东财可用时可查; - 输出包含区间摘要、ASCII 走势曲线、最近 5 根 K 线明细,`-csv` 可导出; - 在 Windows PowerShell(5.1)中直接输入中文指数名称可能出现乱码,可改用代码(如 `-code 000300`)。 ## 股票代码格式说明 程序会自动识别市场,支持以下任意一种写法: | 写法 | 示例 | 说明 | |------|------|------| | 纯数字 | `600519` | 自动判断:6/5 开头沪市,9 开头沪 B 股(900,92 除外),0/2/3 开头深市,43/83/87/92 开头北交所 | | 前缀形式 | `sh600519`、`sz000001`、`bj920017` | 明确指定沪市 / 深市 / 北交所 | | 后缀形式 | `000001.sz`、`600519.sh`、`920017.bj` | 同上,大小写均可 | 常用股票代码示例: - 贵州茅台:`600519` - 中国平安:`601318` - 平安银行:`sz000001` 或 `000001` - 宁德时代:`sz300750` 或 `300750` ## 输出说明 程序运行后输出三部分内容: 1. **统计摘要**:股票名称、数据来源(东方财富 / 腾讯财经 / 新浪财经 / 同花顺)、查询区间、最新收盘价、区间涨跌幅、区间最高/最低 2. **ASCII 价格曲线**: - 纵轴为价格刻度,横轴为日期刻度(首、中、末) - `*` 表示每日收盘价连成的折线 - `.` 表示当日最高价与最低价之间的范围 - `|` 表示相邻收盘价之间的连线 3. **最近 5 根 K 线明细**:日期、开盘、最高、最低、收盘、涨跌幅、成交量(手) 示例输出: ``` 贵州茅台(600519) 数据来源: 东方财富 区间: 2026-07-15 ~ 2026-08-25,共 30 根 K 线 最新收盘: 1304.00,区间涨跌: +52.94(+4.23%) 区间最高: 1363.35,区间最低: 1198.66 1371.58 | 1362.05 | *|*| . .. 1352.52 | .*.. *..*. ...(图表省略)... 1190.43 | ------------------------------ 2026-07-15 2026-08-05 2026-08-25 ``` ## CSV 导出格式 使用 `-csv 文件名` 导出时,CSV 包含以下列: ``` date,open,close,high,low,volume,pct 2026-08-19,1300.00,1307.88,1308.88,1290.50,37548,0.76 ``` - `date`:日期 - `open` / `close` / `high` / `low`:开 / 收 / 高 / 低价 - `volume`:成交量(手) - `pct`:涨跌幅(%) 基金净值导出(`-fund -csv 文件名`)的列: ``` date,unit_nav,acc_nav,pct 2026-08-25,2.9230,2.9230,0.31 ``` - `unit_nav`:单位净值;`acc_nav`:累计净值;`pct`:日增长率(%) ## 注意事项 - 程序需联网访问行情接口,网络不通时无法查询。查询失败时会依次尝试东方财富 → 腾讯财经 → 新浪财经 → 同花顺,并在输出中标注本次实际使用的数据来源。 - 名单查询(`-list`)依赖东方财富 / 新浪财经的公开列表接口,两个源均有反爬限流机制(表现为连接被拒绝 / HTTP 456):频繁查询会触发限流,报错时请等待几分钟后重试,或切换 `-source`(股票名单支持 东方财富 / 新浪财经)。 - 同花顺接口暂不支持周线查询(此时会跳过该源继续尝试其它源),且单次最多返回 300 根 K 线。 - **北交所股票**:腾讯财经对北交所 K 线支持很差(43/83/87 老号段返回 0 根、920 新号段仅 1 根),新浪财经对各号段最完整。自动降级取**数据量最多**的一份而非"第一个非空",例如 `920065` 可正确拿到 28 根(若按"第一个非空"取则只有腾讯给的 1 根)。 - 日期区间查询(`-start`/`-end`)中:东方财富、腾讯财经接口原生支持日期参数;新浪、同花顺接口仅支持"最近 N 根",按区间估算根数拉取后精确过滤,早期区间可能受各源数据深度限制。`-days` 在区间模式下仅用于缺省端的回溯根数(约数,返回根数可能多于 `-days`)。 - `-start`/`-end` 适用于股票 K 线与基金净值(`-period min` 分时线仅支持当日)。基金区间查询中:天天基金接口原生支持日期参数(推荐,任意历史区间);新浪、蛋卷接口仅提供最近约一年数据,更早区间会返回空——自动降级时改用其它源,指定源时提示未获取到数据。 - 使用前复权(默认 `-fqt 1`)时,历史分红较多的股票(如茅台)早期价格可能显示为负值,这是复权计算的正常现象;如需原始价格可用 `-fqt 0`。 - K 线数量越多,图表越宽,超过 160 根时程序会自动抽稀以保证终端可读性。 - 本工具提供的数据仅供参考,不构成任何投资建议。 ## 作为库复用(stock / fund 包) 所有行情数据查询逻辑均封装在 `stock` 包(股票 K 线/分时,`stockchart/stock`)、`fund` 包(基金净值,`stockchart/fund`)与 `index` 包(指数行情,`stockchart/index`)中,均不依赖 CLI 与终端绘图,可直接被其他 Go 项目复用。三个包的 API 设计一致(`ParseCode` + `FetchXxx` + `MatchSource` + `DataSources`)。 ### stock 包(股票) ```go import "stockchart/stock" // 1. 解析股票代码(支持 600519 / sh600519 / 000001.sz 等写法) code, _ := stock.ParseCode("600519") // 2. 查询日 K 线(prefer 为空时自动切换数据源) // start/end 传 time.Time 零值表示"最近 N 根";传日期可指定查询区间 var start, end time.Time // 例如:start, _ = time.Parse("2006-01-02", "2024-01-01") klines, name, source, err := stock.FetchKlines( code.SecID, code.TencentCode, stock.KLTDay, stock.FqtForward, 60, start, end, "") // 支持 stock.KLTWeek / stock.KLTMonth 周期,stock.FqtNone / FqtForward / FqtBackward 复权 // 3. 查询当日分时线(自动:东方财富 → 腾讯财经) points, name, source, err := stock.FetchIntraday(code.SecID, code.TencentCode, "") // 4. 指定数据源(用 MatchSource 校验名称/别名,IntradayCapable 判断是否支持分时) if src, ok := stock.MatchSource("tencent"); ok { klines, name, source, err = stock.FetchKlines(code.SecID, code.TencentCode, stock.KLTDay, stock.FqtForward, 60, start, end, src) } // 5. 查询 A 股全市场名单(自动:东方财富 → 新浪财经;返回约 5900 只) metas, source, err := stock.FetchStockList("") fmt.Printf("来源=%s 共%d只 首只=%s %s(%s)\n", source, len(metas), metas[0].Code, metas[0].Name, metas[0].Market) // 6. 分页 + 排序查询(第 1 页、按名称升序;HasMore 为 true 时继续翻页) page, source, err := stock.FetchStockListPage("", 1, stock.SortByName, true) fmt.Printf("来源=%s 总数=%d 本页%d只 HasMore=%v\n", source, page.Total, len(page.Metas), page.HasMore) ``` 包内主要导出 API: | 符号 | 说明 | |------|------| | `Kline` / `IntradayPoint` | K 线 / 分时数据点结构体 | | `ParseCode(input) (*Code, error)` | 解析股票代码,得到 `SecID`(东方财富格式)与 `TencentCode`(腾讯格式) | | `FetchKlines(secID, tencentCode string, klt, fqt, lmt int, start, end time.Time, prefer string)` | 查询 K 线(`start`/`end` 为零值时不限制,至少指定一端即进入日期区间模式),返回 `([]Kline, 名称, 来源, error)` | | `FetchIntraday(secID, tencentCode, prefer string)` | 查询当日分时线,返回 `([]IntradayPoint, 名称, 来源, error)` | | `MatchSource(s) (string, bool)` | 数据源名称/别名匹配 | | `IntradayCapable(name) bool` | 判断数据源是否支持分时线 | | `FetchStockList(prefer string) ([]StockMeta, string, error)` | 查询 A 股全市场名单(`prefer` 为空时自动 东方财富 → 新浪财经;仅这两个源支持名单),返回 `([]StockMeta, 来源, error)` | | `FetchStockListPage(prefer string, page int, sort string, asc bool) (*StockListPage, string, error)` | 分页查询 A 股名单第 `page` 页(从 1 起),`sort` 为排序字段(`SortByCode`/`SortByName`/`SortByPrice`/`SortByPct`,空=按代码),`asc` 为 `true` 升序 / `false` 降序;返回 `(*StockListPage, 来源, error)`;`StockListPage` 含 `Metas`/`Total`(新浪为 -1)/`HasMore` | | `DataSources` | 数据源列表(含名称、别名、支持范围) | | 常量 `KLTDay/KLTWeek/KLTMonth`、`FqtNone/FqtForward/FqtBackward` | 周期与复权参数 | > 说明:`FetchKlines` 的 `prefer` 参数为空时自动按 东方财富(重试 3 次)→ 腾讯财经 → 新浪财经 → 同花顺 顺序尝试,并**取其中数据量最多的一份**(某源数据达到期望根数即立即返回;各源对同一标的完整度差异大,如腾讯对北交所仅返回 1 根而新浪可返回完整历史);非空时仅尝试该源。`FetchIntraday` 同理(仅东财 / 腾讯支持分时)。 ### fund 包(基金) ```go import "stockchart/fund" // 校验基金代码(6 位数字,兼容 sh/sz 前缀与 .sh/.sz 后缀) code, _ := fund.ParseCode("110022") // 查询最近 60 条净值(prefer 为空时自动:天天基金 → 新浪基金;返回旧→新排序) // start/end 传 time.Time 零值表示"最近 N 条";传日期可指定查询区间 var start, end time.Time // 例如:start, _ = time.Parse("2006-01-02", "2024-01-01") navs, name, source, err := fund.FetchNets(code.Code, 60, start, end, "") for _, n := range navs { fmt.Printf("%s 单位净值=%.4f 累计净值=%.4f 日增长=%+.2f%%\n", n.Date, n.Nav, n.AccNav, n.Pct) } // 2b. 查询全量基金名单(天天基金,约 2.7 万只) metas, err := fund.FetchFundList() fmt.Printf("共%d只 首只=%s %s(%s)\n", len(metas), metas[0].Code, metas[0].Name, metas[0].Type) ``` fund 包主要导出 API: | 符号 | 说明 | |------|------| | `Nav` | 净值数据点:`Date`、`Nav`(单位净值)、`AccNav`(累计净值)、`Pct`(日增长率%) | | `ParseCode(input) (*Code, error)` | 校验基金代码,得到 `Code.Code` | | `FetchNets(code string, lmt int, start, end time.Time, prefer string)` | 查询净值(`start`/`end` 为零值时不限制,至少指定一端即进入日期区间模式),返回 `([]Nav, 基金名称, 来源, error)` | | `MatchSource(s) (string, bool)` | 数据源名称/别名匹配 | | `FetchTradeRule(code string) (*TradeRule, error)` | 查询基金交易规则(天天基金 F10) | | `TradeRule` / `FeeRow` | 交易规则与费率表结构 | | `FetchFundList() ([]FundMeta, error)` | 查询中国公募基金代码+名称名单(天天基金全量,约 2.7 万只),`FundMeta` 含 `Code`/`Name`/`Type`/`Pinyin` | | `FetchIssueFunds(stage string, limit int) ([]IssueFund, error)` | 查询新发基金一览(发行 / 销售阶段);`stage` 为空查全部三阶段,`limit<=0` 取默认 20 | | `IssueFund` | 新发基金条目:`Code`/`Name`/`Company`/`Type`/`Status`(销售状态)/`IssuePeriod`(发行期)/`Manager`/`Fee`/`Stage` | | `MatchIssueStage(s) (string, bool)` | 发行阶段名称/别名匹配(如 `即将发售`、`认购期`、`upc`),返回接口参数 | | `IssueStages` | 发行阶段列表(即将发售 → 正在发行 → 新成立) | | `FetchStage(code string) (*StageInfo, error)` | 查询基金状态(生命周期阶段):募集期 / 开放期 / 封闭期 / 暂停申购 / 暂停赎回 / 终止 / 未知 | | `StageInfo` | 状态结果:`Stage`/`Desc`/`BuyStatus`/`RedeemStatus`/`IssueDate`/`FoundDate`/`NavDate`/`InBuilding`/`Terminated` | | `StageDesc(stage string) string` | 阶段常量 → 状态说明文字 | | `FetchNavsBatch(codes []string, prefer string) ([]NavQuote, string, error)` | 批量查询前一日(最新已公布)净值,返回 `(净值列表, 实际来源, err)`;最多 20 只,超出报错 | | `NavQuote` | 批量净值条目:`Code` / `Name` / `Date` / `Nav`(单位净值) / `AccNav`(累计净值) / `Pct`(日增长率%) | | `MaxBatchNavs` | 常量 `20`,单次批量净值查询的基金数量上限 | | `DataSources` | 基金数据源列表 | > 说明:天天基金每页最多 20 条、自动翻页支持长区间;新浪基金无分页参数、约 21 条/次。 ### index 包(指数) ```go import "stockchart/index" import "stockchart/stock" // 1. 解析指数(支持代码 / 名称 / 别名,如 000001 / 沪深300 / 深成指) idx, _ := index.ParseCode("沪深300") fmt.Printf("%s(%s)secid=%s\n", idx.Name, idx.Code, idx.SecID) // 2. 查询最近 60 根日 K 线(prefer 为空时自动:东方财富 → 腾讯财经 → 新浪财经 → 同花顺) var start, end time.Time // 传日期可指定查询区间 klines, name, source, err := index.FetchKlines(idx, stock.KLTDay, 60, start, end, "") fmt.Printf("来源=%s 名称=%s 共%d根\n", source, name, len(klines)) // 3. 查询指数最新行情快照(东方财富延迟行情) info, err := index.FetchInfo(idx) fmt.Printf("%s 最新点位=%s 涨跌幅=%s%% 成交额=%s\n", info.Name, info.Price, info.Pct, info.Amount) ``` index 包主要导出 API: | 符号 | 说明 | |------|------| | `Index` / `Indexes` | 指数描述结构与内置指数表(61 个常见指数,含 `Category` 分类字段) | | `Lookup(input) (*Index, bool)` | 按代码/名称/别名查找指数(忽略大小写);未收录时自动按代码推断 | | `ParseCode(input) (*Index, error)` | 解析指数输入(与 `Lookup` 等价,返回 `error`) | | `InferIndex(code) (*Index, bool)` | 按代码规则推断指数市场归属,支持查询内置表外的任意指数 | | `FetchKlines(idx *Index, klt, lmt int, start, end time.Time, prefer string)` | 查询指数历史 K 线,返回 `([]stock.Kline, 名称, 来源, error)`;指数无复权,始终按不复权查询 | | `Info` / `FetchInfo(idx *Index) (Info, error)` | 指数行情快照结构与查询(东方财富延迟行情) | | `DataSources` / `MatchSource(s)` | 数据源列表与匹配(与 `stock` 包一致) | > 说明:`klt` 复用 `stock` 包周期常量(`stock.KLTDay` / `KLTWeek` / `KLTMonth`),返回的 `stock.Kline` 与股票 K 线结构一致,可直接复用绘图/导出逻辑。 ### calendar 包(交易日历) ```go import "stockchart/calendar" t := time.Date(2026, 10, 1, 0, 0, 0, 0, time.Local) // 是否为确定非交易日(周末或法定节假日)——同步前用它跳过无谓请求 if calendar.IsNonTradingDay(t) { fmt.Println("非交易日,无需同步行情") } calendar.IsWeekend(t) // false(周四) calendar.HolidayName(t) // 国庆节 calendar.IsYearCovered(2027) // false,2027 年数据尚未发布 ``` | 符号 | 说明 | |------|------| | `IsNonTradingDay(t) bool` | 是否为**确定**非交易日。true = 确定不开市;false = 可能是交易日(不可当作一定开市) | | `IsWeekend(t) bool` | 是否周六/周日。纯本地规则,无例外(调休上班日仍休市) | | `IsHoliday(t) bool` / `HolidayName(t) string` | 是否法定节假日 / 节假日名称 | | `IsYearCovered(year int) bool` | 该年份是否有完整节假日数据 | | `CoveredYears() []int` / `HolidaysOf(year) []HolidayRange` | 已收录年份 / 某年节假日区间 | 本包**零网络依赖**(仅标准库),股票与基金通用(两者遵循同一套 A 股交易日历)。详见 `calendar/README.md`。 ## 项目结构 ``` 股票信息/ ├── go.mod # Go 模块定义(module stockchart) ├── main.go # 命令行入口:参数解析、终端绘图、CSV 导出 ├── stock/ # 可复用的股票行情查询库(K 线 / 分时) │ ├── stock.go # 类型、常量、数据源定义、代码解析 │ ├── fetch.go # K 线 / 分时统一获取入口(含自动降级) │ ├── eastmoney.go # 东方财富接口(K 线、分时) │ ├── tencent.go # 腾讯财经接口(K 线、分时) │ ├── sina.go # 新浪财经接口(K 线) │ ├── ths.go # 同花顺接口(K 线) │ ├── range.go # K 线日期区间工具(范围补齐、根数估算、按日期过滤) │ ├── list.go # A 股名单查询(东方财富 clist → 新浪财经 hs_a) │ └── http.go # HTTP 基础设施(共享客户端、统一请求与重试) ├── fund/ # 可复用的基金净值查询库 │ ├── fund.go # Nav 类型、数据源定义、代码解析 │ ├── fetch.go # 净值统一获取入口(含自动降级) │ ├── eastmoney.go # 天天基金接口(净值历史、基金名称) │ ├── sina.go # 新浪基金接口(净值历史) │ ├── danjuan.go # 蛋卷基金接口(净值历史、基金信息) │ ├── range.go # 净值日期区间工具(范围补齐、条数估算、按日期过滤) │ ├── list.go # 基金名单查询(天天基金 fundcode_search.js 全量列表) │ ├── info.go # 基金信息查询(天天基金 → 蛋卷基金) │ ├── rule.go # 基金交易规则查询(天天基金 F10 购买信息页解析) │ ├── sale.go # 新发基金一览查询(发行/销售阶段:即将发售/正在发行/新成立) │ ├── stage.go # 基金状态查询(生命周期阶段判定,含 F10 概况页解析) │ ├── batch.go # 净值批量查询(一次请求最多 20 只,天天基金 → 新浪基金) │ └── http.go # HTTP 基础设施(共享客户端、统一请求与重试) ├── calendar/ # 可复用的交易日历库(非交易日判断,零网络依赖) │ └── calendar.go # 周末规则、法定节假日表、非交易日保守判断 └── index/ # 可复用的指数查询库 ├── index.go # Index 类型、内置指数表(61 个)、代码/名称解析、表外代码推断、数据源转发 ├── fetch.go # FetchKlines(复用 stock 多源降级)、Info/FetchInfo(东财快照) └── http.go # HTTP 基础设施(共享客户端、统一请求) ``` ## 常见问题 **Q: 提示"未找到该股票"?** 检查股票代码是否正确,目前主要支持 A 股沪深市场(6 位数字代码)。 **Q: 图表看起来不整齐?** 终端字体需为等宽字体(如 Consolas、Courier New)。可在 Windows 终端设置中调整。