内容
# 印度NSE股票洞察 🇮🇳📈
印度股票市场分析的公共MCP服务器 - **Nifty 500宇宙**,**12种工具**,**3种时间框架**。
使用 [FastMCP](https://github.com/jlowin/fastmcp) 构建 · 数据来自 [yfinance](https://github.com/ranaroussi/yfinance) · 托管于 `stockmcp.alokbarnwal.com`
> **仅用于教育。非投资建议。** 请参阅 [DISCLAIMER.md](DISCLAIMER.md)。
---
## 快速连接 — 30秒
**Claude.ai** → 设置 → 连接器 → 添加自定义MCP连接器:
```
名称:印度NSE股票洞察
网址: https://stockmcp.alokbarnwal.com/mcp
```
就这样。开始询问关于印度股票的问题。
---
## 12种工具
| # | 工具 | 参数 | 返回内容 |
|---|------|-----------|-----------------|
| 1 | `get_stock_quote` | `symbol` | 最新收盘价,前收盘价,变化%,日内高/低,成交量 |
| 2 | `get_ohlc_data` | `symbol`,`timeframe?`,`limit?` | OHLCV蜡烛图(最多500个,按最新顺序排列) |
| 3 | `get_technical_indicators` | `symbol`,`timeframe?` | EMA,SMA,RSI,MACD,布林线,ADX,随机指标,ATR,OBV,VWAP |
| 4 | `get_support_resistance` | `symbol`,`timeframe?` | 枢轴点 + 历史支撑/阻力水平 |
| 5 | `get_demand_supply_zones` | `symbol`,`timeframe?`,`status?` | 需求/供给区(DBR/RBR/RBD/DBD) |
| 6 | `get_candlestick_patterns` | `symbol`,`timeframe?`,`limit?` | 锤头线,多头吞没线等 |
| 7 | `get_chart_patterns` | `symbol`,`timeframe?`,`status?` | 双顶,头肩顶等 |
| 8 | `get_fibonacci_levels` | `symbol`,`timeframe?` | 回撤波动(上涨/下跌)及斐波那契水平 |
| 9 | `get_volume_analysis` | `symbol` | 5分钟热点,OBV趋势,成交量比率 |
| 10 | `get_market_overview` | *(无)* | 指数,涨幅/跌幅前列,成交量, breadth |
| 11 | `compare_stocks` | `symbols`(2-5),`timeframe?` | 侧边栏:报价,RSI/MACD/ADX,趋势,30日回报 |
| 12 | `screen_stocks` | `filters` | 按RSI,ADX,趋势,模式,板块等筛选 |
`timeframe` 默认值为 `daily`。选项:`daily`,`15min`,`5min`。
---
## 示例提示
在连接后尝试这些Claude.ai:
- *"RELIANCE的技术分析 — RSI,MACD和支撑/阻力水平"*
- *"显示Nifty 500股票中RSI低于30和ADX高于25的股票"*
- *"比较TCS,INFY和WIPRO — 哪一个目前的设置最好?"*
- *"今日市场整体情况如何?显示涨幅和跌幅前列"*
- *"显示HDFC Bank在15分钟图表上的需求和供给区"*
---
## 架构
```mermaid
graph TB
subgraph Internet
C[Claude.ai / MCP Client]
end
subgraph Server["生产服务器"]
subgraph Protection
F2B[fail2ban<br/>自动禁止重复滥用者]
NG[nginx<br/>速率限制20r/s · 连接限制 · TLS]
end
subgraph Application
MCP["FastMCP服务器<br/>端口8089 · 12种工具"]
TOOLS["工具模块<br/>报价 · OHLC · 指标<br/>水平 · 区 · 模式<br/>斐波那契 · 成交量 · 市场<br/>比较 · 筛选"]
end
subgraph Data
DB[(MySQL: nse_public<br/>500股票 × 3时间框架)]
CRON[Cron作业<br/>5分钟 · 15分钟 · 每日]
end
end
subgraph External
YF[Yahoo Finance<br/>yfinance API]
end
C -->|HTTPS POST /mcp| NG
NG -->|proxy_pass| MCP
MCP --> TOOLS
TOOLS -->|只读查询| DB
YF -->|OHLCV数据| CRON
CRON -->|更新| DB
F2B -.->|监控| NG
```
---
## 数据覆盖
| 时间框架 | 保留时间 | 更新频率 | 股票数量 |
|-----------|-----------|-----------------|--------|
| 日线 | 5年 | 交易日结束(18:00 IST) | 500 |
| 15分钟 | 2年 | 每15分钟(交易时间) | 500 |
| 5分钟 | 6个月 | 每5分钟(交易时间) | 500 |
交易时间:09:15–15:30 IST,周一至周五(不包括NSE假期)。
---
## 速率限制
| 层 | 限制 | 操作 |
|-------|-------|--------|
| nginx | 每秒20个请求/每IP(突发40) | HTTP 429 |
| nginx | 每IP同时连接10个 | HTTP 429 |
| fail2ban | 2分钟内5次速率限制违规 | IP禁止1小时 |
---
## 自托管
<details>
<summary><strong>点击展开 — 完整部署运行手册</strong></summary>
> 在 `/home/ubuntu/nse-public-mcp/` 运行 — 与 `/home/ubuntu/swingtrader/` 完全隔离。
### 1. 克隆
```bash
cd /home/ubuntu
git clone https://github.com/alokbarnwal/nse-public-mcp.git
cd nse-public-mcp
```
### 2. 创建数据库和用户
```bash
sudo mysql <<'SQL'
CREATE DATABASE IF NOT EXISTS nse_public CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER IF NOT EXISTS 'nse_writer'@'localhost' IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON nse_public.* TO 'nse_writer'@'localhost';
FLUSH PRIVILEGES;
SQL
```
### 3. 应用架构
```bash
mysql -u nse_writer -p nse_public < db/schema.sql
mysql -u nse_writer -p nse_public < db/schema_indicators.sql
mysql -u nse_writer -p nse_public < db/schema_price_action.sql
```
### 4. 安装依赖
```bash
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
```
### 5. 配置环境
```bash
cp .env.example .env
chmod 600 .env
nano .env # 将DB_PASSWORD设置为步骤2的密码
```
### 6. (可选)刷新完整的Nifty 500列表
存储库中包含前100只股票的硬编码。要扩展到所有500只:
```bash
python -m config.stocks --refresh # 获取NSE存档,重写config/stocks.py
```
### 7. 将股票宇宙加载到数据库中
```bash
python -m config.stocks --load-to-db
```
### 8. 回填历史数据(长时间运行,使用screen/tmux)
```bash
screen -S backfill
source .venv/bin/activate
python -m data.backfill --all
# Ctrl-A D分离。重新连接:screen -r backfill
```
预期运行时间:
- `日线 5年 × 500`:~30分钟
- `15分钟 2年 × 500`:~2小时
- `5分钟 6个月 × 500`:~1小时
如果出现任何问题,失败列表将被写入 `backfill_failures_<timeframe>.json`。重新运行:
```bash
python -m data.backfill --timeframe 15min --resume
```
### 8b. 批量计算指标(长时间运行,使用screen/tmux)
在蜡烛回填完成后,为所有500只股票填充 `indicators` 表,涵盖所有3个时间框架:
```bash
screen -S indicators
cd /home/ubuntu/nse-public-mcp
python3 -m indicators.runner --all
# Ctrl-A D分离
```
预期运行时间:~30–45分钟。可幂等 - 如果中断,安全重新运行。
### 8c. 批量计算价格行为(长时间运行,使用screen/tmux)
在填充指标后,计算所有500只股票的价格行为特征(区域,支撑/阻力,模式,突破,斐波那契,缺口,成交量分布),涵盖所有3个时间框架:
```bash
screen -S price_action
cd /home/ubuntu/nse-public-mcp
python3 -m price_action.runner --timeframe daily --all-features
python3 -m price_action.runner --timeframe 15min --all-features
python3 -m price_action.runner --timeframe 5min --all-features
# Ctrl-A D分离
```
预期运行时间:~60–90分钟总计。可幂等 - 如果中断,安全重新运行。
### 9. 安装crontab
```bash
crontab -e
```
添加:
```cron
# nse-public-mcp 蜡烛更新器
*/5 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_5min >> logs/cron_5min.log 2>&1
*/15 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_15min >> logs/cron_15min.log 2>&1
0 18 * * 1-5 cd /home/ubuntu/nse-public-mcp && /home/ubuntu/nse-public-mcp/.venv/bin/python -m jobs.cron_daily >> logs/cron_daily.log 2>&1
# nse-public-mcp 指标更新器(每个在匹配的蜡烛获取后运行)
30 18 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_daily >> logs/indicators_daily.log 2>&1
20,35,50 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_15min >> logs/indicators_15min.log 2>&1
5 16 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_15min >> logs/indicators_15min.log 2>&1
2-57/5 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_indicators_5min >> logs/indicators_5min.log 2>&1
# nse-public-mcp 价格行为更新器(每个在匹配的指标cron后运行)
35 18 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_daily >> logs/price_action_daily.log 2>&1
25,55 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_15min >> logs/price_action_15min.log 2>&1
9-54/15 9-15 * * 1-5 cd /home/ubuntu/nse-public-mcp && /usr/bin/python3 -m jobs.cron_price_action_5min >> logs/price_action_5min.log 2>&1
```
> cron时间是服务器本地的。验证服务器是否在IST(`timedatectl`)- 如果不是,请偏移小时范围。
> 5分钟指标cron偏移到 `2-57/5`,以便它在 `cron_5min` 后约2分钟运行,并且从不读取过时的蜡烛。
> 5分钟价格行为cron偏移到 `9-54/15` (分钟9,24,39,54),以便它在每个 `cron_indicators_5min` 槽后约2分钟运行。
### 10. 验证
```bash
mysql -u nse_writer -p nse_public <<'SQL'
SELECT 'daily' AS tf, COUNT(*) AS n FROM candles_daily
UNION ALL SELECT '15min', COUNT(*) FROM candles_15min
UNION ALL SELECT '5min', COUNT(*) FROM candles_5min;
-- 每日按股票覆盖 - 标记任何 < 1000 行(~4交易年)
SELECT symbol, COUNT(*) AS n
FROM candles_daily
GROUP BY symbol
HAVING n < 1000
ORDER BY n;
-- 最新数据新鲜度
SELECT MIN(candle_date) AS earliest, MAX(candle_date) AS latest
FROM candles_daily;
-- 最近的cron健康状况
SELECT job_type, timeframe, symbols_success, symbols_failed, started_at, duration_seconds
FROM fetch_log
ORDER BY started_at DESC
LIMIT 20;
SQL
```
数据库磁盘大小:
```bash
sudo du -sh /var/lib/mysql/nse_public/
```
</details>
---
## 服务管理
```bash
# 服务器状态
sudo systemctl status nse-public-mcp
# 重启
sudo systemctl restart nse-public-mcp
# 日志
sudo journalctl -u nse-public-mcp -n 100 -f
# nginx
sudo nginx -t && sudo systemctl reload nginx
# fail2ban
sudo fail2ban-client status nginx-mcp-ratelimit
```
---
## 布局
参见 [PROJECT.md](PROJECT.md) 了解架构和数据流图。
```
config/ # 设置,股票宇宙,假期日历
data/ # yfinance获取器,回填CLI,共享更新助手
db/ # 架构和连接池
indicators/ # 技术指标计算,持久化,运行器
price_action/ # 区域,模式,水平,趋势
mcp_server/ # FastMCP服务器 + 12种工具模块
jobs/ # cron入口点(蜡烛 + 指标 + 价格行为)
deploy/ # systemd服务,nginx配置,fail2ban规则
tests/ # 模拟单元测试(82个测试)
```
---
## 操作说明
- **尊重Yahoo Finance。** 获取器在请求之间睡眠1–3秒,并带有回退重试。不要减少这些。
- **幂等。** 所有插入都是 `INSERT … ON DUPLICATE KEY UPDATE`。重放cron tick或重新运行回填是安全的。
- **假期日历** 位于 `config/holidays.py`。每年更新一次,当NSE发布下一年的列表时。
- **保留清理** 在 `jobs/cron_daily.py` 结束时运行。日线蜡烛旧于5年,15分钟旧于2年,5分钟旧于6个月将被清除。
---
## 许可证
[MIT](LICENSE) - 免费使用,修改和分发。
## 免责声明
本项目 **仅用于教育和信息目的**。非投资建议。参见 [DISCLAIMER.md](DISCLAIMER.md)。
连接信息
猜你喜欢
暂无推荐服务器