一个基于 Rust 的实时金融风险监控系统,自动监控美国国债收益率、外汇、加密货币和股票市场波动。
- 🔍 实时监控: 每5分钟自动检查市场数据
- 📊 多维度监控:
- 国债监控: 美国10年期国债收益率超过4.5%时告警
- 外汇监控: 监控日元等外汇指数的价格波动
- 加密货币监控: 监控 BTC、ETH、BNB、SOL 等主流币种价格波动
- 股票和指数监控: 监控纳斯达克、标普500、英伟达、特斯拉、拼多多等股票和指数
- 📧 智能告警: 触发阈值时自动发送邮件通知,1小时内不重复发送
- ⚡ 高性能: 基于 Tokio 异步运行时,所有监控任务并发执行,高效稳定
- 🏗️ 模块化设计: 使用 trait-based 架构,易于扩展新的监控类型
- 监控指标: ^TNX (美国10年期国债收益率)
- 告警阈值: 收益率 > 4.5%
- 检查频率: 每5分钟
- 数据来源: Yahoo Finance API
| 名称 | 代码 | 监控周期 | 告警阈值 |
|---|---|---|---|
| 日元指数 | JPY=X | 1天 | 涨幅 > 4% |
- 检查频率: 每5分钟
- 数据来源: Yahoo Finance API
- 独立告警: 每个外汇独立计时,互不影响
- 说明: 支持双向监控(涨跌幅)
| 币种 | 代码 | 监控周期 | 告警阈值 |
|---|---|---|---|
| 比特币 | BTC-USD | 1天 | 跌幅 > 8% |
| 以太坊 | ETH-USD | 1天 | 跌幅 > 10% |
| 币安币 | BNB-USD | 1天 | 跌幅 > 12% |
| 索拉纳 | SOL-USD | 1天 | 跌幅 > 15% |
- 检查频率: 每5分钟
- 数据来源: Yahoo Finance API
- 独立告警: 每个币种独立计时,互不影响
- 说明: 支持双向监控(涨跌幅)
| 名称 | 代码 | 监控周期 | 告警阈值 |
|---|---|---|---|
| 纳斯达克指数 | ^IXIC | 1天 | 跌幅 > 5% |
| 标普500指数 | ^GSPC | 1天 | 跌幅 > 5% |
| 英伟达 | NVDA | 1天 | 跌幅 > 8% |
| 特斯拉 | TSLA | 1天 | 跌幅 > 10% |
| 拼多多 | PDD | 1天 | 跌幅 > 10% |
- 检查频率: 每5分钟
- 数据来源: Yahoo Finance API
- 独立告警: 每个股票/指数独立计时,互不影响
- 说明: 支持双向监控(涨跌幅)
- 创建环境变量文件:
# 创建 .env 文件并配置以下变量
RUST_LOG=info
# Resend 邮件服务配置
[email protected]
[email protected]
RESEND_API_KEY=your-resend-api-key# 本地运行
make local_run# 构建 Docker 镜像
make image
# 运行容器
make run_container- 频率控制: 每个监控项1小时内最多发送1次告警邮件
- 独立计时: 不同监控项的告警时间独立计算
- 详细信息: 邮件包含具体数值、变化率、阈值等详细信息
- 并发执行: 所有监控任务并发执行,互不阻塞
编辑 src/main.rs 中的定时器间隔:
// 修改为300秒 = 5分钟
let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(300));修改 src/main.rs 中对应监控器的阈值参数:
- 国债收益率: 修改
TreasuryYieldMonitor配置中的阈值参数 - 外汇: 修改
ForexMonitor配置中的阈值参数 - 加密货币: 修改
CryptoMonitor配置中的阈值参数 - 股票和指数: 修改
StockMonitor配置中的阈值参数
说明:
- 正数阈值 = 涨幅监控(如
5.0表示涨幅超过5%时告警) - 负数阈值 = 跌幅监控(如
-10.0表示跌幅超过10%时告警)
系统采用 trait-based 架构设计:
src/
├── main.rs # 主程序入口,监控器实例化和调度
├── monitors/ # 监控器模块
│ ├── mod.rs # 模块导出
│ ├── base.rs # Monitor trait 定义
│ ├── treasury_yield.rs # 国债收益率监控器
│ ├── forex.rs # 外汇监控器
│ ├── crypto.rs # 加密货币监控器
│ └── stock.rs # 股票和指数监控器
└── utils/ # 工具模块
├── mod.rs # 模块导出
├── notification.rs # 邮件通知工具
├── rate_limiter.rs # API 限流工具
└── yahoo_api.rs # Yahoo Finance API 客户端
- 创建新模块文件
在 src/monitors/ 目录创建新监控器文件,例如 commodity.rs:
use async_trait::async_trait;
use crate::monitors::base::{Monitor, MonitorCheckResult, MonitorConfig};
#[derive(Clone)]
pub struct CommodityMonitor {
config: MonitorConfig,
}
impl CommodityMonitor {
pub fn new(config: MonitorConfig) -> Self {
Self { config }
}
}
#[async_trait]
impl Monitor for CommodityMonitor {
// 实现 Monitor trait 的所有方法
fn get_ticker_symbol(&self) -> &str {
&self.config.ticker_symbol
}
fn get_display_name(&self) -> &str {
&self.config.display_name
}
fn get_period_days(&self) -> i64 {
self.config.period_days
}
fn get_threshold_percent(&self) -> f64 {
self.config.threshold_percent
}
fn get_asset_type(&self) -> &str {
"大宗商品"
}
async fn check(&self) -> Result<MonitorCheckResult, Box<dyn std::error::Error + Send + Sync>> {
// 实现具体的监控逻辑
// ...
}
}- 导出新模块
在 src/monitors/mod.rs 中添加:
pub mod commodity;- 在主程序中使用
在 src/main.rs 的 monitors 向量中添加新监控器实例,并在克隆逻辑中添加相应的处理。
Q: 为什么没有收到告警邮件?
- 检查
.env文件中的 Resend API 配置是否正确 - 确认触发条件已满足
- 查看日志确认是否因1小时限制而跳过发送
Q: 如何修改检查频率?
- 修改
main.rs中的interval时间间隔
Q: 能否监控更多资产?
- 可以,系统支持所有 Yahoo Finance 支持的资产代码
- 在
main.rs的monitors向量中添加相应的监控器实例即可 - 支持的资产类型:股票、指数、加密货币、外汇、ETF等
Q: 如何设置涨幅监控?
- 将阈值参数设置为正数(如
5.0表示涨幅超过5%时告警) - 适用于外汇、商品等需要监控异常涨幅的场景
Q: 数据源是否可靠?
- 使用 Yahoo Finance 官方 API,数据质量较高
- 数据为延迟数据,非交易所实时数据
- 建议仅作为风险预警参考,不作为实际交易依据
Q: 监控器如何扩展?
- 系统采用 trait-based 架构,易于扩展
- 创建新监控器只需实现
Monitortrait - 参考
forex.rs、crypto.rs等现有监控器的实现
免责声明: 本系统仅供个人学习和研究使用,不构成任何投资建议。投资有风险,决策需谨慎。