Metadata-Version: 2.4
Name: eastmoney-concept-picker
Version: 0.1.0
Summary: Fetch Eastmoney stock data and use OpenAI to pick core concept labels.
Author: eastmoney-concept-picker
License-Expression: LicenseRef-Proprietary
Keywords: a-share,eastmoney,openai,stocks,concept
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Operating System :: OS Independent
Requires-Python: >=3.10
Description-Content-Type: text/markdown

# eastmoney-concept-picker

一个基于东方财富数据的 A 股概念筛选工具。

当前功能：

- 根据股票代码从东方财富抓取个股基础主题数据
- 将原始数据保存到本地 JSON 文件
- 支持基于本地缓存复用抓取结果
- 将 JSON 内容发送给 OpenAI
- 从 `boards` 中筛选 3 个更核心的概念标签
- 自动压掉明显的上位概念，优先保留更具体的下位概念

## 工作流程

执行：

```bash
python main.py <股票代码>
```

程序会按这个顺序运行：

1. 读取 `config.yaml`
2. 检查本地缓存是否仍在有效期内
3. 如果缓存有效，直接复用 `<股票代码>.json`
4. 如果缓存失效或不存在，从东方财富重新抓取
5. 将 JSON 内容发送给 OpenAI
6. 要求模型只能从 `boards[].BOARD_NAME` 中挑选 3 个核心概念
7. 在控制台打印结果

## 项目结构

```text
.
├── main.py
├── config.yaml.example
├── eastmoney_spider/
│   ├── fetcher.py
│   └── llm.py
├── tests/
└── docs/
```

## 配置

项目默认读取根目录下的 `config.yaml`。

建议先从示例文件复制：

```bash
copy config.yaml.example config.yaml
```

配置示例：

```yaml
cache_days: 7

openai:
  api_key: your-openai-api-key
  base_url: https://api.openai.com/v1
  model: gpt-4o-mini
  proxy: http://127.0.0.1:7890
```

说明：

- `cache_days`
  控制本地 JSON 缓存有效期，默认 `7`
- `openai.api_key`
  OpenAI API Key
- `openai.base_url`
  OpenAI 兼容接口地址
- `openai.model`
  使用的模型名称
- `openai.proxy`
  可选配置，只对 OpenAI 请求生效，不影响东方财富抓取

## 使用方式

示例：

```bash
python main.py 600032
```

首次抓取时，终端类似输出：

```text
已抓取并保存: 600032.json

股票: 600032 浙江新能

核心概念标签:
1. 光伏发电
   原因: 公司主营业务包括光伏发电，符合该板块的定义。
2. 风能
   原因: 公司涉及风力发电业务，属于风能板块。
3. 新能源
   原因: 公司的业务方向包括可再生能源，符合新能源的定义。
```

命中缓存时，终端类似输出：

```text
使用缓存: 600032.json

股票: 600032 浙江新能

核心概念标签:
1. 光伏发电
   原因: 公司主营业务包括光伏发电，符合该板块的定义。
2. 风能
   原因: 公司涉及风力发电业务，属于风能板块。
3. 新能源
   原因: 公司的业务方向包括可再生能源，符合新能源的定义。
```

## 输出文件

程序会在当前目录生成：

```text
<股票代码>.json
```

例如：

```text
600032.json
```

当前 JSON 中主要包含：

- `stock`
- `content`
- `boards`
- `metadata`

其中 `metadata.fetched_at` 用于缓存判断。

## 当前规则

为了减少概念冗余，程序会优先保留更具体的标签。

例如同一层级链中如果同时出现：

- `公用事业`
- `电力`
- `光伏发电`

则会优先保留更具体的 `光伏发电`，避免把明显存在包含关系的上位概念和下位概念同时交给模型。

## 安装与环境

当前项目基于 Python 运行。

已验证命令示例：

```bash
python main.py 600032
```

如果本机 `python` 命令不可用，请使用你自己的 Python 可执行文件路径运行。

## 测试

运行测试：

```bash
python -m unittest discover -s tests -v
```

## 注意事项

- `config.yaml` 不应提交到仓库
- 请只提交 `config.yaml.example`
- 本地生成的 JSON 文件属于缓存结果，不建议提交
- OpenAI 返回结果仍然是模型判断，不构成投资建议

## 后续可扩展方向

- 进一步压制像 `新能源` 这类更宽泛的大概念
- 输出更稳定的中文理由
- 支持批量股票分析
- 将分析结果保存为独立结果文件
- 增加更完整的 OpenAI 配置校验和异常处理
