
Openclaw Stock Skill
- 642 installs
- 10 repo stars
- Updated August 2, 2026
- 1018466411/openclaw-stock-data-skill
openclaw-stock-skill is an OpenClaw agent skill that queries A-share and related market data through data.diemeng.chat for developers who need stock snapshots, bars, and financial metrics inside conversational agents.
About
openclaw-stock-skill is an OpenClaw integration skill that teaches agents to call data.diemeng.chat for Chinese A-share and related market data using a STOCK_API_KEY. It covers real-time snapshots, intraday ticks, and historical daily or minute bars plus financial indicators for stocks, convertible bonds, ETFs, and indices. Install with `npx skills add https://github.com/1018466411/openclaw-stock-data-skill`, select openclaw global scope, and copy to all agents. Developers reach for openclaw-stock-skill when building trading assistants, portfolio bots, or research agents that must answer market questions without hand-rolling exchange APIs. Custom alert notifications for limit-up or volume spikes are noted as in development.
- Queries real-time snapshots and intraday series through data.diemeng.chat
- Fetches historical daily, minute, and financial indicator data for stocks, ETFs, indices, and convertibles
- Documents OpenClaw install via npx skills add and global agent copy
- Uses STOCK_API_KEY as primaryEnv mapped from skills.entries.openclaw-stock-skill.apiKey
- Notes custom alert signals (limit-up, volume spikes) as in-development capability
Openclaw Stock Skill by the numbers
- 642 all-time installs (skills.sh)
- Ranked #197 of 1,106 Finance & Trading skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 3, 2026 (Skillselion catalog sync)
npx skills add https://github.com/1018466411/openclaw-stock-data-skill --skill openclaw-stock-skillAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 642 |
|---|---|
| repo stars | ★ 10 |
| Security audit | 2 / 3 scanners passed |
| Last updated | August 2, 2026 |
| Repository | 1018466411/openclaw-stock-data-skill ↗ |
How do OpenClaw agents query A-share stock market data?
Wire an OpenClaw agent to query A-share and related market data via data.diemeng.chat using a STOCK_API_KEY.
Who is it for?
Developers building OpenClaw finance or research agents that need programmatic A-share and ETF market data.
Skip if: Developers who need US-only equities, live order execution, or market data without registering at data.diemeng.chat.
When should I use this skill?
User asks an OpenClaw agent for Chinese stock prices, historical bars, financial ratios, or ETF/index quotes.
What you get
Agent-ready stock snapshots, intraday quotes, historical OHLCV series, and financial indicator responses keyed to STOCK_API_KEY.
- live quote responses
- historical bar series
- financial metric lookups
By the numbers
- Supports stocks, convertible bonds, ETFs, and indices
- Requires STOCK_API_KEY environment variable
Files
� 核心能力
本技能提供强大的股票数据查询与分析能力,主要包含:
1. 实时数据:提供实时股票快照、实时分时行情。 2. 历史数据:支持查询股票、可转债、ETF、指数等品种的历史数据(日线、分钟线、财务指标等)。 3. 自定义通知(开发中):支持涨停、炸板、放量大涨、涨停大额成交等异动信号的自定义消息通知。
�📥 安装方法
npx skills add https://github.com/1018466411/openclaw-stock-data-skill安装时按提示选择:
1. 选择 openclaw 2. 选择 global 应用于所有 Agent 3. Copy to all agents: yes
本技能教会代理如何使用你自建的股票数据服务(注册账号 https://data.diemeng.chat),通过 API Key 进行鉴权,查询股票的日线、分钟线、财务指标等数据。
⚙️ API Key 配置约定
>
- OpenClaw 会按照 `skills.entries.<key>` 配置 把 API Key 和自定义配置注入到进程环境变量中。
- 本技能约定使用环境变量 `STOCK_API_KEY` 作为主密钥,并在metadata.openclaw.primaryEnv中声明,以便通过skills.entries.openclaw-stock-skill.apiKey统一配置。
- 推荐的 OpenClaw 配置示例(~/.openclaw/openclaw.json):>
```json5
{
skills: {
entries: {
"openclaw-stock-skill": {
enabled: true,
// 建议在 OpenClaw UI 的 Skill 参数面板里填写 apiKey,
// Gateway 会自动将其写入 STOCK_API_KEY 环境变量
apiKey: { source: "env", provider: "default", id: "STOCK_API_KEY" },
env: {
// 可在这里直接写死,或通过系统环境变量覆盖
STOCK_API_KEY: "YOUR_REAL_STOCK_API_KEY"
},
config: {
// 可选:覆盖默认域名
baseUrl: "https://data.diemeng.chat"
}
}
}
}
}
```
>
参考文档:Skills Config、Skills
⚠️ 重要说明
1. 权限开通与 403 错误
如果 API 返回 403 错误,说明您的账号没有开通对应接口的权限。 请务必访问官网 <https://data.diemeng.chat/>(海外请访问 https://mg.diemeng.chat/),在个人中心开通所需权限(如股票行情、实时快照、可转债等)。
2. 接口类型区分
- 实时接口:
get_stock_snapshot_daily(不传日期或传今日):获取最新实时快照(价格、成交量、五档盘口等)。get_stock_snapshot_push_history:获取实时推送的历史记录。get_call_auction:获取集合竞价数据。- 历史接口:
get_daily_data:获取历史日 K 线。get_kline_data:获取历史周期K线(周K、月K)。get_kline_adj_data:获取复权历史周期K线(周K、月K)。get_history_data:获取历史分钟线。get_finance_data:获取历史财务指标。get_financial_indicator:获取财务指标报表数据(stock\_financial\_indicator)。get_income_statement:获取利润表数据(stock\_income)。get_balancesheet:获取资产负债表数据(stock\_balancesheet)。get_cashflow_statement:获取现金流量表数据(stock\_cashflow)。get_main_fund_flow:获取大小单资金金流向。get_main_fund_flow_overview:获取主力资金流向总览。get_cyq_chips:获取筹码峰分布。get_holder_number:获取股东人数数据。get_pledge_stat:获取股票质押统计数据。get_margin_detail:获取融资融券明细数据。get_stock_snapshot_daily(传历史日期):获取历史快照。- 指数与板块接口:
get_index_history:获取指数分钟级历史数据。get_index_realtime_history:获取指数当天实时 1 分钟级别分时数据。get_index_weight:获取指数月度成分和权重数据(index_code 必传,可按 stock_code 和 trade_date 筛选)。get_ths_sector_categories:获取同花顺板块分类数据。get_ths_constituent_stocks:获取同花顺成分股数据。get_dc_blocks:获取东方财富板块列表。get_dc_daily:获取东方财富板块日K(按交易日或板块代码)。get_dc_block_stocks:获取东方财富板块成分股(支持板块/日期/股票筛选,空参默认最新日期)。get_tdx_block_stocks:获取通达信板块成分股,返回分页结构data.total/page/page_size/list,其中list项包含block_code、block_name、block_type、stock_code。
总体说明
- 获取正确的 API Key 并验证:
- 一定要获取到正确的 apiKey 才可以调用接口。
- 获取途径:优先从环境变量
STOCK_API_KEY读取,或从当前目录的config.json获取。如果在 Skill 面板配置了也会注入到环境变量中。 - 基础域名:默认接口的域名是
data.diemeng.chat,如果是海外 IP 则访问 `mg.diemeng.chat`。 - 鉴权方式:所有需要权限的接口都必须带上 API Key,并且必须放到 HTTP Header 里面:
apiKey: <STOCK_API_KEY>(强制要求)Content-Type: application/json- 返回结构:
- 大多数接口返回:
{ "code": 200, "msg": "成功", "data": { ... } } - 少数列表类接口直接返回数组或简单结构,实际响应以 JSON 为准。
- 限流与黑名单:
- API Key 及 IP 都有严格限流与黑名单逻辑:
- 无效 API Key 多次尝试会触发封禁(参见后端
DataAccessVerifier实现)。 - 需优先缓存和复用同一 API Key,不要在循环中频繁切换。
- ⚠️ 数据量限制:除特别说明外,大多数列表类接口单次请求最多返回 10000 条数据。如需获取更多数据,请使用分页参数。
能力概览(建议的工具意图)
代理应将本技能视作一组 HTTP 能力,而不是单一接口:
- get\_stock\_daily\_bars:查询指定股票在某一时间区间内的日线 K 线数据。
- get\_stock\_intraday\_bars:查询分钟级(1/5/15/30/60 分钟)历史数据。
- get\_stock\_finance\_factors:查询日度财务因子(PE、PB、换手率等)。
- get\_stock\_main\_fund\_flow:查询主力资金流向明细(按时间范围/股票代码,支持仅传其一)。
- get\_stock\_main\_fund\_flow\_overview:查询主力资金流向总览(净流入率与分档统计)。
- get\_stock\_limit\_up:查询涨停明细数据(封单、连板、涨停原因等)。
- get\_stock\_list:查询股票基础信息列表,用于代码/名称搜索。
- get\_stock\_calendar\_and\_snapshot:查询交易日历和当日快照。
- get\_stock\_search:使用自然语言条件搜索符合条件的股票(如"PE<20 且换手率>3%")。
- get\_stock\_call\_auction:查询集合竞价数据。
- get\_stock\_closing\_snapshot:查询收盘快照数据。
- get\_stock\_snapshot\_daily:查询实时或历史股票快照(含 Redis 缓存加速)。
- get\_stock\_suspension:查询股票停牌信息。
- get\_stock\_adj\_factor:查询复权因子。
- get\_bond\_daily:查询可转债日线数据。
- get\_bond\_indicator\_daily:查询可转债日指标数据。
- get\_bond\_list:查询可转债列表信息。
- get\_index\_realtime\_history:查询指数当天实时 1 分钟级别分时数据。
- get\_index\_weight:查询指数月度成分和权重数据(可选按成分股过滤)。
代理在规划调用时,应根据用户自然语言意图,选择以上能力并组合使用。
接口详情与调用规范
1. 日线数据:POST /api/stock/daily
- URL:
{baseUrl}/api/stock/daily - 方法:
POST - Headers:
Content-Type: application/jsonapiKey: <STOCK_API_KEY>- 请求体 JSON(后端
DailyDataRequest):
{
"stock_code": "000001.SZ",
"start_time": "2024-01-01",
"end_time": "2024-01-31",
"volType": "share",
"page": 0,
"page_size": 1000
}- 说明:
stock_code可以是单个字符串,也可以是字符串数组。start_time、end_time格式为YYYY-MM-DD。volType可选:share(默认,按股返回)或lot(按手返回,1手=100股)。- 支持分页,
page从 0 开始。 - 响应字段:
data.total:总记录数data.list:每条记录包含stock_code,stock_name,trade_date,open,high,low,close,vol,amount等字段,价格与成交量已在后端统一保留 2 位小数,vol单位由volType决定。- 响应主体(简化):
data.total:总记录数data.list:每条记录包含stock_code,trade_date,open,high,low,close,vol,amount等字段,价格与成交量已在后端统一保留 2 位小数。
1.1 复权日线:POST /api/stock/daily_adj
- 请求参数与
POST /api/stock/daily基本一致,额外支持algo(recursive/factor)。 - 新增
volType可选参数:share(默认,按股)或lot(按手)。 - 为兼容历史调用,未传
volType时保持旧行为(按股返回)。
代理在需要“某股某段时间的日 K 线”时,应优先选择该接口。
2. 分钟级历史数据:POST /api/stock/history
- URL:
{baseUrl}/api/stock/history - 方法:
POST - Headers:同上
- 请求体 JSON(后端
HistoryDataRequest):
{
"stock_code": "000001.SZ",
"level": "5min",
"start_time": "2024-01-01 09:30:00",
"end_time": "2024-01-01 15:00:00",
"page": 0,
"page_size": 1000
}- 字段说明:
stock_code:仅支持单个股票代码字符串(不支持数组)level:"1min" | "5min" | "15min" | "30min" | "60min"start_time/end_time:- 允许仅日期(自动补全 00:00:00 和 23:59:59)
- 或完整时间戳
YYYY-MM-DD HH:MM:SS - 响应主体(简化)单位手:
data.list中每条包含:stock_code,trade_time,open,high,low,close,vol,amount。
用于用户询问“某天/某段时间内的分钟级行情、分时数据”等场景。
3. 实时分时数据(支持最近7天内):POST /api/realtime/history 及 /api/index/realtime/history
- URL:
{baseUrl}/api/realtime/history或{baseUrl}/api/index/realtime/history - 方法:
POST - Headers:同上
- 请求体 JSON:
{
"stock_code": "000001.SZ",
"trade_time": "2026-03-15 09:31:00",
"date": "2026-03-15"
}(对于指数接口,参数名为 `index_code`)
- 说明:
- 获取实时 1 分钟级别分时数据,支持最近7天内,支持全市场或指定股票/指数。
stock_code/index_code或trade_time至少提供一个。- 返回数据会根据代码 +
trade_time进行去重。
调用建议(定时任务拉取全市场数据):
>
- 建议使用时间 (trade_time) 来获取实时分时,一次可以获取某一分钟的全市场数据。- 使用定时任务来获取数据,每分钟获取上一分钟的数据。
- 建议在每分钟的 2 到 5 秒后开始获取。
- 如果获取不到,建议暂停 1 秒后继续获取,最多重试不要超过 60 次,避免陷入死循环。
- 建议在每分钟 15 秒之后再调用接口更新一次数据,确保数据的准确性。
3.1 指数成分与权重:POST /api/index/weight
- URL:
{baseUrl}/api/index/weight - 方法:
POST - Headers:同上
- 请求体 JSON:
{
"index_code": "000300.SH",
"stock_code": "600519.SH",
"trade_date": "2026-03-31",
"page": 0,
"page_size": 2000
}- 字段说明:
index_code(必填):指数代码stock_code(可选):成分股代码,支持字符串或数组(后端按con_code过滤)trade_date(可选):支持YYYY-MM或YYYY-MM-DD,查询时仅按年和月过滤trade_date不传时默认返回该指数最新月份数据- 返回字段:
index_code,stock_code,trade_date,weight
4. 财务与因子(行情因子):POST /api/stock/finance
- URL:
{baseUrl}/api/stock/finance - 方法:
POST - 请求体 JSON(后端
FinanceDataRequest):
{
"stock_code": "000001.SZ",
"start_time": "2024-01-01",
"end_time": "2024-03-31",
"page": 0,
"page_size": 1000
}- 主要返回字段(列表中每条):
stock_code,stock_name,trade_date,close,turnover_rate,turnover_rate_f,volume_ratio,pe,pe_ttm,pb,ps,ps_ttm,dv_ratio,dv_ttm,total_share,float_share,free_share,total_mv,circ_mv等。
适合估值分析、换手率、成交金额、市值等相关问题。
4.0 财务指标报表数据:POST /api/stock/financial_indicator
- URL:
{baseUrl}/api/stock/financial_indicator - 方法:
POST - 请求体 JSON:
{
"stock_code": "600000.SH",
"end_date": "2025-12-31",
"ann_date": "2026-03-28",
"page": 0,
"page_size": 1000
}- 字段说明:
stock_code:股票代码,支持字符串或数组end_date:报告期最后日期,格式YYYY-MM-DDann_date:公告日期,格式YYYY-MM-DDstock_code/end_date/ann_date三选一至少提供一个page从 0 开始,page_size最大 10000- 主要返回字段(实际会返回
stock_financial_indicator全字段): - 基础标识:
stock_code,ann_date,end_date,update_flag,create_time - 盈利能力:
eps,dt_eps,profit_dedt,op_income,ebit,ebitda,gross_margin,grossprofit_margin,netprofit_margin - 资产收益:
roe,roe_dt,roe_yearly,roa,roa_yearly,roic,roic_yearly - 现金与每股:
bps,ocfps,cfps - 偿债能力:
current_ratio,quick_ratio,debt_to_assets - 增长能力:
basic_eps_yoy,netprofit_yoy,dt_netprofit_yoy,tr_yoy,or_yoy,q_sales_yoy,q_netprofit_yoy - 研发投入:
rd_exp - 完整返回字段:返回
stock_financial_indicator全字段(除update_flag、create_time)。
4.0.1 利润表数据:POST /api/stock/income
- URL:
{baseUrl}/api/stock/income - 方法:
POST - 请求体 JSON:
{
"stock_code": "600000.SH",
"end_date": "2025-12-31",
"ann_date": "2026-03-28",
"page": 0,
"page_size": 1000
}- 字段说明:
stock_code:股票代码,支持字符串或数组end_date:报告期最后日期,格式YYYY-MM-DDann_date:公告日期,格式YYYY-MM-DDstock_code/end_date/ann_date三选一至少提供一个page从 0 开始,page_size最大 10000- 完整返回字段:返回
stock_income全字段(除update_flag、create_time)。
4.0.2 资产负债表数据:POST /api/stock/balancesheet
- URL:
{baseUrl}/api/stock/balancesheet - 方法:
POST - 请求参数与
/api/stock/income完全一致(stock_code/end_date/ann_date三选一至少传一个)。 - 完整返回字段:返回
stock_balancesheet全字段(除update_flag、create_time)。
4.0.3 现金流量表数据:POST /api/stock/cashflow
- URL:
{baseUrl}/api/stock/cashflow - 方法:
POST - 请求参数与
/api/stock/income完全一致(stock_code/end_date/ann_date三选一至少传一个)。 - 完整返回字段:返回
stock_cashflow全字段(除update_flag、create_time)。
4.1 主力资金流向明细:POST /api/stock/main_fund_flow
- URL:
{baseUrl}/api/stock/main_fund_flow - 方法:
POST - 请求体 JSON:
{
"start_time": "2026-04-03",
"end_time": "2026-04-03",
"stock_code": ["600000.SH", "000001.SZ"],
"page": 0,
"page_size": 1000
}- 字段说明:
start_time/end_time:交易日期范围,格式YYYY-MM-DD,闭区间;当start_time = end_time时可查询当天数据stock_code:股票代码,支持字符串或数组stock_code和 (start_time+end_time) 至少提供其一page从 0 开始,page_size最大 10000- 分档口径:
- 小单:成交额 < 5万
- 中单:成交额 5万 \~ 20万
- 大单:成交额 20万 \~ 100万
- 特大单:成交额 >= 100万
- 主要返回字段:
trade_date,stock_codebuy_sm_vol,buy_sm_amount,sell_sm_vol,sell_sm_amountbuy_md_vol,buy_md_amount,sell_md_vol,sell_md_amountbuy_lg_vol,buy_lg_amount,sell_lg_vol,sell_lg_amountbuy_elg_vol,buy_elg_amount,sell_elg_vol,sell_elg_amountnet_mf_vol,net_mf_amount
4.2 主力资金流向总览:POST /api/stock/main_fund_flow_overview
- URL:
{baseUrl}/api/stock/main_fund_flow_overview - 方法:
POST - 请求体 JSON:
{
"start_time": "2026-04-03",
"end_time": "2026-04-03",
"stock_code": "600000.SH",
"page": 0,
"page_size": 1000
}- 字段说明:
start_time/end_time:交易日期范围,格式YYYY-MM-DD,闭区间;当start_time = end_time时可查询当天数据stock_code:股票代码,支持字符串或数组stock_code和 (start_time+end_time) 至少提供其一page从 0 开始,page_size最大 10000- 分档口径:
- 小单:成交额 < 5万
- 中单:成交额 5万 \~ 20万
- 大单:成交额 20万 \~ 100万
- 特大单:成交额 >= 100万
- 主要返回字段:
trade_date,stock_code,name,close,pct_changenet_amount,net_amount_ratebuy_elg_amount,buy_elg_amount_ratebuy_lg_amount,buy_lg_amount_ratebuy_md_amount,buy_md_amount_ratebuy_sm_amount,buy_sm_amount_rate
4.3 筹码峰分布:POST /api/stock/cyq_chips
- URL:
{baseUrl}/api/stock/cyq_chips - 方法:
POST - 请求体 JSON:
{
"start_time": "2026-04-03",
"end_time": "2026-04-03",
"stock_code": "600000.SH",
"page": 0,
"page_size": 1000
}- 字段说明:
start_time/end_time:交易日期范围,格式YYYY-MM-DD,闭区间;当start_time = end_time时可查询当天数据stock_code:股票代码,支持字符串或数组stock_code和 (start_time+end_time) 至少提供其一page从 0 开始,page_size最大 10000- 主要返回字段:
trade_date,stock_code,price,percent
4.4 股票基础信息列表:GET /api/stock/list
- URL:
{baseUrl}/api/stock/list - 方法:
GET - Query 参数:
stock_code(可选):精确股票代码筛选page:默认 0page_size:默认 20000- 响应(封装在统一
success结构中): data.totaldata.list:包含stock_code,name,area,industry,list_date,symbol,list_status,delist_date,is_hs等。
当用户只给出股票名称、地区、行业等描述时,可先通过该接口获取匹配列表,再提示用户选择具体代码。
5. 交易日历:GET/POST /api/basic/calendar
- URL:
{baseUrl}/api/basic/calendar - 方法:
GET/POST - 请求参数:
start_time:YYYY-MM-DDend_time:YYYY-MM-DD- 响应:
data为数组,每条含date,is_open(1 为交易日,0 为休市)。
当用户问“某段时间哪些是交易日”“下一个交易日是什么时候”等,可使用此接口。
6. 股票条件搜索:POST /api/stock/search
- URL:
{baseUrl}/api/stock/search - 方法:
POST - Headers:
Content-Type: application/jsonapiKey: <STOCK_API_KEY>- 请求体 JSON:
{
"query": "pe_ttm < 20 且 turnover_rate > 3%",
"stock_code": "000001.SZ",
"date": "2024-01-01",
"page": 0,
"page_size": 100,
"sort_by": "pe_ttm",
"sort_order": "asc"
}- 字段说明:
query(必填):搜索条件,支持自然语言或表达式- 支持格式:
pe_ttm < 20、turnover_rate > 3%、pe_ttm < 20 且 turnover_rate > 3% - 支持中文:
市盈率小于20、换手率大于3% - 支持单位:
circ_mv > 100亿、volume > 1000万 stock_code(可选):精确股票代码筛选date(可选):日期,格式YYYY-MM-DD或MM-DD(默认为当年)- 不提供日期:查询
stock_snapshot_daily(最新实时数据) - 提供日期:查询
stock_finance_daily(历史财务数据) page:页码,从 0 开始page_size:每页数量,最大 1000sort_by(可选):排序字段,如pe_ttm、turnover_ratesort_order(可选):排序方向asc或desc(默认 desc)- 支持的字段:
price/close:股价/收盘价pct_chg:涨跌幅turnover_rate:换手率pe/pe_ttm:市盈率pb:市净率total_mv/circ_mv:总市值/流通市值total_share/float_share:总股本/流通股本volume/turnover:成交量/成交额dividend_ratio:股息率- 响应主体:
data.total:总记录数data.list:符合条件的股票列表
重要提醒:该接口单次请求最多返回 1000 条数据。如需获取更多结果,请使用分页功能。
适用场景:用户需要根据财务指标筛选股票,如"帮我找出 PE<20 的股票"、"换手率大于 5% 的股票有哪些"。
7. 期货数据
- 获取合约基础信息 (`get_future_basic`):获取期货合约的基础信息数据,包括乘数、交割方式、上市日期等。
- 获取主连合约映射 (`get_future_mapping`):获取期货主连或连续合约与实际月合约的映射关系。
- 获取分钟K线数据 (`get_future_minute`):获取期货合约的历史分钟K线数据。
8. 集合竞价数据:POST /api/stock/call_auction
- URL:
{baseUrl}/api/stock/call_auction - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "000001.SZ",
"start_time": "2024-01-01 09:15:00",
"end_time": "2024-01-01 09:25:00",
"page": 0,
"page_size": 100
}- 字段说明:
start_time/end_time:时间范围,支持仅日期(自动补全时间)page_size:最大 10000- 返回字段:
stock_code,name,trade_time,close,open,high,low,pre_close,vol,amount,turnover_rate,pe,pb,pe_ttm,dv_ttm等
重要提醒:单次请求最多返回 10000 条数据。
9. 收盘快照数据:POST /api/stock/closing_snapshot
- URL:
{baseUrl}/api/stock/closing_snapshot - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "000001.SZ",
"start_time": "2024-01-01 15:00:00",
"end_time": "2024-01-01 15:05:00",
"page": 0,
"page_size": 100
}- 返回字段:包含价格、成交量、买卖盘、涨跌幅等完整快照数据
重要提醒:单次请求最多返回 10000 条数据。
10. 股票快照数据(实时/历史):POST /api/stock/snapshot_daily
- URL:
{baseUrl}/api/stock/snapshot_daily - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "000001.SZ",
"date": "2024-01-01",
"page": 0,
"page_size": 10000
}- 特性:
- 实时快照:如果不提供
date或提供今日日期,系统优先从 Redis 缓存读取最新的实时快照数据。 - 历史快照:如果提供历史日期,系统返回当天的历史快照数据。
- 返回字段包含 40+ 个指标:价格、成交量、市值、PE、PB、买卖盘等。
page_size:最大 10000。
重要提醒:这是获取实时行情快照的主要接口。
11. 推送历史数据:POST /api/stock/snapshot_push_history
- URL:
{baseUrl}/api/stock/snapshot_push_history - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 说明:查询 WebSocket 推送历史,返回快照数组
12. 停牌信息:GET /api/stock/suspension
- URL:
{baseUrl}/api/stock/suspension - 方法:
GET - Headers:
apiKey: <STOCK_API_KEY> - Query 参数:
stock_code(可选)trade_date(可选)page,page_size
13. 复权因子:POST /api/stock/adj_factor
- URL:
{baseUrl}/api/stock/adj_factor - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "000001.SZ",
"start_time": "2024-01-01",
"end_time": "2024-01-31",
"page": 0,
"page_size": 10000
}- 返回字段:
stock_code,stock_name,trade_date,factor_a,factor_b(自定义复权因子)
重要提醒:单次请求最多返回 10000 条数据。
14. 数据下载(整日行情):POST /api/stock/daily_dump
- URL:
{baseUrl}/api/stock/daily_dump - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"date": "2024-01-01",
"level": "daily"
}level参数:daily|1min|5min|15min|30min|60min- 返回:gzip 压缩的 JSON 文件(通过 Nginx 高性能下载)
- 限制:
- 只能下载最近 90 天的数据
- 数据量较大,每个用户每个日期每天最多下载 10 次,超过后会被禁止下载该日期三天,请联系客服解封
- 当日数据需收盘后(15:05 后)才能下载
15. 可转债日线数据:POST /api/bond/daily
- URL:
{baseUrl}/api/bond/daily - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "128136.SZ",
"start_time": "2024-01-01",
"end_time": "2024-01-31",
"page": 0,
"page_size": 10000
}- 字段说明:
stock_code(可选):可转债代码,如128136.SZ,支持数组start_time、end_time:格式为YYYY-MM-DD- 返回字段:
stock_code,stock_name,trade_date,open,high,low,close,prev_close,change,pct_chg,factor,vol,amount
单次请求最多返回 10000 条数据。
16. 可转债日指标数据:POST /api/bond/indicator_daily
- URL:
{baseUrl}/api/bond/indicator_daily - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": "128136.SZ",
"start_date": "2024-01-01",
"end_date": "2024-01-31",
"page": 0,
"page_size": 10000
}- 字段说明:
stock_code(可选):可转债代码,支持数组start_date、end_date(可选):日期范围,至少提供一个- 返回字段:
stock_code,stock_name,trade_date,name,pre_close,open,high,low,close,change,pct_chg,vol,amount,remain_size,pure_bond,pure_premium,conv_value,conv_premium等
单次请求最多返回 10000 条数据。
17. 可转债列表:POST /api/bond/list
- URL:
{baseUrl}/api/bond/list - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"bond_code": "128136.SZ",
"stock_code": "000001.SZ",
"exchange": "SZSE",
"page": 0,
"page_size": 10000
}- 字段说明:
bond_code(可选):可转债代码筛选stock_code(可选):正股代码筛选exchange(可选):交易所筛选(SZSE/SSE)- 返回字段:包含
bond_code,bond_name,bond_short_name,conv_code,stock_code,stock_name等完整可转债信息
18. 涨停明细数据:POST /api/stock/limit_up
- URL:
{baseUrl}/api/stock/limit_up - 方法:
POST - Headers:
apiKey: <STOCK_API_KEY> - 请求体 JSON:
{
"stock_code": ["603716.SH", "000001.SZ"],
"start_time": "2026-04-10",
"end_time": "2026-04-10",
"page": 0,
"page_size": 10000
}- 字段说明:
stock_code(可选):股票代码,支持字符串或数组start_time、end_time(必填):日期范围,格式YYYY-MM-DDpage:页码,从 0 开始page_size:每页数量,最大 10000- 返回字段:
- 基础信息:
trade_date,stock_code,stock_name,price,change_percent - 封单信息:
sealed_volume,sealed_amount,sealed_turnover_ratio,sealed_flow_ratio - 涨停过程:
first_limit_time,final_limit_time,open_count,consecutive_days,boards - 业务标签:
limit_type,is_limit_up,reason_text
19. 同花顺热度榜:GET /api/ths/hot / POST /api/ths/hot
- URL:
{baseUrl}/api/ths/hot - 方法:
GET/POST - Headers:
apiKey: <STOCK_API_KEY> - 参数:
market(可选):热榜类型 (默认:热股)。可选值:热股,ETF,可转债,行业板块,概念板块,期货trade_date(可选):指定交易日期,支持YYYY-MM-DD或YYYYMMDD;不传默认返回最新交易日GET使用 Query 参数,POST使用 JSON Body- 返回字段:
trade_date: 交易日期update_time: 排行榜更新时间list: 热榜数据列表,包含name(名称),code(代码),rank(排名),pct_change(涨跌幅%),hot(热度值)
20. 涨跌停推送 WS 订阅:GET {{WS_BASE_URL}}/ws/stream
- URL:
{{WS_BASE_URL}}/ws/stream?token=<STOCK_API_KEY>&types=... - 协议:WebSocket
- 鉴权:Query 参数
token(使用 API Key) - 订阅参数:
types(逗号分隔,支持多选)
- 六类推送与订阅值:
- 涨停推送:
limit_up - 涨停炸板:
limit_up_broken - 涨停股数据推送(聚合):
stock_limit_up(包含limit_up+limit_up_broken) - 跌停推送:
limit_down - 跌停炸板:
limit_down_broken - 跌停股数据推送(聚合):
stock_limit_down(包含limit_down+limit_down_broken)
- 连接示例:
{{WS_BASE_URL}}/ws/stream?token=<STOCK_API_KEY>&types=stock_limit_up,stock_limit_down
- 动态订阅示例:
{"action":"subscribe","types":["stock_limit_up","stock_limit_down"]}- 推送消息示例:
{
"type": "stock_limit_event",
"data": {
"type": "limit_up",
"stock_code": "600000.SH",
"stock_name": "浦发银行",
"change_rate": 10.0,
"source": "fast",
"timestamp": "2026-04-17 11:23:45"
}
}- 字段说明:
- 外层
type固定为stock_limit_event data.type可能值:limit_up/limit_up_broken/limit_down/limit_down_broken- 常见字段:
stock_code,stock_name,change_rate,source,timestamp
调用策略与最佳实践
1. API Key 获取与使用
- 优先从环境变量
STOCK_API_KEY读取(由 OpenClaw 按skills.entries.openclaw-stock-skill.apiKey注入)。 - 若环境变量缺失,可根据用户在 Skill 配置面板中输入的值(通常同样会映射到该环境变量)进行调用。
- 不要在 URL Query 中传递
apiKey或api_key,后端会视为安全风险。
2. 错误处理
code = 401:API Key 无效或缺失,应提示用户检查在 OpenClaw Skill 配置中的 API Key。code = 403:权限不足或下载次数/访问次数限制,应向用户说明权限/限流约束。code = 429:请求过于频繁,需减少调用频率或提示用户稍后再试。
3. 分页与大数据量
- 若
data.total很大,代理应分批分页请求,并在回答中做汇总,而不是一次性获取全部数据。 - 对于分钟级或 tick 级大数据量,应在对话中与用户确认时间范围和精度,避免无谓的海量下载。
4. 单位与精度
- 价格、成交量等字段在后端已经统一保留 2 位小数;如需展示给用户,可直接使用或再格式化。
- 分红相关字段在估值接口中已做 10 年平均等处理,解释时注意说明口径(年化、近 10 年等)。
使用示例(给代理的思路)
- 当用户说:“帮我查一下 000001.SZ 在 2024 年 1 月份的日 K 线”
1. 调用 POST /api/stock/daily,stock_code = "000001.SZ",时间区间为 2024-01-01 至 2024-01-31。 2. 对返回的 data.list 进行整理,总结涨跌幅、最大回撤、平均成交额等。
- 当用户说:“这周哪些天是交易日?”
1. 根据当前日期计算一周范围,调用 GET/POST /api/basic/calendar。 2. 将 is_open = 1 的日期列出,说明哪些是交易日。
本技能不包含额外可执行脚本,完全通过指导代理调用现有 HTTP 接口工作。所有请求都应优先使用 STOCK_API_KEY 环境变量,并遵守上述限流与安全约定。
# API Keys
*.key
*.apikey
.env
.env.local
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# Virtual Environment
venv/
ENV/
env/
# IDE
.vscode/
.idea/
*.swp
*.swo
*~
# OS
.DS_Store
Thumbs.db
{
"slug": "stock-data-api-v1",
"name": "股票数据API",
"tagline": "A股市场数据API - 股票行情、财务、实时数据一站式获取",
"description": "提供完整的 A 股市场数据访问功能,包括日K线、分时数据、财务指标、估值数据、可转债、ETF、港股等。使用前请先访问 https://data.diemeng.chat/ 注册并获取 API Key。",
"category": "finance",
"tags": ["stock", "股票", "finance", "financial data", "market data", "A股", "行情数据", "K线", "可转债", "ETF", "港股"],
"version": "1.0.1",
"license": "MIT",
"pricing": "free",
"repository": "https://github.com/1018466411/openclaw-stock-data-skill",
"homepage": "https://data.diemeng.chat/",
"support": {
"email": "support@diemeng.chat",
"website": "https://data.diemeng.chat/"
},
"screenshots": [],
"demo_video": ""
}
{
"api_key": "在此处填入你的真实 API Key"
}
"""
股票数据 API Skill 使用示例
运行前请确保:
1. 已设置环境变量 STOCK_API_KEY
2. 已安装依赖: pip install requests
"""
import os
from stock_api import (
get_stock_list,
get_daily_data,
get_history_data,
get_finance_data,
get_call_auction,
get_closing_snapshot,
get_trade_calendar,
search_stock_by_name,
get_stock_info
)
def example_get_stock_list():
"""示例:获取股票列表"""
print("=" * 50)
print("示例 1: 获取股票列表")
print("=" * 50)
try:
result = get_stock_list(page_size=5)
print(f"共有 {result['total']} 只股票")
print("\n前5只股票:")
for stock in result['list']:
print(f" {stock['stock_code']}: {stock['name']} - {stock.get('industry', 'N/A')}")
except Exception as e:
print(f"错误: {e}")
def example_search_stock():
"""示例:搜索股票"""
print("\n" + "=" * 50)
print("示例 2: 搜索股票(按名称)")
print("=" * 50)
try:
results = search_stock_by_name("平安")
print(f"找到 {len(results)} 只相关股票:")
for stock in results[:5]:
print(f" {stock['stock_code']}: {stock['name']}")
except Exception as e:
print(f"错误: {e}")
def example_get_daily_data():
"""示例:获取日K线数据"""
print("\n" + "=" * 50)
print("示例 3: 获取日K线数据")
print("=" * 50)
try:
# 获取平安银行最近30天的日K线数据
result = get_daily_data(
stock_code="000001.SZ",
start_time="2024-01-01",
end_time="2024-01-31"
)
print(f"共 {result['total']} 条数据")
print("\n前5条数据:")
for record in result['list'][:5]:
print(f" {record['trade_date']}: "
f"开盘={record['open']}, "
f"收盘={record['close']}, "
f"涨跌幅={record['pct_chg']}%")
except Exception as e:
print(f"错误: {e}")
def example_get_finance_data():
"""示例:获取财务数据"""
print("\n" + "=" * 50)
print("示例 4: 获取财务数据")
print("=" * 50)
try:
result = get_finance_data(
stock_code="600000.SH",
start_time="2024-01-01",
end_time="2024-01-31"
)
print(f"共 {result['total']} 条数据")
if result['list']:
record = result['list'][0]
print(f"\n最新财务数据 ({record['trade_date']}):")
print(f" 收盘价: {record['close']}")
print(f" PE(TTM): {record.get('pe_ttm', 'N/A')}")
print(f" PE百分位: {record.get('pe_ttm_percentile', 'N/A')}%")
print(f" PB: {record.get('pb', 'N/A')}")
print(f" 总市值: {record.get('total_mv', 'N/A')}")
except Exception as e:
print(f"错误: {e}")
def example_get_trade_calendar():
"""示例:获取交易日历"""
print("\n" + "=" * 50)
print("示例 6: 获取交易日历")
print("=" * 50)
try:
calendar = get_trade_calendar(
start_time="2024-01-01",
end_time="2024-01-31"
)
print(f"共 {len(calendar)} 天")
trading_days = [d for d in calendar if d['is_open'] == 1]
print(f"其中交易日: {len(trading_days)} 天")
print("\n前10天:")
for day in calendar[:10]:
status = "交易" if day['is_open'] == 1 else "休市"
print(f" {day['date']}: {status}")
except Exception as e:
print(f"错误: {e}")
def main():
"""运行所有示例"""
print("\n" + "=" * 50)
print("股票数据 API Skill 使用示例")
print("=" * 50)
print("\n提示: 请确保已设置环境变量 STOCK_API_KEY")
print("获取 API Key: https://data.diemeng.chat/\n")
# 检查 API Key
if not os.getenv("STOCK_API_KEY"):
print("❌ 错误: 未设置环境变量 STOCK_API_KEY")
print("\n请执行以下命令设置 API Key:")
print(" Linux/macOS: export STOCK_API_KEY='your_api_key'")
print(" Windows PowerShell: $env:STOCK_API_KEY='your_api_key'")
print(" Windows CMD: set STOCK_API_KEY=your_api_key")
print("\n获取 API Key: https://data.diemeng.chat/")
return
# 运行示例
example_get_stock_list()
example_search_stock()
example_get_daily_data()
example_get_finance_data()
example_get_trade_calendar()
print("\n" + "=" * 50)
print("示例运行完成!")
print("=" * 50)
if __name__ == "__main__":
main()
GitHub 推送指南
📦 推送到 GitHub
1. 创建 GitHub 仓库
1. 登录 GitHub 2. 点击右上角 "+" → "New repository" 3. 填写仓库信息:
- Repository name:
openclaw-stock-data-skill或stock-data-api-skill - Description:
股票数据 API Skill for OpenClaw - 提供完整的A股市场数据访问功能 - Visibility: Public(推荐,便于分享)
- 不要勾选 "Initialize with README"(我们已经有了)
4. 点击 "Create repository"
2. 初始化并推送代码
在项目目录下执行:
# 初始化 Git 仓库
git init
# 添加所有文件
git add .
# 提交
git commit -m "Initial commit: OpenClaw Stock Data API Skill v1.0.0"
# 添加远程仓库(替换 YOUR_USERNAME 为你的 GitHub 用户名)
git remote add origin https://github.com/YOUR_USERNAME/openclaw-stock-data-skill.git
# 推送到 GitHub
git branch -M main
git push -u origin main3. 更新 skill.json 中的仓库地址
推送成功后,更新 skill.json 中的 repository.url 字段:
"repository": {
"type": "git",
"url": "https://github.com/YOUR_USERNAME/openclaw-stock-data-skill.git"
}🎯 提交到 OpenClaw Skills 生态
根据 OpenClaw 的生态规范,你可以通过以下方式让更多人使用你的 skill:
方式一:通过 ClawHub 平台
1. 访问 OpenClaw 的 ClawHub 或 Skills 管理平台 2. 提交你的 skill 信息,包括:
- GitHub 仓库地址
- skill.json 配置
- 功能描述
方式二:提交到官方 Skills 仓库
如果 OpenClaw 有官方的 skills 仓库(如 openclaw/skills),可以:
1. Fork 官方 skills 仓库 2. 在你的 fork 中添加你的 skill 3. 提交 Pull Request
方式三:在社区分享
- 在 OpenClaw 相关论坛、社区分享你的 skill
- 在 README 中添加使用说明和示例
- 添加 GitHub Topics 标签:
openclaw,skill,stock,finance,api
📝 GitHub 仓库优化建议
1. 添加 Topics 标签
在 GitHub 仓库页面点击 ⚙️ 图标,添加以下标签:
openclawopenclaw-skillstock-apifinancepythonapi股票数据a股
2. 添加 GitHub Actions(可选)
可以添加 CI/CD 流程,自动测试和发布:
# .github/workflows/test.yml
name: Test
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
with:
python-version: '3.8'
- run: pip install -r requirements.txt
- run: python -m pytest # 如果有测试3. 添加 Issue 模板
创建 .github/ISSUE_TEMPLATE/bug_report.md 和 feature_request.md 便于用户反馈。
🔒 安全检查清单
推送前请确认:
- ✅
.gitignore已包含.env、*.key等敏感文件 - ✅ 代码中没有硬编码的 API Key
- ✅ README 中明确说明需要用户自己注册获取 API Key
- ✅ 没有包含任何真实的 API Key 或密钥
📊 推广建议
1. 完善文档:确保 README 清晰易懂 2. 添加示例:提供完整的使用示例 3. 添加截图:如果有 UI,添加使用截图 4. 版本管理:使用语义化版本号(Semantic Versioning) 5. 更新日志:维护 CHANGELOG.md 记录版本更新
🔗 相关资源
---
提示:推送后记得更新 skill.json 中的仓库地址,这样其他用户就能找到你的项目了!
股票数据 API Skill for OpenClaw
这是一个为 OpenClaw 等 Agent 工具设计的股票数据 Skill,提供了 A 股市场及周边资产的完整数据访问能力。
📥 安装方法
npx skills add https://github.com/1018466411/openclaw-stock-data-skill安装时按提示选择: 1. 选择 openclaw 2. 选择 global 应用于所有 Agent 3. Copy to all agents: yes
📋 数据分类概览
2. 股票实时数据
- 实时行情快照(价格、五档盘口等)、集合竞价、推送历史、停牌信息等
- 典型函数:
get_stock_snapshot_daily(实时快照)、get_call_auction、get_basic_snapshot(集合竞价快照)、get_stock_snapshot_push_history等
3. 股票历史数据
- 日 K 线(前复权/不复权)、分钟级历史、日度财务因子、主力资金流向、复权因子、历史快照等
- 典型函数:
get_daily_data、get_history_data、get_finance_data、get_financial_indicator、get_main_fund_flow、get_main_fund_flow_overview、get_cyq_chips、get_daily_adj_data、get_adj_factor等
3. 可转债历史和实时数据
- 可转债日线、分钟级行情、日度指标(纯债价值、转股溢价等)、收盘快照、基础列表等
- 典型函数:
get_bond_daily、get_bond_history、get_bond_indicator_daily、get_bond_closing_snapshot、get_bond_list等
4. ETF 数据
- ETF 列表数据
- ETF 日线与分钟级历史行情
- 典型函数:
get_etf_list、get_etf_daily、get_etf_history
5. 指数历史数据
- 指数分钟级历史行情(支持多种时间粒度)、同花顺指数日线数据等
- 典型函数:
get_index_history、get_index_realtime_history、get_ths_daily、get_ths_sector_categories、get_ths_constituent_stocks、get_dc_blocks、get_dc_block_stocks、get_dc_daily
6. 龙虎榜数据
- 龙虎榜机构明细与每日明细数据
- 典型函数:
get_dragon_tiger,get_top_list
7. WebSocket 实时快照
- 通过 WebSocket 协议实时推送全市场股票快照
- 支持 Gzip 压缩,JSON 格式,字段简写(cd, lp, vo, etc.)
- 连接地址:
wss://data.diemeng.chat/ws/stock/snapshot?token=YOUR_API_KEY
此外还提供 条件搜索等高级能力,详见stock_api.py与skill.json。
🚀 快速开始
1. 获取正确的 API Key 并在 Header 中验证
【必须注意】: 1. 一定要获取到正确的 apiKey 才可以调用接口。 2. 获取途径: 你可以通过 config.json 文件、系统环境变量(如 STOCK_API_KEY)或直接配置的参数中获取。 3. 接口域名: 默认接口的域名是 data.diemeng.chat,如果是海外 IP 则访问 `mg.diemeng.chat`。 4. Header 认证: apiKey 必须放到请求的 header 里面进行验证,格式如下:
headers = {
"apiKey": "YOUR_API_KEY",
"Content-Type": "application/json"
}1. 访问 https://data.diemeng.chat/(海外请访问 https://mg.diemeng.chat/) 2. 注册新账号或登录现有账号 3. 在 个人中心 / 权限或套餐管理 中,按需开通以下数据大类的访问权限:
- 股票历史数据(行情、财务、估值等)
- 股票实时数据(集合竞价、基础快照等)
- 可转债数据(历史 & 实时)
- ETF 数据
- 指数历史数据
4. 在 API 管理 中创建并复制您的 API Key
如果未为某一类接口开通权限或传入了错误的 apiKey,即使配置了 API Key,也会收到 403 或权限不足的错误。
2. 在 Skill 页面配置 API Key(推荐)
在 OpenClaw / ClawHub 中启用本 Skill 时:
1. 打开 openclaw-stock-skill 的 Skill 配置页面 2. 在参数面板中将从 data.diemeng.chat 获取的 API Key 填入对应字段(通常是 apiKey 或 STOCK_API_KEY) 3. 保存后,网关会自动将该值注入到运行环境中(映射为 STOCK_API_KEY 环境变量)
这样使用本 Skill 时,无需在本机手动配置环境变量。
3. (可选)在本地代码中直接使用 API Key
如果你在自己的 Python 项目中直接使用 stock_api.py,可以按以下方式配置:
方式一:配置文件(推荐用于 Linux 无界面环境)
在代码同级目录下创建一个名为 config.json 的文件(可复制 config.json.template),内容如下:
{
"api_key": "your_api_key_here"
}方式二:环境变量
# Linux/macOS
export STOCK_API_KEY="your_api_key_here"
# Windows PowerShell
$env:STOCK_API_KEY="your_api_key_here"
# Windows CMD
set STOCK_API_KEY=your_api_key_here方式三:在代码中设置
import os
os.environ["STOCK_API_KEY"] = "your_api_key_here"4. 安装依赖
pip install requests或使用 requirements.txt:
pip install -r requirements.txt📖 使用示例
基本使用
from stock_api import get_stock_list, get_daily_data, search_stock_by_name
# 1. 获取股票列表
stocks = get_stock_list(page_size=10)
print(f"共有 {stocks['total']} 只股票")
for stock in stocks['list']:
print(f"{stock['stock_code']}: {stock['name']}")
# 2. 搜索股票
results = search_stock_by_name("平安")
for stock in results:
print(f"{stock['stock_code']}: {stock['name']}")
# 3. 获取日K线数据
daily_data = get_daily_data(
stock_code="600000.SH",
start_time="2024-01-01",
end_time="2024-01-31",
vol_type="share" # 可选: "share"(股,默认) / "lot"(手)
)
print(f"共 {daily_data['total']} 条数据")
for record in daily_data['list'][:5]:
print(f"{record['trade_date']}: 收盘价 {record['close']}")获取多只股票数据
from stock_api import get_daily_data
# 同时查询多只股票
data = get_daily_data(
stock_code=["600000.SH", "000001.SZ", "000002.SZ"],
start_time="2024-01-01",
end_time="2024-01-31"
)获取历史分时数据(股票分钟级)
from stock_api import get_history_data
# 获取5分钟级别数据
data = get_history_data(
stock_code="600000.SH",
level="5min",
start_time="2024-01-15 09:30:00",
end_time="2024-01-15 15:00:00"
)说明:get_history_data 的 stock_code 仅支持单个字符串,不支持数组。
获取实时分时数据(支持最近7天内)
from stock_api import get_realtime_history
# 建议使用定时任务按时间拉取,一次获取全市场一分钟的数据
# 定时任务建议在每分钟的 2-5 秒后拉取上一分钟数据,15秒后可复拉一次确保准确性
data = get_realtime_history(
trade_time="2026-03-15 09:31:00"
)获取财务数据(股票日度因子)
from stock_api import get_finance_data
# 获取财务指标
finance = get_finance_data(
stock_code="600000.SH",
start_time="2024-01-01",
end_time="2024-01-31"
)
for record in finance['list']:
print(f"日期: {record['trade_date']}")
print(f"PE(TTM): {record['pe_ttm']}")
print(f"PE百分位: {record.get('pe_ttm_percentile')}%")
print(f"PB: {record['pb']}")
print(f"总市值: {record['total_mv']}")获取财务指标报表数据(stock_financial_indicator)
from stock_api import get_financial_indicator
indicator = get_financial_indicator(
stock_code="600000.SH",
end_date="2025-12-31",
page=0,
page_size=100
)
for record in indicator['list']:
print(f"代码: {record['stock_code']}")
print(f"公告日: {record['ann_date']}")
print(f"报告期: {record['end_date']}")
print(f"EPS: {record['eps']}")获取主力资金流向数据
from stock_api import get_main_fund_flow, get_main_fund_flow_overview, get_cyq_chips
# 1. 获取大小单资金金流向
detail = get_main_fund_flow(
start_time="2026-04-03",
end_time="2026-04-03",
stock_code=["600000.SH", "000001.SZ"],
page=0,
page_size=200
)
# 2. 获取主力资金流向总览
overview = get_main_fund_flow_overview(
start_time="2026-04-03",
end_time="2026-04-03",
page=0,
page_size=200
)
# 3. 获取筹码峰分布
chips = get_cyq_chips(
start_time="2026-04-03",
end_time="2026-04-03",
stock_code="600000.SH",
page=0,
page_size=200
)获取可转债数据
from stock_api import (
get_bond_daily,
get_bond_history,
get_bond_indicator_daily,
)
# 1. 获取可转债日线数据
daily = get_bond_daily(
stock_code="110031.SH",
start_time="2024-01-01",
end_time="2024-01-31",
)
# 2. 获取可转债 5 分钟级历史数据
history = get_bond_history(
stock_code="110031.SH",
level="5min",
start_time="2024-01-02 09:30:00",
end_time="2024-01-02 15:00:00",
)
# 3. 获取可转债日度指标(纯债价值、转股溢价等)
indicator = get_bond_indicator_daily(
stock_code="110031.SH",
start_date="2024-01-01",
end_date="2024-01-31",
)获取 ETF 数据
from stock_api import get_etf_list, get_etf_daily, get_etf_history
# 1. 获取 ETF 列表
etf_list = get_etf_list()
print(etf_list)
# 2. 获取 ETF 日线数据
etf_daily = get_etf_daily(
stock_code="510300.SH",
start_time="2024-01-01",
end_time="2024-01-31",
)
# 2. 获取 ETF 5 分钟级历史数据
etf_history = get_etf_history(
stock_code="510300.SH",
level="5min",
start_time="2024-01-02 09:30:00",
end_time="2024-01-02 15:00:00",
)获取指数历史数据
from stock_api import get_index_history, get_index_realtime_history
# 1. 获取指数 1 分钟级历史数据
index_history = get_index_history(
index_code="000300.SH", # 沪深 300 指数
level="1min",
start_time="2024-01-02 09:30:00",
end_time="2024-01-02 15:00:00",
)
# 2. 获取实时 1 分钟级别分时数据(仅限当天)
index_realtime = get_index_realtime_history(
index_code="000001.SH"
)
print("上证指数当天实时分时数据:", index_realtime)🔧 API 接口说明
股票代码格式
- 上海:
600000.SH、688000.SH - 深圳:
000001.SZ、300000.SZ - 北京:
430000.BJ、830000.BJ
时间格式
- 日期:
YYYY-MM-DD,例如2024-01-15 - 日期时间:
YYYY-MM-DD HH:MM:SS,例如2024-01-15 09:30:00
分时级别
1min- 1分钟5min- 5分钟(默认)15min- 15分钟30min- 30分钟60min- 60分钟
📚 完整 API 文档
更多详细的 API 文档请访问:https://data.diemeng.chat/
⚠️ 注意事项
1. API Key 安全:请妥善保管您的 API Key,不要将其提交到公开代码仓库 2. 请求频率:请注意 API 的请求频率限制,避免过于频繁的请求 3. 数据范围:部分接口支持查询全市场数据,但建议使用分页参数控制返回数量 4. 错误处理:所有函数在出错时会抛出异常,请做好异常处理
🐛 常见问题
Q: 提示 "未找到 API Key"
A: 请确保已设置环境变量 STOCK_API_KEY,或访问 https://data.diemeng.chat/ 注册并获取 API Key。
Q: 返回 401 未授权错误
A: 请检查 API Key 是否正确,并确保已在个人中心激活 API 访问权限。
Q: 返回 403 权限不足
A: 您的账号可能没有访问该接口的权限,请检查您的账号权限设置。
Q: 如何获取更多数据?
A: 使用 page 和 page_size 参数进行分页查询,或联系管理员提升账号权限。
📝 更新日志
v1.0.0 (2024-01-XX)
- 初始版本发布
- 支持股票列表、日K线、历史分时、财务数据等核心功能
- 支持股票搜索查询
📄 许可证
MIT License
🔗 相关链接
- API 文档:https://data.diemeng.chat/
- 注册账号:https://data.diemeng.chat/
- GitHub 仓库:查看项目源码(创建仓库后更新此链接)
- GitHub 推送指南:GITHUB.md
📤 推送到 GitHub
是的,建议推送到 GitHub! OpenClaw 有官方的 Skills 生态,你可以:
1. 推送到个人 GitHub 仓库 - 便于版本控制和分享 2. 提交到 OpenClaw Skills 生态 - 让更多用户发现和使用你的 skill 3. 通过 ClawHub 平台发布 - OpenClaw 的官方 Skills 管理平台
详细步骤请查看 GITHUB.md 文件。
---
重要提示:使用本 Skill 前,请务必访问 https://data.diemeng.chat/ 注册并获取 API Key!(海外请访问 https://mg.diemeng.chat/)
requests>=2.31.0
"""
股票数据 API Skill for OpenClaw
该 skill 提供了访问股票数据的完整功能,包括:
- 股票列表查询
- 日K线数据
- 历史分时数据
- 财务数据
- 实时数据(竞价、收盘快照)
使用前请确保:
1. 已在 https://data.diemeng.chat/ 注册账号
2. 已获取 API Key
3. 设置环境变量 STOCK_API_KEY 或在代码中配置
"""
import os
import json
import requests
from typing import Optional, List, Dict, Any, Union
from datetime import datetime, timedelta
# API 基础配置
API_DOMAIN = os.getenv("STOCK_API_DOMAIN", "data.diemeng.chat")
# 如果是海外 IP,建议设置环境变量 STOCK_API_DOMAIN="mg.diemeng.chat"
BASE_URL = f"https://{API_DOMAIN}/api"
API_KEY_ENV = "STOCK_API_KEY"
CONFIG_FILE = "config.json"
def get_api_key() -> str:
"""
获取 API Key
优先级:
1. 配置的参数获取(如果在 Skill 初始化或函数调用时直接传入,暂不在此处理)
2. 环境变量 STOCK_API_KEY
3. 当前目录下的 config.json 文件中的 api_key 字段
一定要获取到正确的 apiKey 才可以调用接口。
接口的域名是 data.diemeng.chat,如果是海外 IP 则访问 mg.diemeng.chat。
apiKey 需要放到 header 里面:
headers = {
"apiKey": "YOUR_API_KEY",
"Content-Type": "application/json"
}
"""
# 1. 尝试从环境变量读取
api_key = os.getenv(API_KEY_ENV)
if api_key:
return api_key
# 2. 尝试从配置文件读取
config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), CONFIG_FILE)
if os.path.exists(config_path):
try:
with open(config_path, 'r', encoding='utf-8') as f:
config = json.load(f)
api_key = config.get('api_key')
if api_key:
return api_key
except Exception as e:
print(f"Warning: 读取配置文件 {CONFIG_FILE} 失败: {e}")
# 3. 未找到,抛出异常,强调必须获取正确的 apiKey
raise ValueError(
f"【错误】一定要获取到正确的 apiKey 才可以调用接口!\n"
f"获取 apiKey 途径:\n"
f"1. 配置环境变量 {API_KEY_ENV}\n"
f"2. 在同级目录下创建 {CONFIG_FILE} 文件,内容为: {{\"api_key\": \"YOUR_API_KEY\"}}\n"
f"3. 访问 https://data.diemeng.chat/ 注册并获取 API Key\n\n"
f"请注意:接口的域名是 data.diemeng.chat,如果是海外 IP 则访问 mg.diemeng.chat。\n"
f"apiKey 会被放到 header 里面: {{\"apiKey\": \"YOUR_API_KEY\", \"Content-Type\": \"application/json\"}}"
)
def _make_request(
method: str,
endpoint: str,
headers: Optional[Dict] = None,
params: Optional[Dict] = None,
json_data: Optional[Dict] = None,
) -> Dict[str, Any]:
"""
发送 HTTP 请求的通用方法
必须获取到正确的 apiKey 才可以调用接口,
接口的域名是 data.diemeng.chat,如果是海外 IP 则访问 mg.diemeng.chat,
apiKey 放到 header 里面:
headers = {
"apiKey": "YOUR_API_KEY",
"Content-Type": "application/json"
}
Args:
method: HTTP 方法 (GET, POST)
endpoint: API 端点路径
headers: 请求头
params: URL 参数(GET 请求)
json_data: JSON 数据(POST 请求)
Returns:
API 响应数据
"""
# 一定要获取到正确的 apiKey 才可以调用接口
api_key = get_api_key()
if not api_key:
raise ValueError("一定要获取到正确的 apiKey 才可以调用接口!")
url = f"{BASE_URL}{endpoint}"
# apikey放到header里面
request_headers = {
"apiKey": api_key,
"Content-Type": "application/json"
}
if headers:
request_headers.update(headers)
try:
if method.upper() == "GET":
response = requests.get(url, headers=request_headers, params=params, timeout=30)
elif method.upper() == "POST":
response = requests.post(url, headers=request_headers, json=json_data, timeout=30)
else:
raise ValueError(f"不支持的 HTTP 方法: {method}")
response.raise_for_status()
result = response.json()
if result.get("code") != 200:
msg = result.get('msg', '未知错误')
if result.get("code") == 403:
msg += " (权限不足,请访问 https://data.diemeng.chat/ 开通对应权限)"
raise Exception(f"API 错误: {msg}")
return result.get("data", {})
except requests.exceptions.RequestException as e:
if e.response is not None and e.response.status_code == 403:
raise Exception("权限不足 (HTTP 403): 请访问 https://data.diemeng.chat/ 开通对应权限")
raise Exception(f"请求失败: {str(e)}")
# ==================== 股票列表相关 ====================
def get_stock_list(
stock_code: Optional[str] = None,
page: int = 0,
page_size: int = 20000
) -> Dict[str, Any]:
"""
获取股票列表
Args:
stock_code: 股票代码(可选,用于筛选)
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
params = {
"page": page,
"page_size": page_size
}
if stock_code:
params["stock_code"] = stock_code
return _make_request("GET", "/stock/list", params=params)
# ==================== 行情数据相关 ====================
def get_daily_data(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
vol_type: str = "share",
page: int = 0,
page_size: int = 60000
) -> Dict[str, Any]:
"""
获取日K线数据
Args:
stock_code: 股票代码,支持单个字符串或列表,例如 "600000.SH" 或 ["600000.SH", "000001.SZ"]
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
vol_type: 成交量单位,share(股,默认) 或 lot(手)
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
# 默认查询最近30天
end_time = datetime.now().strftime("%Y-%m-%d")
start_time = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
payload = {
"start_time": start_time,
"end_time": end_time,
"volType": vol_type,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/daily", json_data=payload)
def get_hk_daily(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
vol_type: str = "share",
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取港股日K线数据
"""
if not start_time or not end_time:
end_time = datetime.now().strftime("%Y-%m-%d")
start_time = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
payload = {
"start_time": start_time,
"end_time": end_time,
"volType": vol_type,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/hk/daily", json_data=payload)
def get_kline_data(
period: str,
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取周期K线数据 (周K、月K)
Args:
period: 周期,可选值: "weekly", "monthly"
stock_code: 股票代码,支持单个字符串或列表,例如 "600000.SH" 或 ["600000.SH", "000001.SZ"]
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
end_time = datetime.now().strftime("%Y-%m-%d")
if period == "monthly":
start_time = (datetime.now() - timedelta(days=365)).strftime("%Y-%m-%d")
else:
start_time = (datetime.now() - timedelta(days=180)).strftime("%Y-%m-%d")
payload = {
"period": period,
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/kline", json_data=payload)
def get_kline_adj_data(
period: str,
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
algo: str = "recursive",
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取复权周期K线数据 (周K、月K)
Args:
period: 周期,可选值: "weekly", "monthly"
stock_code: 股票代码,支持单个字符串或列表
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
algo: 复权算法,可选值: "recursive", "factor"
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
end_time = datetime.now().strftime("%Y-%m-%d")
if period == "monthly":
start_time = (datetime.now() - timedelta(days=365)).strftime("%Y-%m-%d")
else:
start_time = (datetime.now() - timedelta(days=180)).strftime("%Y-%m-%d")
payload = {
"period": period,
"start_time": start_time,
"end_time": end_time,
"algo": algo,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/kline_adj", json_data=payload)
def get_history_data(
stock_code: Optional[str] = None,
level: str = "5min",
start_time: str = None,
end_time: str = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取历史分时数据
Args:
stock_code: 股票代码,仅支持单个字符串
level: 时间级别,可选值: "1min", "5min", "15min", "30min", "60min"
start_time: 开始时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
end_time: 结束时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
# 默认查询今天
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = datetime.now().strftime("%Y-%m-%d 00:00:00")
payload = {
"level": level,
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/history", json_data=payload)
def get_realtime_history(
stock_code: Optional[str] = None,
trade_time: Optional[str] = None,
date: Optional[str] = None
) -> Dict[str, Any]:
"""
获取实时分时数据 (实时 1 分钟级别分时数据,支持最近7天内)。
返回数据会根据 stock_code + trade_time 进行去重。注意:stock_code 或 trade_time 至少提供一个。
调用建议(定时任务拉取全市场数据):
1. 建议使用时间 (trade_time) 来获取实时分时,一次可以获取某一分钟的全市场数据。
2. 使用定时任务来获取数据,每分钟获取上一分钟的数据。
3. 建议在每分钟的 2 到 5 秒后开始获取。
4. 如果获取不到,建议暂停 1 秒后继续获取,最多重试不要超过 60 次,避免陷入死循环。
5. 建议在每分钟 15 秒之后再调用接口更新一次数据,确保数据的准确性。
Args:
stock_code: 股票代码,如 600000.SH (必须提供 stock_code 或 trade_time 之一)
trade_time: 交易时间,如 2026-03-15 09:31:00 (必须提供 stock_code 或 trade_time 之一)
date: 日期,格式 YYYY-MM-DD,默认今天,支持查询最近7天内的数据
"""
if not stock_code and not trade_time:
raise ValueError("必须提供 stock_code 或 trade_time 之一")
payload = {}
if stock_code:
payload["stock_code"] = stock_code
if trade_time:
payload["trade_time"] = trade_time
if date:
payload["date"] = date
return _make_request("POST", "/realtime/history", json_data=payload)
# ==================== 财务数据相关 ====================
def get_finance_data(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取每日财务数据
Args:
stock_code: 股票代码,支持单个字符串或列表
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典,包含 PE、PB、PS、市值、PE百分位等财务指标
"""
if not start_time or not end_time:
# 默认查询最近30天
end_time = datetime.now().strftime("%Y-%m-%d")
start_time = (datetime.now() - timedelta(days=30)).strftime("%Y-%m-%d")
payload = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/finance", json_data=payload)
def get_financial_indicator(
stock_code: Optional[Union[str, List[str]]] = None,
end_date: Optional[str] = None,
ann_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not end_date and not ann_date:
raise ValueError("必须提供 stock_code 或 end_date 或 ann_date 之一")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if end_date:
payload["end_date"] = end_date
if ann_date:
payload["ann_date"] = ann_date
return _make_request("POST", "/stock/financial_indicator", json_data=payload)
def get_income_statement(
stock_code: Optional[Union[str, List[str]]] = None,
end_date: Optional[str] = None,
ann_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not end_date and not ann_date:
raise ValueError("必须提供 stock_code 或 end_date 或 ann_date 之一")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if end_date:
payload["end_date"] = end_date
if ann_date:
payload["ann_date"] = ann_date
return _make_request("POST", "/stock/income", json_data=payload)
def get_balancesheet(
stock_code: Optional[Union[str, List[str]]] = None,
end_date: Optional[str] = None,
ann_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not end_date and not ann_date:
raise ValueError("必须提供 stock_code 或 end_date 或 ann_date 之一")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if end_date:
payload["end_date"] = end_date
if ann_date:
payload["ann_date"] = ann_date
return _make_request("POST", "/stock/balancesheet", json_data=payload)
def get_cashflow_statement(
stock_code: Optional[Union[str, List[str]]] = None,
end_date: Optional[str] = None,
ann_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not end_date and not ann_date:
raise ValueError("必须提供 stock_code 或 end_date 或 ann_date 之一")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if end_date:
payload["end_date"] = end_date
if ann_date:
payload["ann_date"] = ann_date
return _make_request("POST", "/stock/cashflow", json_data=payload)
def get_main_fund_flow(
start_time: Optional[str] = None,
end_time: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/main_fund_flow", json_data=payload)
def get_main_fund_flow_overview(
start_time: Optional[str] = None,
end_time: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/main_fund_flow_overview", json_data=payload)
def get_cyq_chips(
start_time: Optional[str] = None,
end_time: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/cyq_chips", json_data=payload)
def get_report_rc(
stock_code: Optional[str] = None,
report_date: Optional[str] = None,
start_date: Optional[str] = None,
end_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取券商盈利预测数据。
"""
if (start_date and not end_date) or (end_date and not start_date):
raise ValueError("start_date 和 end_date 需要同时传入")
if not stock_code and not report_date and not (start_date and end_date):
raise ValueError("stock_code、report_date、(start_date+end_date) 至少传一个条件")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if report_date:
payload["report_date"] = report_date
if start_date:
payload["start_date"] = start_date
if end_date:
payload["end_date"] = end_date
return _make_request("POST", "/stock/report_rc", json_data=payload)
def get_holder_number(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取股东人数数据。
"""
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if isinstance(stock_code, list):
raise ValueError("get_history_data 的 stock_code 仅支持单个字符串,不支持数组")
if stock_code:
payload["stock_code"] = stock_code
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
return _make_request("POST", "/stock/holder_number", json_data=payload)
def get_pledge_stat(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取股票质押统计数据。
"""
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
return _make_request("POST", "/stock/pledge_stat", json_data=payload)
def get_margin_detail(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取融资融券明细数据。
"""
if not stock_code and not (start_time and end_time):
raise ValueError("必须提供 stock_code 或 (start_time + end_time) 至少一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if start_time and end_time:
payload["start_time"] = start_time
payload["end_time"] = end_time
return _make_request("POST", "/stock/margin_detail", json_data=payload)
# ==================== 实时数据相关 ====================
def get_call_auction(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取集合竞价数据
Args:
stock_code: 股票代码,支持单个字符串或列表
start_time: 开始时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
end_time: 结束时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
# 默认查询今天
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = datetime.now().strftime("%Y-%m-%d 00:00:00")
payload = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/call_auction", json_data=payload)
def get_closing_snapshot(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = None,
end_time: str = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取收盘快照数据
Args:
stock_code: 股票代码,支持单个字符串或列表
start_time: 开始时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
end_time: 结束时间,格式 YYYY-MM-DD 或 YYYY-MM-DD HH:MM:SS
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
if not start_time or not end_time:
# 默认查询今天
end_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
start_time = datetime.now().strftime("%Y-%m-%d 00:00:00")
payload = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/closing_snapshot", json_data=payload)
# ==================== 基础数据相关 ====================
def get_trade_calendar(
start_time: str,
end_time: str
) -> List[Dict[str, Any]]:
"""
获取交易日历
Args:
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
Returns:
交易日历列表,包含 date 和 is_open 字段
"""
params = {
"start_time": start_time,
"end_time": end_time
}
return _make_request("GET", "/basic/calendar", params=params)
# ==================== 辅助函数 ====================
def search_stock_by_name(name: str) -> List[Dict[str, Any]]:
"""
根据股票名称搜索股票
Args:
name: 股票名称(支持模糊匹配)
Returns:
匹配的股票列表
"""
result = get_stock_list(page_size=20000)
stocks = result.get("list", [])
# 简单模糊匹配
matched = [
stock for stock in stocks
if name.lower() in stock.get("name", "").lower()
]
return matched
def get_stock_info(stock_code: str) -> Optional[Dict[str, Any]]:
"""
获取单个股票的详细信息
Args:
stock_code: 股票代码,例如 "600000.SH"
Returns:
股票信息字典,如果未找到返回 None
"""
result = get_stock_list(stock_code=stock_code, page_size=1)
stocks = result.get("list", [])
if stocks:
return stocks[0]
return None
# ==================== 复权与复权因子相关 ====================
def get_daily_adj_data(
stock_code: Optional[str] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
algo: str = "recursive",
vol_type: str = "share",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取复权日K线数据(前复权)。
注意:后端要求必须至少提供 `stock_code` 或 (`start_time` 与 `end_time`) 之一。
"""
payload: Dict[str, Any] = {
"algo": algo,
"volType": vol_type,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if start_time:
payload["start_time"] = start_time
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/stock/daily_adj", json_data=payload)
def get_adj_factor(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取自定义复权因子(递归算法因子),用于本地自行复权处理。
Args:
stock_code: 单个股票代码或股票代码列表
start_time: 开始日期 YYYY-MM-DD(必填)
end_time: 结束日期 YYYY-MM-DD(必填)
page: 页码
page_size: 每页数量,最大 10000
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/adj_factor", json_data=payload)
# ==================== 条件搜索相关 ====================
def search_stock_by_condition(
query: str,
stock_code: Optional[str] = None,
date: Optional[str] = None,
page: int = 0,
page_size: int = 10,
sort_by: Optional[str] = None,
sort_order: Optional[str] = None,
) -> Dict[str, Any]:
"""
按条件搜索股票(支持中文/英文条件,如“pe_ttm < 20 且 turnover_rate > 3%”)。
Args:
query: 条件表达式,支持中文描述与 AND/OR 组合
stock_code: 可选,限制在某一只股票内筛选
date: 可选,YYYY-MM-DD 或 MM-DD;为空时为最新快照
page: 页码,从 0 开始
page_size: 每页数量,默认 10,最大 1000
sort_by: 排序字段
sort_order: 排序方向 asc/desc
"""
payload: Dict[str, Any] = {
"query": query,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if date:
payload["date"] = date
if sort_by:
payload["sort_by"] = sort_by
if sort_order:
payload["sort_order"] = sort_order
return _make_request("POST", "/stock/search", json_data=payload)
def get_stock_search_fields() -> Dict[str, Any]:
"""
获取条件搜索支持的字段列表和示例。
"""
return _make_request("GET", "/stock/search/fields")
# ==================== 基础快照与停牌信息 ====================
def get_stock_suspension(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取股票停牌信息。
"""
params: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if stock_code:
params["stock_code"] = stock_code
if start_time:
params["start_time"] = start_time
if end_time:
params["end_time"] = end_time
return _make_request("GET", "/stock/suspension", params=params)
def upload_stock_suspension_token(
data: List[Dict[str, Any]],
admin_token: str
) -> Dict[str, Any]:
"""
通过Token验证方式批量上传股票停牌数据,仅供后端或数据脚本使用。
"""
payload: Dict[str, Any] = {
"data": data
}
headers = {
"X-Admin-Token": admin_token,
"Content-Type": "application/json"
}
return _make_request("POST", "/data/suspension/import_token", json_data=payload, headers=headers)
def get_st_info(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000
) -> Dict[str, Any]:
"""
获取ST信息
Args:
stock_code: 股票代码,支持单个字符串或列表
start_time: 开始日期,格式 YYYY-MM-DD
end_time: 结束日期,格式 YYYY-MM-DD
page: 页码,从0开始
page_size: 每页数量
Returns:
包含 total 和 list 的字典
"""
payload = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if start_time:
payload["start_time"] = start_time
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/stock/st_info", json_data=payload)
def get_stock_limit_list(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取股票涨跌停数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 和 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/limit_list", json_data=payload)
# ==================== 股票快照历史 ====================
def get_stock_snapshot_daily(
stock_code: Optional[Union[str, List[str]]] = None,
date: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取股票日度快照数据(实时/历史)。
这是获取实时行情快照的主要接口。
- 如果提供 `date` 为今日日期,则返回实时快照数据(优先读取 Redis 缓存)。
- 如果提供 `date` 为历史日期,则返回历史快照数据。
- 如果不提供 `date`,则返回指定股票的历史快照列表。
Args:
stock_code: 股票代码(可选,单个或列表)
date: 交易日期 YYYY-MM-DD(可选,为空时返回历史列表)
page: 页码
page_size: 每页数量,最大 10000
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if date:
payload["date"] = date
return _make_request("POST", "/stock/snapshot_daily", json_data=payload)
def get_auction_daily(
stock_code: Optional[Union[str, List[str]]] = None,
date: Optional[str] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 60000,
) -> Dict[str, Any]:
"""
获取当天竞价时间 (09:15-09:25) 的快照数据,包括开盘价、成交量等竞价信息。支持按时间区间查询历史快照序列。
Args:
stock_code: 股票代码(可选,单个或列表)
date: 交易日期 YYYY-MM-DD(可选,为空时默认今天。如果不传 start_time/end_time,则返回该日期内每只股票最新的一条快照。)
start_time: 开始时间 YYYY-MM-DD HH:MM:SS(可选,如果传了该参数,则查询指定时间区间的历史序列数据)
end_time: 结束时间 YYYY-MM-DD HH:MM:SS(可选)
page: 页码
page_size: 每页数量,最大 60000
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if date:
payload["date"] = date
if start_time:
payload["start_time"] = start_time
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/realtime/auction_daily", json_data=payload)
def get_limit_up_current(
date: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: Optional[int] = None,
page_size: Optional[int] = None,
) -> Dict[str, Any]:
"""
获取涨停股票快照数据。
Args:
date: 日期,格式 YYYY-MM-DD,默认今天
stock_code: 股票代码(可选,单个或列表)。传入后返回该股票(或多只股票)当天全部数据。
page: 页码,从0开始(可选,不传默认0)
page_size: 每页数量(可选,不传默认10000,最大10000)
Returns:
包含涨停快照数据的字典
"""
payload: Dict[str, Any] = {}
if date:
payload["date"] = date
if stock_code:
payload["stock_code"] = stock_code
if page is not None:
payload["page"] = page
if page_size is not None:
payload["page_size"] = page_size
return _make_request("POST", "/realtime/limit_up", json_data=payload)
def get_stock_snapshot_push_history(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取推送通道中的快照历史记录(返回快照数组)。
Args:
stock_code: 股票代码(可选,单个或列表)
start_time: 开始时间 YYYY-MM-DD HH:MM:SS
end_time: 结束时间 YYYY-MM-DD HH:MM:SS(可选)
page: 页码
page_size: 每页数量
"""
if not start_time:
raise ValueError("start_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/stock/snapshot_push_history", json_data=payload)
# ==================== 可转债相关 ====================
def get_bond_daily(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取可转债日线数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/bond/daily", json_data=payload)
def get_bond_history(
stock_code: Optional[Union[str, List[str]]] = None,
level: str = "5min",
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取可转债分钟级历史数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"level": level,
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/bond/history", json_data=payload)
def get_bond_indicator_daily(
stock_code: Optional[Union[str, List[str]]] = None,
start_date: Optional[str] = None,
end_date: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取可转债日度指标数据(纯债价值、转股溢价等)。
注意:至少需要提供 `stock_code` 或 `start_date` / `end_date` 之一。
"""
if not stock_code and not start_date and not end_date:
raise ValueError("stock_code 与 start_date/end_date 至少需要提供一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if start_date:
payload["start_date"] = start_date
if end_date:
payload["end_date"] = end_date
return _make_request("POST", "/bond/indicator_daily", json_data=payload)
def get_bond_closing_snapshot(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取可转债收盘快照数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/bond/closing_snapshot", json_data=payload)
def get_bond_list(
bond_code: Optional[Union[str, List[str]]] = None,
stock_code: Optional[Union[str, List[str]]] = None,
exchange: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取可转债基础信息列表。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if bond_code:
payload["bond_code"] = bond_code
if stock_code:
payload["stock_code"] = stock_code
if exchange:
payload["exchange"] = exchange
return _make_request("POST", "/bond/list", json_data=payload)
# ==================== ETF 相关 ====================
def get_etf_list() -> Dict[str, Any]:
"""
获取全市场ETF的基础信息列表
"""
return _make_request("POST", "/etf/list", json_data={})
def get_etf_realtime_history(
stock_code: Optional[str] = None,
trade_time: Optional[str] = None,
date: Optional[str] = None,
) -> Dict[str, Any]:
"""
获取ETF实时 1 分钟级别分时数据(支持查询最近7天内的数据)。返回数据会根据 stock_code + trade_time 进行去重。注意:stock_code 或 trade_time 至少提供一个。
"""
if not stock_code and not trade_time:
return {"code": 400, "msg": "必须提供 stock_code 或 trade_time 其中之一", "data": None}
payload = {}
if stock_code is not None:
payload["stock_code"] = stock_code
if trade_time is not None:
payload["trade_time"] = trade_time
if date is not None:
payload["date"] = date
return _make_request("POST", "/etf/realtime/history", json_data=payload)
def get_etf_daily(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取 ETF 日线数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/etf/daily", json_data=payload)
def get_etf_history(
stock_code: Optional[Union[str, List[str]]] = None,
level: str = "5min",
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取 ETF 分钟级历史数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"level": level,
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/etf/history", json_data=payload)
# ==================== 指数相关 ====================
def get_index_history(
index_code: Optional[Union[str, List[str]]] = None,
level: str = "1min",
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取指数分钟级历史数据。
注意:后端要求 `index_code` 与 `start_time/end_time` 至少提供一类。
"""
payload: Dict[str, Any] = {
"level": level,
"page": page,
"page_size": page_size,
}
if index_code:
payload["index_code"] = index_code
if start_time:
payload["start_time"] = start_time
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/index/history", json_data=payload)
def get_index_realtime_history(
index_code: Optional[Union[str, List[str]]] = None,
trade_time: Optional[str] = None,
date: Optional[str] = None,
) -> Dict[str, Any]:
"""
获取指数实时 1 分钟级别分时数据(支持查询最近7天内的数据)
注意: index_code 或 trade_time 至少提供一个
"""
if not index_code and not trade_time:
raise ValueError("index_code 和 trade_time 必须至少提供一个")
payload = {}
if index_code is not None:
payload["index_code"] = index_code
if trade_time is not None:
payload["trade_time"] = trade_time
if date is not None:
payload["date"] = date
return _make_request("POST", "/index/realtime/history", json_data=payload)
def get_index_yellow_line(
date: Optional[str] = None
) -> Dict[str, Any]:
"""
获取大盘黄白线分钟数据
Args:
date: 日期,格式 YYYY-MM-DD,默认今天
Returns:
包含大盘黄白线数据的字典
"""
payload: Dict[str, Any] = {}
if date:
payload["date"] = date
return _make_request("POST", "/index/yellow_line", json_data=payload)
def get_market_distribution(
date: Optional[str] = None
) -> Dict[str, Any]:
"""
获取全市场涨跌分布分钟数据
Args:
date: 日期,格式 YYYY-MM-DD,默认今天
Returns:
包含全市场涨跌分布数据的字典
"""
payload: Dict[str, Any] = {}
if date:
payload["date"] = date
return _make_request("POST", "/realtime/market_distribution", json_data=payload)
def get_ths_sector_categories(
type: Optional[str] = None,
page: int = 0,
page_size: int = 1000,
) -> Dict[str, Any]:
"""
获取同花顺板块分类数据。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if type:
payload["type"] = type
return _make_request("POST", "/index/ths_sector_categories", json_data=payload)
def get_ths_constituent_stocks(
index_code: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: int = 0,
page_size: int = 1000,
) -> Dict[str, Any]:
"""
获取同花顺成分股数据。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if index_code:
payload["index_code"] = index_code
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/index/ths_constituent_stocks", json_data=payload)
def get_ths_daily(
ths_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取同花顺指数日线数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if ths_code:
payload["ths_code"] = ths_code
return _make_request("POST", "/index/ths_daily", json_data=payload)
def get_index_daily(
stock_code: Optional[Union[str, List[str]]] = None,
start_date: str = "",
end_date: str = "",
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取指数每日行情。
:param stock_code: 指数代码,如 "000001.SH"
:param start_date: 开始日期 (YYYY-MM-DD)
:param end_date: 结束日期 (YYYY-MM-DD)
:param page: 页码
:param page_size: 每页数量
"""
payload = {
"page": page,
"page_size": page_size
}
if stock_code:
payload["stock_code"] = stock_code
if start_date:
payload["start_date"] = start_date
if end_date:
payload["end_date"] = end_date
return _make_request("POST", "/index/daily", json_data=payload)
def get_index_weight(
index_code: str,
stock_code: Optional[Union[str, List[str]]] = None,
trade_date: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取指数月度成分和权重数据。
Args:
index_code: 指数代码(必填),例如 000300.SH
stock_code: 成分股代码(可选),支持字符串或数组
trade_date: 交易日期(可选),支持 YYYY-MM 或 YYYY-MM-DD;查询时仅按年和月过滤,不传默认返回最新月份数据
page: 页码,从0开始
page_size: 每页数量,默认2000,最大10000
"""
if not index_code:
raise ValueError("index_code 为必填参数")
payload: Dict[str, Any] = {
"index_code": index_code,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
if trade_date:
payload["trade_date"] = trade_date
return _make_request("POST", "/index/weight", json_data=payload)
def get_dc_blocks(
block_code: Optional[Union[str, List[str]]] = None,
block_type: Optional[str] = None,
block_name: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取东方财富板块列表。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if block_code:
payload["block_code"] = block_code
if block_type:
payload["block_type"] = block_type
if block_name:
payload["block_name"] = block_name
return _make_request("POST", "/dc/blocks", json_data=payload)
def get_dc_daily(
block_code: Optional[Union[str, List[str]]] = None,
trade_date: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取东方财富板块日K。block_code 与 trade_date 至少传一个。
"""
if not block_code and not trade_date:
raise ValueError("block_code 与 trade_date 至少需要传一个")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if block_code:
payload["block_code"] = block_code
if trade_date:
payload["trade_date"] = trade_date
return _make_request("POST", "/dc/daily", json_data=payload)
def get_dc_block_stocks(
block_code: Optional[Union[str, List[str]]] = None,
trade_date: Optional[str] = None,
stock_code: Optional[Union[str, List[str]]] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取东方财富板块成分股。三个筛选条件均可选;全不传时默认返回最新交易日数据。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if block_code:
payload["block_code"] = block_code
if trade_date:
payload["trade_date"] = trade_date
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/dc/block_stocks", json_data=payload)
def get_ths_hot(
market: str = "热股",
trade_date: Optional[str] = None
) -> Dict[str, Any]:
"""
获取同花顺热度榜
:param market: 热榜类型 (默认:热股)。可选值:热股, ETF, 可转债, 行业板块, 概念板块, 期货
:param trade_date: 指定交易日期,支持 YYYY-MM-DD 或 YYYYMMDD;不传默认最新交易日
:return: 包含热榜数据的字典,包含 list、trade_date、update_time 等;list 内含 rank 字段
"""
params: Dict[str, Any] = {"market": market}
if trade_date:
params["trade_date"] = trade_date
return _make_request("GET", "/api/ths/hot", params=params)
# ==================== 港股相关 ====================
def get_hk_stock_list() -> List[Dict[str, Any]]:
"""
获取港股基础信息列表。
"""
return _make_request("GET", "/stock/hk/list")
def get_hk_finance_data(
stock_code: Optional[Union[str, List[str]]] = None,
start_date: str = "",
end_date: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取港股财务报表及财务指标数据。
"""
if not start_date or not end_date:
raise ValueError("start_date 与 end_date 为必填参数")
payload: Dict[str, Any] = {
"start_date": start_date,
"end_date": end_date,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/hk/finance", json_data=payload)
def get_hk_stock_valuation() -> Dict[str, Any]:
"""
获取港股综合估值信息(含行业分布与 10 年成长指标)。
"""
return _make_request("GET", "/stock/hk/valuation")
def get_hk_closing_snapshot(
stock_code: Optional[Union[str, List[str]]] = None,
start_time: str = "",
end_time: str = "",
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取港股收盘快照数据。
"""
if not start_time or not end_time:
raise ValueError("start_time 与 end_time 为必填参数")
payload: Dict[str, Any] = {
"start_time": start_time,
"end_time": end_time,
"page": page,
"page_size": page_size,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/hk/closing_snapshot", json_data=payload)
def get_hk_connect(
type: Optional[str] = None,
) -> List[Dict[str, Any]]:
"""
获取最新一日港股互联互通成分(沪深港通标的)。
Args:
type: 可选,HK_SZ / SZ_HK / HK_SH / SH_HK
"""
params: Dict[str, Any] = {}
if type:
params["type"] = type
return _make_request("GET", "/stock/hk/connect", params=params)
# ==================== 龙虎榜数据 ====================
def get_dragon_tiger(
date: Optional[str] = None,
stock_code: Optional[str] = None,
page: int = 0,
page_size: int = 20,
) -> Dict[str, Any]:
"""
获取龙虎榜机构明细数据。
date 和 stock_code 必须至少提供一个。
"""
if not date and not stock_code:
# 如果都没有提供,默认查询当天
date = datetime.now().strftime("%Y-%m-%d")
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if date:
payload["date"] = date
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/dragon_tiger", json_data=payload)
def get_top_list(
trade_date: str,
stock_code: Optional[str] = None,
) -> Dict[str, Any]:
"""
获取龙虎榜每日明细数据。
"""
payload: Dict[str, Any] = {
"trade_date": trade_date,
}
if stock_code:
payload["stock_code"] = stock_code
return _make_request("POST", "/stock/top_list", json_data=payload)
def get_tdx_daily(
board_code: Optional[str] = None,
trade_date: Optional[str] = None,
start_date: Optional[str] = None,
end_date: Optional[str] = None,
page: int = 0,
page_size: int = 100,
) -> Dict[str, Any]:
"""
获取通达信板块日K线数据。
支持按特定板块(查询历史)或特定日期(查询所有板块)进行筛选。如果 start_date 和 end_date 相同,将忽略分页返回当天所有板块数据。
Args:
board_code: 板块代码(可选,如 880471 或 880471.TDX)
trade_date: 交易日期 YYYY-MM-DD(可选)
start_date: 开始日期 YYYY-MM-DD(可选)
end_date: 结束日期 YYYY-MM-DD(可选)
page: 页码,从 0 开始
page_size: 每页数量
"""
params: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if board_code:
params["board_code"] = board_code
if trade_date:
params["trade_date"] = trade_date
if start_date:
params["start_date"] = start_date
if end_date:
params["end_date"] = end_date
return _make_request("GET", "/tdx/daily", params=params)
# ==================== 同花顺 数据相关 ====================
def get_tdx_blocks(
block_type: int,
block_name: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取通达信板块列表数据。block_type 为必填参数。
Args:
block_type: 板块类型(0:行业板块, 1:风格板块, 2:概念板块, 3:指数板块)
block_name: 板块名称(可选,用于筛选,如 5G概念)
page: 页码,从 0 开始
page_size: 每页数量,默认 10000
"""
params: Dict[str, Any] = {
"block_type": block_type,
"page": page,
"page_size": page_size,
}
if block_name:
params["block_name"] = block_name
return _make_request("GET", "/tdx/blocks", params=params)
def get_tdx_block_stocks(
block_code: Optional[str] = None,
stock_code: Optional[str] = None,
page: int = 0,
page_size: int = 10000,
) -> Dict[str, Any]:
"""
获取通达信板块成分股数据。支持按板块代码或股票代码筛选。
返回分页结构 data.total / data.page / data.page_size / data.list,
其中 data.list 的每项包含 block_code、block_name、block_type、stock_code。
Args:
block_code: 板块代码(可选,如 880506.TDX)
stock_code: 股票代码(可选,如 000063.SZ)
page: 页码,从 0 开始
page_size: 每页数量,默认 10000
"""
params: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if block_code:
params["block_code"] = block_code
if stock_code:
params["stock_code"] = stock_code
return _make_request("GET", "/tdx/block_stocks", params=params)
def get_future_basic(
contract_code: Optional[Union[str, List[str]]] = None,
exchange: Optional[str] = None,
fut_code: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取期货合约的基础信息数据,包括乘数、交割方式、上市日期等。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if contract_code:
payload["contract_code"] = contract_code
if exchange:
payload["exchange"] = exchange
if fut_code:
payload["fut_code"] = fut_code
return _make_request("POST", "/future/basic", json_data=payload)
def get_future_mapping(
mapping_code: Optional[Union[str, List[str]]] = None,
contract_code: Optional[Union[str, List[str]]] = None,
trade_date: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取期货主连或连续合约与实际月合约的映射关系。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if mapping_code:
payload["mapping_code"] = mapping_code
if contract_code:
payload["contract_code"] = contract_code
if trade_date:
payload["trade_date"] = trade_date
return _make_request("POST", "/future/mapping", json_data=payload)
def get_future_minute(
contract_code: Optional[Union[str, List[str]]] = None,
freq: Optional[str] = None,
start_time: Optional[str] = None,
end_time: Optional[str] = None,
page: int = 0,
page_size: int = 2000,
) -> Dict[str, Any]:
"""
获取期货合约的历史分钟K线数据。
"""
payload: Dict[str, Any] = {
"page": page,
"page_size": page_size,
}
if contract_code:
payload["contract_code"] = contract_code
if freq:
payload["freq"] = freq
if start_time:
payload["start_time"] = start_time
if end_time:
payload["end_time"] = end_time
return _make_request("POST", "/future/minute", json_data=payload)
Related skills
How it compares
Choose this skill when OpenClaw agents need hosted Chinese market data instead of building custom exchange connectors.
FAQ
What markets does openclaw-stock-skill support?
openclaw-stock-skill targets A-share and related Chinese market instruments through data.diemeng.chat, including stocks, convertible bonds, ETFs, and indices with daily, minute, and financial indicator endpoints.
How do you install openclaw-stock-skill?
Run `npx skills add https://github.com/1018466411/openclaw-stock-data-skill`, choose openclaw with global scope, copy to all agents, and set STOCK_API_KEY from your data.diemeng.chat account.
Is Openclaw Stock Skill safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.