t-tani-it/stockChecker
GitHub: t-tani-it/stockChecker
一款支持九种可插拔选股规则的股票投资策略回测系统,整合价格、财务与新闻情绪数据,帮助用户通过历史数据验证投资法则。
Stars: 0 | Forks: 0
# stockChecker — 股票投资“法则”回测系统
这是一款用于在资产管理和股票投资领域,通过数据挖掘发现的“法则(即能够带来收益的股价模式和财务条件)”,并利用历史数据进行验证(回测)的工具。
## 目标用户
- 希望确认和验证通过数据挖掘发现的投资者个人
- AI 代理(通过阅读本文档来操作系统)
## 前置环境
| 需求 | 版本 |
|------|-----------|
| Python | 3.11+ |
| pip | 推荐最新版 |
依赖包已在 `requirements.txt` 中列出。
## 安装说明
```
# 依存パッケージのインストール
pip install -r requirements.txt
```
### API Key 设置(可选)
仅当需要使用情感分析(新闻情感分析)时,请在项目根目录下创建 `.env` 文件并进行以下设置。
```
NEWSAPI_KEY=your_newsapi_key
FINNHUB_API_KEY=your_finnhub_key
```
- [NewsAPI](https://newsapi.org/register) — 免费额度: 每天 100 次请求
- [Finnhub](https://finnhub.io/register) — 免费额度: 每分钟 60 次请求
如果未设置 API Key,情感相关规则将返回中立分数(50.0)。
## 快速开始
```
# 0. プロジェクトフォルダへ移動
cd stockChecker
# 1. 仮想環境を有効化(必要な場合)
conda activate backtest
# 2. データベースの初期化+デモデータ投入(10銘柄: AAPL, MSFT, GOOGL 等)
python seed.py
# 3. Streamlit アプリ起動
streamlit run app.py
# 4. ブラウザが開いたら、基準日を選択して「バックテスト実行」ボタンを押下
```
### 下载全量数据(可选)
seed.py 仅针对 10 只股票。如果需要获取所有活跃股票的数据,请运行以下脚本。
```
# 全データを一括ダウンロード(株価・財務・センチメント)
python download_all.py
# 株価のみ差分更新(軽量、前回取得日から5日分のみ再取得)
python download_all.py --incremental
# 特定のデータのみ
python download_all.py --prices # 株価のみ
python download_all.py --financials # 財務のみ
python download_all.py --sentiment # センチメントのみ
```
## 系统架构
```
stockChecker/
├── app.py # Streamlit メインエントリポイント
├── config.py # 設定(環境変数読み込み)
├── seed.py # 初期データ投入スクリプト
├── download_all.py # 全データ一括ダウンロードスクリプト
├── requirements.txt # 依存パッケージ一覧
├── backtest.db # SQLite データベース
│
├── db/ # データ層
│ ├── schema.py # テーブル定義(7テーブル)
│ ├── tickers.py # 銘柄リスト管理(S&P500 / JPX)
│ ├── downloader_prices.py # 株価ダウンロード(yfinance)
│ ├── downloader_financials.py # 財務データDL(yfinance / EDINET)
│ └── downloader_sentiment.py # ニュースDL + FinBERT 感情分析
│
├── rules/ # ルール層(プラグイン形式)
│ ├── base.py # 抽象基底クラス
│ ├── momentum.py # モメンタム
│ ├── value.py # バリュー(割安)
│ ├── quality.py # クオリティ(高品質)
│ ├── size.py # サイズ(小型株)
│ ├── low_vol.py # 低ボラティリティ
│ ├── pead.py # PEAD(決算サプライズ後ドリフト)
│ ├── sentiment.py # ニュースセンチメント
│ ├── text_score.py # 決算書テキスト特徴
│ └── anomaly.py # 異常検知(出来高・ボラティリティ急変)
│
├── ui/ # UI層
│ ├── tabs.py # タブレンダリング
│ ├── ranking.py # ランキング集計
│ └── charts.py # Plotly チャート(ローソク足・MA・出来高)
│
├── tests/ # テスト
│ ├── test_schema.py
│ └── test_rules.py
│
├── docs/ # 詳細ドキュメント
│ ├── ARCHITECTURE.md
│ ├── DATA_MODEL.md
│ ├── INTERFACE.md
│ ├── OPERATION_RULES.md
│ ├── WORKFLOW.md
│ ├── TEST_CASES.md
│ ├── DIAGRAMS.md
│ └── MEMORY_GUIDE.md
│
└── diagrams/ # Mermaid 図解
├── 01_flowchart.mmd
├── 02_sequence.mmd
├── 03a_class_rules.mmd
├── 03b_class_modules.mmd
├── 04_mindmap.mmd
└── 05_state.mmd
```
## 系统的构成要素
### 数据层(db/)
- 股价数据(yfinance)
- 财务数据(美股: yfinance、日股: edinet)
- 新闻/财报文本(NewsAPI/Finnhub/edinet/SEC-EDGAR → FinBERT 分析)
- 汇总保存至 SQLite 数据库
### 规则层(rules/)
以插件形式实现了 9 种“法则”(共 9 条规则):
| 规则 | 描述 | 所需数据 |
|--------|------|-----------|
| 动量 (Momentum) | 过去 3 至 12 个月收益率的加权平均 | 仅限股价 |
| 价值 (Value) | 通过 PER、PBR 和股息率评估低估值程度 | 财务数据 |
| 质量 (Quality) | 通过 ROE、净资产比率和营业利润率评估质量 | 财务数据 |
| 规模 (Size) | 按总市值计算,市值越小得分越高 | 总市值 |
| 低波动率 (Low Volatility) | 年化历史波动率 | 仅限股价 |
| PEAD | 通过财报意外幅度 (surprise rate) 评估正向意外 | yfinance API |
| 情绪 (Sentiment) | 通过 FinBERT 得出的新闻情感分析得分 | 情绪指标 |
| 文本特征 (Text Feature) | 财报文本的乐观度得分(ROE 回退) | 文本指标 + 财务 |
| 异常检测 (Anomaly Detection) | 检测成交量和波动率的激增 | 仅限股价 |
新法则只需继承 `rules/base.py` 中的 `BaseRule`,并将文件放置在 `rules/` 目录下即可自动识别(插件模式)。
### UI 层(ui/ + app.py)
- 基于 Streamlit 的 Web 应用程序
- 通过标签页形式显示符合各法则的股票(前 50 名)
- 在综合排名标签页中对所有法则进行交叉汇总(前 10 名)
- 通过 Plotly 显示股价图表(K 线图 + 移动平均线 + 成交量,支持 3/6/9/12 个月切换)
## 数据来源
| 数据类型 | 美股 | 日股 |
|-----------|--------|--------|
| 股价 | yfinance | yfinance |
| 财务数据 | yfinance(积累) | edinet |
| 财报文本 | SEC EDGAR (sec-edgar-api) | edinet |
| 新闻 | NewsAPI / Finnhub + FinBERT | NewsAPI / Finnhub + FinBERT |
## 数据库(SQLite)
由 7 张表组成:
| 表名 | 用途 |
|----------|------|
| tickers | 股票主数据(代码、市场、总市值) |
| prices | 每日股价(开盘价、最高价、最低价、收盘价、成交量) |
| financials | 按会计年度划分的财务数据 |
| indicators | 按规则预先计算的指标(情绪等) |
| backtest_results | 回测执行结果 |
| sentiment_download_log | 情绪下载历史(用于 API 限制控制) |
| error_log | 错误日志 |
## 非功能性需求
- 日股 + 美股 总计约 10,000 至 12,000 只股票
- 由于财务数据存在 4 年的限制,需通过数据库积累以进行扩充
- 情绪下载考虑到了 API 的限制,采取逐只股票依次处理的方式(仅处理距上次下载超过 24 小时的股票)
## 文档
详细信息存放在 `docs/` 文件夹中。
| 文档 | 内容 |
|-------------|------|
| ARCHITECTURE.md | 整体架构图(思维导图) |
| DATA_MODEL.md | DB schema、7 张表定义及扩展思路 |
| INTERFACE.md | UI 结构、操作说明及插件添加方法 |
| OPERATION_RULES.md | 运维规则、禁止行为及 API 限制应对 |
| WORKFLOW.md | 业务流程、处理流程(共 5 种) |
| TEST_CASES.md | 测试用例列表及验证检查清单 |
| DIAGRAMS.md | 图表列表(流程图/时序图/类图/状态图) |
| MEMORY_GUIDE.md | AI 代理用的记忆结构和运行状态管理 |
## 开源协议
MIT
标签:FinBERT, Kubernetes, NLP, Python, Streamlit, 回测系统, 无后门, 访问控制, 逆向工具, 量化投资, 金融科技