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, 回测系统, 无后门, 访问控制, 逆向工具, 量化投资, 金融科技