Skip to content

amazingchow/argus

Repository files navigation

一个基于 Rust 的实时金融风险监控系统,自动监控美国国债收益率、外汇、加密货币和股票市场波动。

功能特性

  • 🔍 实时监控: 每5分钟自动检查市场数据
  • 📊 多维度监控:
    • 国债监控: 美国10年期国债收益率超过4.5%时告警
    • 外汇监控: 监控日元等外汇指数的价格波动
    • 加密货币监控: 监控 BTC、ETH、BNB、SOL 等主流币种价格波动
    • 股票和指数监控: 监控纳斯达克、标普500、英伟达、特斯拉、拼多多等股票和指数
  • 📱 智能告警: 触发阈值时自动发送 App 推送通知(基于 Bark)
  • 🛡️ 告警限流: 每种告警类型每天最多发送3次,防止告警泛滥
  • 💾 持久化存储: 使用 RocksDB 持久化告警计数,重启后保持状态
  • 高性能: 基于 Tokio 异步运行时,所有监控任务并发执行,高效稳定
  • 🏗️ 模块化设计: 使用 trait-based 架构,易于扩展新的监控类型

监控项目

1. 美国10年期国债收益率监控

  • 监控指标: ^TNX (美国10年期国债收益率)
  • 告警阈值: 收益率 > 4.5%
  • 检查频率: 每5分钟
  • 数据来源: Yahoo Finance API

2. 外汇监控

名称 代码 监控周期 告警阈值
日元指数 JPY=X 1天 涨幅 > 4%
  • 检查频率: 每5分钟
  • 数据来源: Yahoo Finance API
  • 独立告警: 每个外汇独立计时,互不影响
  • 说明: 支持双向监控(涨跌幅)

3. 加密货币价格监控

币种 代码 监控周期 告警阈值
比特币 BTC-USD 1天 跌幅 > 8%
以太坊 ETH-USD 1天 跌幅 > 10%
币安币 BNB-USD 1天 跌幅 > 12%
索拉纳 SOL-USD 1天 跌幅 > 15%
  • 检查频率: 每5分钟
  • 数据来源: Yahoo Finance API
  • 独立告警: 每个币种独立计时,互不影响
  • 说明: 支持双向监控(涨跌幅)

4. 股票和指数监控

名称 代码 监控周期 告警阈值
纳斯达克指数 ^IXIC 1天 跌幅 > 5%
标普500指数 ^GSPC 1天 跌幅 > 5%
英伟达 NVDA 1天 跌幅 > 8%
特斯拉 TSLA 1天 跌幅 > 10%
拼多多 PDD 1天 跌幅 > 10%
  • 检查频率: 每5分钟
  • 数据来源: Yahoo Finance API
  • 独立告警: 每个股票/指数独立计时,互不影响
  • 说明: 支持双向监控(涨跌幅)

快速开始

系统依赖

在开始之前,请确保系统已安装必要的编译工具和依赖库。

Ubuntu/Debian

sudo apt update
sudo apt install -y build-essential clang libclang-dev

依赖说明:

  • build-essential: 提供 gcc、g++、make 和标准 C/C++ 头文件
  • clang: RocksDB 编译所需的 C/C++ 编译器
  • libclang-dev: Rust rocksdb crate 构建脚本所需的 libclang 开发头文件

macOS

# macOS 通常已预装 Xcode Command Line Tools
# 如未安装,运行以下命令
xcode-select --install

其他 Linux 发行版

Fedora/RHEL/CentOS:

sudo dnf groupinstall "Development Tools"
sudo dnf install clang clang-devel

Arch Linux:

sudo pacman -S base-devel clang

环境配置

  1. 创建环境变量文件:
# 创建 .env 文件并配置以下变量
RUST_LOG=info

# Bark App 推送通知配置
BARK_SERVER_URL=http://localhost:18081  # Bark 服务器地址(可选,默认为此值)
BARK_DEVICE_KEY=your-device-key         # Bark 设备密钥(必需)

获取 Bark 设备密钥:

  1. 在 App Store 下载 Bark App
  2. 打开 App,复制显示的设备密钥
  3. 如需自建服务器,参考 Bark 官方文档

本地开发

# 本地运行
make local_run

生产环境

# 构建 Docker 镜像
make image
# 运行容器
make run_container

告警机制

  • 双重限流保护:
    • 短期限流: 每个监控项1小时内最多发送1次告警(防止短时间内重复告警)
    • 每日限流: 每种告警类型每天最多发送3次(防止告警泛滥)
  • 持久化计数: 使用 RocksDB 存储每日告警次数,重启后保持状态
  • 数据存储: 告警计数数据存储在 ./data/alert_throttler/ 目录
  • 独立计时: 不同监控项的告警时间独立计算
  • 详细信息: 推送包含具体数值、变化率、阈值等详细信息
  • 并发执行: 所有监控任务并发执行,互不阻塞
  • 推送方式: 基于 Bark 的 iOS App 推送通知
  • 自动清理: 每天 UTC 午夜自动清理7天前的过期告警记录

自定义配置

修改每日告警限制

默认每种告警类型每天最多发送3次。如需修改,编辑 src/main.rs:

// 修改第二个参数为期望的每日限制次数
let throttler = Arc::new(
    AlertThrottler::new("./data/alert_throttler", 5)  // 改为5次
        .expect("无法初始化告警限流器"),
);

修改监控频率

编辑 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                # 模块导出
    ├── alert_throttler.rs    # 告警限流器(RocksDB)
    ├── bark_notification.rs  # Bark App 推送通知工具
    ├── email_notification.rs # 邮件通知工具(已弃用)
    ├── rate_limiter.rs       # API 限流工具
    └── yahoo_api.rs          # Yahoo Finance API 客户端

添加新的监控模块

  1. 创建新模块文件

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>> {
        // 实现具体的监控逻辑
        // ...
    }
}
  1. 导出新模块

src/monitors/mod.rs 中添加:

pub mod commodity;
  1. 在主程序中使用

src/main.rsmonitors 向量中添加新监控器实例,并在克隆逻辑中添加相应的处理。

常见问题

Q: 编译时报错 'stdbool.h' file not found 或 RocksDB 编译失败?

  • 这是因为缺少 C/C++ 编译工具和开发头文件
  • 解决方法:安装系统依赖(参见"系统依赖"章节)
  • Ubuntu/Debian: sudo apt install -y build-essential clang libclang-dev
  • 安装完成后重新运行 make deps

Q: 为什么没有收到告警推送?

  • 检查 .env 文件中的 Bark 配置是否正确
  • 确认 Bark App 已安装并获取了正确的设备密钥
  • 确认 Bark 服务器地址可访问(自建服务器需确保网络连通)
  • 确认触发条件已满足
  • 查看日志确认是否因1小时限制或每日限制而跳过发送
  • 检查 ./data/alert_throttler/ 目录权限是否正确

Q: 如何查看今日已发送的告警次数?

  • 查看程序日志,每次发送告警时会记录当前计数
  • 告警计数存储在 RocksDB 中,格式为 {资产类型}:{代码}:{日期}

Q: 如何修改检查频率?

  • 修改 main.rs 中的 interval 时间间隔

Q: 能否监控更多资产?

  • 可以,系统支持所有 Yahoo Finance 支持的资产代码
  • main.rsmonitors 向量中添加相应的监控器实例即可
  • 支持的资产类型:股票、指数、加密货币、外汇、ETF等

Q: 如何设置涨幅监控?

  • 将阈值参数设置为正数(如 5.0 表示涨幅超过5%时告警)
  • 适用于外汇、商品等需要监控异常涨幅的场景

Q: 数据源是否可靠?

  • 使用 Yahoo Finance 官方 API,数据质量较高
  • 数据为延迟数据,非交易所实时数据
  • 建议仅作为风险预警参考,不作为实际交易依据

Q: 监控器如何扩展?

  • 系统采用 trait-based 架构,易于扩展
  • 创建新监控器只需实现 Monitor trait
  • 参考 forex.rscrypto.rs 等现有监控器的实现

免责声明: 本系统仅供个人学习和研究使用,不构成任何投资建议。投资有风险,决策需谨慎。

About

一个基于 Rust 的实时金融风险监控系统,自动监控美国国债收益率、外汇、加密货币和股票市场波动。

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors