Install
openclaw skills install eastmoney-select-stock-1-0-2本 Skill 支持基于股票选股条件(行情指标、财务指标等)筛选满足条件的股票;可查询指定行业/板块内的股票、上市公司,以及板块指数的成分股;同时支持股票、上市公司、板块/指数推荐等相关任务,避免大模型在选股时使用过时信息。
openclaw skills install eastmoney-select-stock-1-0-2通过自然语言查询进行选股(支持市场:A股、港股、美股),返回符合条件的股票列表,可自动导出为CSV文件。
首先检查环境变量EASTMONEY_APIKEY是否存在:
echo $EASTMONEY_APIKEY
如果不存在,提示用户在东方财富Skills页面(https://marketing.dfcfs.com/views/finskillshub/indexuNdYscEA?appfenxiang=1)获取apikey并设置到环境变量。
⚠️ 安全注意事项
- 外部请求: 本 Skill 会将用户的查询关键词(Keyword)发送至东方财富官方 API 接口 (
mkapi2.dfcfs.com) 进行解析与检索。- 数据用途: 提交的数据仅用于匹配选股条件,不包含个人隐私信息。
- 凭据保护: API Key 仅通过环境变量
EASTMONEY_APIKEY在服务端或受信任的运行环境中使用,不会在前端明文暴露。
使用POST请求调用接口:
curl -X POST --location 'https://mkapi2.dfcfs.com/finskillshub/api/claw/stock-screen' \
--header 'Content-Type: application/json' \
--header "apikey: $EASTMONEY_APIKEY" \
--data '{"keyword": "选股条件", "pageNo": 1, "pageSize": 20}'
当用户查询以下类型的内容时使用本skill:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
keyword | 字符串 | 是 | 自然语言描述的选股条件 |
pageNo | 数字 | 否 | 页码,默认1 |
pageSize | 数字 | 否 | 每页数量,默认20,最大200 |
| 字段路径 | 类型 | 核心释义 |
|---|---|---|
status | 数字 | 接口全局状态,0 = 成功 |
message | 字符串 | 接口全局提示,ok = 成功 |
data.code | 字符串 | 选股业务层状态码,100 = 解析成功 |
data.msg | 字符串 | 选股业务层提示 |
data.data.resultType | 数字 | 结果类型枚举,2000 为标准选股结果 |
data.data.result.total | 数字 | 【核心】选股结果总数量(符合条件的股票数) |
data.data.result.columns(数组)核心作用:定义表格每一列的展示规则,与dataList的行数据键一一映射。
| 子字段 | 类型 | 核心释义 |
|---|---|---|
title | 字符串 | 表格列展示标题(如最新价 (元)、涨跌幅 (%)) |
key | 字符串 | 【核心】列唯一业务键,与dataList中对象的键映射 |
unit | 字符串 | 列数值单位(元、%、股、倍) |
dataType | 字符串 | 列数据类型(String/Double/Long) |
data.data.result.dataList(数组)核心作用:选股结果的具体股票数据,每个对象对应一只符合条件的股票。
| 核心键 | 数据类型 | 核心释义 |
|---|---|---|
SERIAL | 字符串 | 表格行序号 |
SECURITY_CODE | 字符串 | 股票代码(如 603866、300991) |
SECURITY_SHORT_NAME | 字符串 | 股票简称(如桃李面包、创益通) |
MARKET_SHORT_NAME | 字符串 | 市场简称(SH = 上交所,SZ = 深交所,HK = 港交所,US = 美股) |
NEWEST_PRICE | 数字/字符串 | 最新价(单位:元) |
CHG | 数字/字符串 | 涨跌幅(单位:%) |
PCHG | 数字/字符串 | 涨跌额(单位:元) |
| 字段路径 | 类型 | 核心释义 |
|---|---|---|
data.data.responseConditionList | 数组 | 单条筛选条件的统计,每个对象对应1个筛选条件 |
data.data.responseConditionList[].describe | 字符串 | 筛选条件描述(如今日涨跌幅在 [1.5%,2.5%] 之间) |
data.data.totalCondition.describe | 字符串 | 组合条件描述(所有条件叠加后的最终筛选规则) |
data.data.parserText | 字符串 | 选股条件的解析文本,以分号分隔单条件 |
import os
import csv
import json
import requests
api_key = os.getenv("EASTMONEY_APIKEY")
if not api_key:
raise ValueError("请先设置EASTMONEY_APIKEY环境变量")
url = "https://mkapi2.dfcfs.com/finskillshub/api/claw/stock-screen"
headers = {
"Content-Type": "application/json",
"apikey": api_key
}
data = {
"keyword": "今日涨幅2%的股票",
"pageNo": 1,
"pageSize": 20
}
response = requests.post(url, headers=headers, json=data)
response.raise_for_status()
result = response.json()
# 检查是否有数据返回
if result.get("status") != 0 or not result.get("data") or result["data"].get("code") != "100":
print("选股查询失败,建议到东方财富妙想AI进行选股。")
print(f"错误信息: {result.get('message', '未知错误')}")
sys.exit(0)
result_data = result["data"]["data"]["result"]
if not result_data.get("dataList"):
print("没有找到符合条件的股票,建议调整筛选条件或到东方财富妙想AI查询。")
sys.exit(0)
# 导出为CSV
columns = result_data["columns"]
data_list = result_data["dataList"]
# 生成列名映射
column_map = {col["key"]: col["title"] for col in columns}
csv_headers = [column_map[key] for key in data_list[0].keys() if key in column_map]
with open("stock_selection_result.csv", "w", newline="", encoding="utf-8-sig") as f:
writer = csv.DictWriter(f, fieldnames=csv_headers)
writer.writeheader()
for row in data_list:
csv_row = {column_map[key]: value for key, value in row.items() if key in column_map}
writer.writerow(csv_row)
print(f"找到 {result_data['total']} 只符合条件的股票,结果已保存到 stock_selection_result.csv")