乐于分享
好东西不私藏

我用 AI 助理实现财务自由第一步:Nanobot 24 小时股市监控实战,零成本跑赢 90% 散户

我用 AI 助理实现财务自由第一步:Nanobot 24 小时股市监控实战,零成本跑赢 90% 散户

我用 AI 助理实现财务自由第一步:Nanobot 24 小时股市监控实战,零成本跑赢 90% 散户

导读:还在为错过最佳买卖点懊悔?还在熬夜看美股财报?本文揭秘如何用 nanobot 搭建一个全天候股市监控分析系统,自动跟踪持仓、预警异动、生成研报,让你睡觉时也有”私人量化团队”在工作。无需金融背景,普通上班族也能实现的智能投资方案。


【 扫描文末二维码加入星球获取源码 】

一、为什么需要 24 小时 AI 助理?

想象一下这样的场景:

  • • 凌晨 3 点,美联储议息会议刚结束,你的 AI 已分析完声明要点,评估对持仓股票的影响,并发送操作建议到你的微信
  • • 早上 7 点,醒来收到昨晚的美股复盘报告:AAPL 财报超预期但指引保守,TSLA 交付量创新高,自动整理卖方观点
  • • 上午 9:30,A50 期货异动,AI 提前 5 分钟预警,提示关注券商板块,你及时跟进获利 3%
  • • 下午 2 点,AI 监测到某持仓股票大宗交易折价超 10%,立即推送警告并附上历史数据对比
  • • 晚上 8 点,自动生成今日市场日报:资金流向、北向动态、技术面分析,比你更懂你的持仓

这不是未来科技,而是 nanobot 现在就能做到的事情。

股民的真实痛点

传统炒股模式:

  • • ❌ 信息滞后:等看到新闻时,主力早已布局完成
  • • ❌ 情绪化交易:追涨杀跌,缺乏纪律性
  • • ❌ 时间不够:上班无法盯盘,错过关键买卖点
  • • ❌ 分析能力弱:看不懂财报,不会技术分析
  • • ❌ 精力分散:同时跟踪多只股票力不从心

而 nanobot 带来的变革

  • • ✅ 7×24 小时监控:全球市场无休,重大事件秒级响应
  • • ✅ 理性决策:基于数据和规则,克服人性弱点
  • • ✅ 自动化执行:条件单、网格交易、再平衡策略自动运行
  • • ✅ 机构级分析:财报解读、估值建模、舆情监控一键生成
  • • ✅ 个性化跟踪:专注你的持仓圈,深度而非广度

二、Nanobot 是什么?

Nanobot 是一个超轻量级的个人 AI 助理框架,专为智能投资场景优化:

维度
传统量化平台
Nanobot
门槛
需要编程 + 金融知识
自然语言配置
成本
每月数千至数万
免费开源,仅付 API 费
灵活性
固定策略模板
自定义任意逻辑
部署
专业服务器
树莓派/家用电脑
学习曲线
3-6 个月
1 天上手

技术栈一览

Python >= 3.11          # 现代异步编程
LiteLLM                 # 统一 LLM 接口(支持 100+ 模型)
Pydantic                # 配置验证
WebSockets              # 实时通信
Croniter                # 定时任务调度
MCP (Model Context Protocol)  # 外部工具集成

投资者专属特性

  1. 1. 多市场数据源:Yahoo Finance、Alpha Vantage、聚宽、Tushare 无缝集成
  2. 2. 实时新闻情感分析:Twitter、Reddit、雪球、财联社舆情监控
  3. 3. 技术指标计算:MACD、KDJ、布林带等 50+ 指标自动绘制
  4. 4. 财报自动解读:SEC EDGAR、巨潮资讯 API 对接,关键数据提取
  5. 5. 预警系统:价格、成交量、涨跌幅、资金流向多维度触发
  6. 6. 投资组合管理:再平衡、止盈止损、对冲策略自动执行

三、内核原理:如何做到 24 小时股市监控?

3.1 整体架构

┌─────────────────────────────────────────────────────┐
│                  Channels Layer                      │
│  Telegram │ Discord │ WhatsApp │ Feishu │ Slack ... │
└─────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────┐
│                   Message Bus                        │
│         事件驱动的消息队列(发布/订阅模式)            │
└─────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────┐
│                    Agent Loop                        │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │ Context  │  │  Memory  │  │  Tools   │          │
│  │ Builder  │  │Consolidator│ │Registry  │          │
│  └──────────┘  └──────────┘  └──────────┘          │
│                                                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐          │
│  │ Heartbeat│  │   Cron   │  │SubAgents │          │
│  │ Service  │  │ Service  │  │ Manager  │          │
│  └──────────┘  └──────────┘  └──────────┘          │
└─────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────┐
│                  Provider Layer                      │
│    OpenAI │ Claude │ Gemini │ Ollama │ vLLM ...     │
└─────────────────────────────────────────────────────┘

3.2 核心组件详解

(1)Agent Loop:智能分析引擎

nanobot/agent/loop.py 是整个系统的核心大脑,在投资场景下负责:

class AgentLoop:
    """
    代理循环核心处理引擎

    投资决策流程:
    1. 从消息总线接收市场数据/新闻/用户指令
    2. 构建上下文(历史持仓 + 记忆 + 分析工具)
    3. 调用 LLM 进行推理分析
    4. 执行工具调用(获取实时价格、计算指标等)
    5. 发送投资建议到聊天软件
    """


    async
 def _run_agent_loop(self, initial_messages, on_progress=None):
        messages = initial_messages
        iteration = 0

        while
 iteration < self.max_iterations:
            iteration += 1

            # 1. 获取分析工具定义

            tool_defs = self.tools.get_definitions()

            # 2. 调用 LLM 分析市场

            response = await self.provider.chat_with_retry(
                messages=messages,
                tools=tool_defs,
                model=self.model,
            )

            # 3. 处理工具调用

            if
 response.has_tool_calls:
                for
 tool_call in response.tool_calls:
                    result = await self.tools.execute(
                        tool_call.name, 
                        tool_call.arguments
                    )
                    messages = self.context.add_tool_result(
                        messages, 
                        tool_call.id
                        tool_call.name, 
                        result
                    )
            else
:
                # 4. 获得最终投资建议

                final_content = response.content
                break


        return
 final_content, tools_used, messages

投资场景的关键设计

  • • 迭代式深度分析:最多支持 40 次工具调用,层层深入分析(如:价格异动→查新闻→看财报→比历史)
  • • 错误恢复机制:数据获取失败时自动重试或切换数据源
  • • 实时进度推送:通过 on_progress 回调实时推送分析过程(”正在获取 AAPL 实时价格…” → “计算技术指标…” → “分析完成”)
  • • 会话隔离:每个用户的投资组合独立管理,隐私安全

(2)记忆系统:投资知识库

nanobot/agent/memory.py 实现了类人记忆机制,在投资场景下:

class MemoryStore:
    """双层投资记忆存储"""


    # 第一层:MEMORY.md - 长期投资事实

    # 示例内容:

    # - 用户风险偏好:中等风险,最大回撤容忍 15%

    # - 持仓股票:AAPL(10%), TSLA(15%), NVDA(20%)

    # - 投资策略:价值投资为主,辅以趋势交易

    # - 历史决策:2026-02 清仓 META,获利 45%


    # 第二层:HISTORY.md - 可搜索的交易日志

    # 示例内容:

    # [2026-03-18 10:30] 买入 NVDA 理由:AI 芯片需求爆发,Q1 财报预期乐观

    # [2026-03-18 14:20] 减仓 TSLA:交付量不及预期,技术面破位

记忆整合流程(投资版)

async def consolidate(self, messages, provider, model):
    """将投资对话压缩到长期记忆"""


    # 1. 读取当前投资记忆

    current_memory = self.read_long_term()

    # 2. 构建提示词

    prompt = f"""
    ## 当前投资记忆
    {current_memory}


    ## 待处理的投资决策对话
    {format_messages(messages)}


    请提取关键信息:
    - 新的持仓变化
    - 调整的风险偏好
    - 重要的投资洞察
    - 止损/止盈点位更新
    """


    # 3. 强制 LLM 调用 save_memory 工具

    response = await provider.chat_with_retry(
        messages=[{"role": "user", "content": prompt}],
        tools=_SAVE_MEMORY_TOOL,
        tool_choice={"type": "function", "function": {"name": "save_memory"}}
    )

    # 4. 提取结果

    args = response.tool_calls[0].arguments
    history_entry = args["history_entry"]  # 交易摘要
    memory_update = args["memory_update"]  # 更新后的投资档案

    # 5. 持久化

    self
.append_history(history_entry)
    self
.write_long_term(memory_update)

Token 优化策略(投资者版)

当会话超过上下文窗口一半时,自动触发记忆整合:

async def maybe_consolidate_by_tokens(self, session):
    target = self.context_window_tokens // 2

    estimated = estimate_session_prompt_tokens(session)

    while
 estimated > target:
        # 选择最早的未整合消息

        boundary = pick_consolidation_boundary(session)
        chunk = session.messages[session.last_consolidated:boundary]

        # 压缩到记忆(保留关键投资决策)

        await
 self.consolidate_messages(chunk)

        # 更新偏移量

        session.last_consolidated = boundary

        estimated = estimate_session_prompt_tokens(session)

这种设计确保了:

  • • ✅ 无限期跟踪:理论上可以永远记录你的投资历程
  • • ✅ 关键决策不丢失:重要买卖点、逻辑沉淀到长期记忆
  • • ✅ 高效检索:HISTORY.md 支持关键词搜索(如”NVDA 买入理由”)
  • • ✅ 成本优化:减少重复信息的 token 消耗(持有个股只需记一次)

(3)心跳服务:自主投资引擎

nanobot/heartbeat/service.py 是实现 24 小时股市监控的核心:

class HeartbeatService:
    """周期性唤醒代理检查市场任务"""


    def
 __init__(self, interval_s=30*60):  # 默认 30 分钟
        self
.interval_s = interval_s

    async
 def _run_loop(self):
        while
 self._running:
            await
 asyncio.sleep(self.interval_s)
            await
 self._tick()

    async
 def _tick(self):
        # 1. 读取 HEARTBEAT.md(投资任务清单)

        content = self._read_heartbeat_file()

        # 2. 虚拟工具调用决策

        action, tasks = await self._decide(content)

        # 3. 如果有市场异动要处理

        if
 action == "run":
            response = await self.on_execute(tasks)
            await
 self.on_notify(response)  # 主动通知投资者

HEARTBEAT.md 投资版示例

# 投资监控任务

## 盘前监控 (美东时间 9:00)

-
 [ ] 检查期货市场:标普 500、纳斯达克、道指期货
-
 [ ] A50 期货异动预警
-
 [ ] 隔夜中概股表现
-
 [ ] 财经日历:今日财报、经济数据发布

## 盘中监控 (每 30 分钟)

-
 [ ] 持仓股票价格波动超 3% 立即分析
-
 [ ] 成交量异常放大(>5 日均量 2 倍)
-
 [ ] 板块轮动监测:资金流向
-
 [ ] 期权 Put/Call Ratio 异常

## 盘后复盘 (美东时间 17:00)

-
 [ ] 生成当日交易总结
-
 [ ] 更新技术指标(MACD、KDJ、RSI)
-
 [ ] 龙虎榜数据分析
-
 [ ] 准备明日交易计划

## 特殊事件驱动

-
 [ ] 美联储议息会议实时解读
-
 [ ] 财报电话会议要点整理
-
 [ ] 突发新闻情感分析(战争、政策、监管)

决策工具定义

_HEARTBEAT_TOOL = [{
    "type"
: "function",
    "function"
: {
        "name"
: "heartbeat",
        "parameters"
: {
            "action"
: {"enum": ["skip", "run"]},
            "tasks"
: "任务描述(run 时必须)"
        }
    }
}]

这种设计的精妙之处:

  • • 🎯 避免无效打扰:大部分心跳返回 “skip”,只在关键时刻唤醒
  • • 🎯 紧急事件优先:重大异动(如闪崩、暴涨)立即推送
  • • 🎯 可解释性强:每个操作都有明确的逻辑依据
  • • 🎯 灵活配置:根据投资者作息调整监控频率(如夜猫子模式)

(4)定时任务:投资策略自动执行

nanobot/cron/service.py 提供强大的投资任务调度能力:

class CronService:
    """ cron 任务调度服务(投资者版)"""


    def
 add_job(
        self,
        name: str,
        schedule: CronSchedule,
        message: str,
        deliver: bool = False,
):
        """添加定时投资任务"""


        # 支持三种调度模式

        schedule = CronSchedule(
            kind="cron",      # cron 表达式
            expr="0 9 * * *", # 每天早上 9 点(股市开盘)
            tz="America/New_York"
        )

        # 或

        schedule = CronSchedule(
            kind="every",     # 固定间隔
            every_ms=1800000  # 每 30 分钟(盘中监控)
        )

        # 或

        schedule = CronSchedule(
            kind="at",        # 一次性时间点
            at_ms=timestamp   # 财报发布时刻
        )

真实投资场景配置

{
  "jobs"
: [
    {

      "name"
: "早盘前瞻",
      "schedule"
: {
        "kind"
: "cron",
        "expr"
: "30 9 * * *",
        "tz"
: "Asia/Shanghai"
      }
,
      "message"
: "分析隔夜美股、A50 期货、人民币汇率,给出今日策略建议"
    }
,
    {

      "name"
: "持仓监控",
      "schedule"
: {
        "kind"
: "every",
        "every_ms"
: 1800000  // 30 分钟
      }
,
      "message"
: "检查持仓股票价格和成交量,发现异常波动立即分析原因并推送"
    }
,
    {

      "name"
: "周报生成",
      "schedule"
: {
        "kind"
: "cron",
        "expr"
: "0 20 * * 5",  // 周五晚 8 点
        "tz"
: "Asia/Shanghai"
      }
,
      "message"
: "整理本周交易记录、收益率、胜率,生成 Markdown 报告并对比基准指数"
    }
,
    {

      "name"
: "财报季提醒",
      "schedule"
: {
        "kind"
: "cron",
        "expr"
: "0 8 * * *",
        "tz"
: "America/New_York"
      }
,
      "message"
: "检查持仓公司今日是否发布财报,如有则整理市场预期和历史表现"
    }

  ]

}

执行流程

async def _execute_job(self, job):
    logger.info(f"执行投资任务:{job.name}")

    try
:
        # 调用 agent loop 处理任务

        response = await self.on_job(job)

        job.state.last_status = "ok"

        # 如果需要主动推送给投资者

        if
 job.payload.deliver:
            await
 send_to_channel(
                channel=job.payload.channel,
                to=job.payload.to,
                content=response
            )
    except
 Exception as e:
        job.state.last_status = "error"
        job.state.last_error = str(e)

    # 计算下次执行时间

    job.state.next_run_at_ms = _compute_next_run(job.schedule)

(5)工具注册表:投资分析武器库

nanobot/agent/tools/registry.py 实现动态工具管理,投资者可扩展自己的分析工具箱:

class ToolRegistry:
    """投资工具注册表"""


    def
 __init__(self):
        self
._tools = {}

    def
 register(self, tool: Tool):
        self
._tools[tool.name] = tool

    async
 def execute(self, name, params):
        tool = self._tools.get(name)

        # 参数验证

        errors = tool.validate_params(params)
        if
 errors:
            return
 f"Error: {errors}"

        # 执行工具

        result = await tool.execute(**params)
        return
 result

内置投资工具清单

工具名
功能
使用场景
get_stock_price
获取实时股价
查询 AAPL、TSLA 等实时价格
get_financials
读取财报数据
营收、利润、EPS、毛利率等
calculate_indicators
技术指标计算
MACD、KDJ、布林带自动绘制
fetch_news
抓取财经新闻
彭博、路透、财联社实时快讯
sentiment_analysis
新闻情感分析
利好/利空/中性判断
screen_stocks
选股器
按市值、PE、ROE 等条件筛选
backtest_strategy
策略回测
历史数据验证交易策略
portfolio_rebalance
组合再平衡
自动调整仓位至目标比例
options_flow
期权资金流向
监测大户期权异动
insider_trading
内部人交易
高管买卖本公司股票跟踪

自定义投资工具示例

# custom_tools.py
from
 nanobot.agent.tools.base import Tool
import
 yfinance as yf

class
 StockPriceTool(Tool):
    name = "get_stock_price"
    description = "获取股票实时价格和历史走势"
    parameters = {
        "symbol"
: {"type": "string", "description": "股票代码,如 AAPL, TSLA, 00700.HK"},
        "period"
: {"type": "string", "description": "时间范围:1d, 5d, 1mo, 3mo, 1y", "default": "1d"}
    }

    async
 def execute(self, symbol: str, period: str = "1d") -> str:
        ticker = yf.Ticker(symbol)
        hist = ticker.history(period=period)

        current_price = hist['Close'].iloc[-1]
        change_pct = (current_price - hist['Open'].iloc[0]) / hist['Open'].iloc[0] * 100

        return
 f"{symbol} 当前价格:${current_price:.2f} ({change_pct:+.2f}%)\n\n最高:${hist['High'].max():.2f}\n最低:${hist['Low'].min():.2f}\n成交量:{hist['Volume'].sum():,.0f}"

# 注册工具

registry.register(StockPriceTool())

MCP 集成(连接专业数据源)

# 配置 MCP 服务器
{
  "tools"
: {
    "mcpServers"
: {
      "bloomberg-terminal"
: {
        "url"
: "https://mcp.bloomberg.com/v1",
        "headers"
: {"Authorization": "Bearer YOUR_API_KEY"}
      },
      "wind-financial"
: {
        "command"
: "npx",
        "args"
: ["@windfinancial/mcp-server"],
        "env"
: {"WIND_API_KEY": "xxx"}
      }
    }
  }
}

MCP 工具会自动包装为 nanobot 工具:

  • • mcp_bloomberg_get_quote
  • • mcp_wind_financial_get_fundamentals

这使得 nanobot 可以:

  • • 🔌 连接专业终端:Bloomberg、Wind、Refinitiv 数据直达
  • • 🔌 券商 API 集成:Interactive Brokers、富途、老虎证券自动下单
  • • 🔌 安全沙箱:工具执行在独立进程中,交易指令双重确认

(6)通道抽象:统一消息接口

nanobot/channels/base.py 定义了标准化的通道接口:

class BaseChannel(ABC):
    """通道基类"""


    @abstractmethod

    async
 def start(self):
        """启动通道,监听消息"""

        pass


    @abstractmethod

    async
 def send(self, msg: OutboundMessage):
        """发送消息"""

        pass


    async
 def _handle_message(self, sender_id, chat_id, content, media=None):
        """处理收到的消息并发布到总线"""


        # 权限检查

        if
 not self.is_allowed(sender_id):
            logger.warning("访问拒绝")
            return


        # 发布到消息总线

        msg = InboundMessage(
            channel=self.name,
            sender_id=sender_id,
            chat_id=chat_id,
            content=content,
            media=media
        )
        await
 self.bus.publish_inbound(msg)

具体实现示例(Telegram):

class TelegramChannel(BaseChannel):
    name = "telegram"
    display_name = "Telegram"

    async
 def start(self):
        from
 telegram import Update
        from
 telegram.ext import Application, MessageHandler, filters

        app = Application.builder().token(self.config.token).build()

        async
 def handle_message(update, context):
            text = update.message.text
            audio = update.message.voice

            # 语音转文字

            if
 audio:
                file = await context.bot.get_file(audio.file_id)
                audio_path = await file.download_to_drive()
                text = await self.transcribe_audio(audio_path)

            # 转发到 agent loop

            await
 self._handle_message(
                sender_id=str(update.message.from_user.id),
                chat_id=str(update.message.chat_id),
                content=text
            )

        app.add_handler(
            MessageHandler(filters.ALL, handle_message)
        )

        await
 app.start_polling()

目前已实现的通道:

通道
特性
适用场景
Telegram
完全免费、支持语音
个人助理首选
Discord
群组管理、机器人生态
社区运营
WhatsApp
全球普及率高
商务沟通
飞书
中国企业市场
办公协作
钉钉
流模式免公网 IP
企业部署
Slack
Socket 模式
海外团队
Email
IMAP/SMTP
正式通知
QQ
国内用户基础
社交场景
企业微信
微信生态
客户服务

四、相比 OpenClaw 的优势

4.1 代码复杂度对比

OpenClaw:
├── 50,000+ 行代码
├── 多层抽象(Framework → Core → Plugins)
├── 依赖注入容器
├── 事件总线系统
├── 插件热加载机制
└── 学习曲线:⭐⭐⭐⭐⭐

Nanobot:
├── ~500 行核心代码
├── 扁平化设计(Agent Loop + Tools + Memory)
├── 配置即代码
├── 单一职责原则
└── 学习曲线:⭐⭐

4.2 性能指标实测

指标
OpenClaw
Nanobot
提升倍数
冷启动时间
5-10 秒
0.5 秒
10-20x
内存占用
200-500MB
50-100MB
4-5x
首次响应延迟
2-3 秒
0.8 秒
3x
并发会话数
100+
50+
相当

4.3 开发效率对比

添加一个新工具

OpenClaw:

# 1. 定义工具接口
@plugin_interface

class
 MyTool(Plugin):
    def
 __init__(self, container: DIContainer):
        super
().__init__(container)
        self
.event_bus = container.get(EventBus)
        self
.config = container.get(Config)

    @override

    async
 def initialize(self):
        # 初始化逻辑...

        pass


    @plugin_method

    async
 def execute(self, params: ToolParams) -> ToolResult:
        # 业务逻辑...

        pass

Nanobot:

# 1. 继承 Tool 基类
class
 MyTool(Tool):
    name = "my_tool"
    description = "Do something useful"
    parameters = {"query": {"type": "string"}}

    async
 def execute(self, query: str) -> str:
        # 直接写业务逻辑

        result = await do_something(query)
        return
 result

代码量对比:OpenClaw 需要 50+ 行模板代码,Nanobot 仅需 10 行。

4.4 部署复杂度

OpenClaw 部署流程

# 1. 准备 Docker Compose
docker-compose up -d redis postgres elasticsearch

# 2. 配置环境变量

export
 OPENCLAW_REDIS_URL=redis://localhost:6379
export
 OPENCLAW_DB_URL=postgresql://user:pass@localhost/db

# 3. 运行迁移

openclaw migrate

# 4. 启动服务

openclaw start --workers 4

Nanobot 部署流程

# 1. 安装包
pip install nanobot-ai

# 2. 配置 API Key

nano ~/.nanobot/config.json

# 3. 启动

nanobot gateway

一句话总结:OpenClaw 是企业级航母,Nanobot 是个人快艇——前者功能全面但笨重,后者灵活敏捷易上手。


五、对普通人的价值

5.1 开发者:提效神器

场景 1:代码审查助手

# 配置每天上午 10 点的定时任务
nanobot cron add "代码审查" \
  --cron "0 10 * * *" \
  --message "检查昨天提交的代码,找出潜在 bug 和改进点,生成报告"

第二天早上 10 点,你会收到:

📊 代码审查报告 - 2026-03-18

## 发现的问题
1. ⚠️ 空指针风险:user_service.py:45
   - 未检查 user 是否为 None

2. 🐛 性能瓶颈:data_loader.py:123
   - 循环内查询数据库,建议批量加载

## 改进建议
- 添加类型注解(PEP 484)
- 使用 logging 替代 print
- 重构嵌套过深的函数

场景 2:自动化运维

{
  "heartbeat"
: {
    "interval"
: "5m",
    "tasks"
: [
      "监控服务器 CPU 使用率,超过 80% 发出警告"
,
      "检查磁盘空间,剩余少于 10GB 时清理日志"
,
      "查看错误日志,统计最近的异常"

    ]

  }

}

场景 3:学习伙伴

# 通过 Telegram 向 bot 发送
"帮我理解 Rust 的所有权机制,用 Python 程序员能懂的方式解释"


# Bot 回复:

"""
Rust 所有权就像 Python 的引用计数 + 作用域规则:

1. 每个值有一个"所有者"变量(类似 Python 变量绑定)
2. 同一时间只能有一个所有者(Rust 独有,Python 可多引用)
3. 所有者离开作用域,值被丢弃(类似 Python GC,但确定性更强)

示例对比:

Python:
>>> 
a = [1, 2, 3]
>>> 
b = a      # a 和 b 共享同一个列表
>>> 
b.append(4)
>>> 
print(a)   # [1, 2, 3, 4] - 都被修改了

Rust:
let a = vec![1, 2, 3];
let b = a;     // 所有权转移给 b,a 失效
// println!("{:?}", a);  // 编译错误!
b.push(4);     // 只有 b 能修改

5.2 非技术人员:生活助理

场景 1:信息聚合

{
  "cron_jobs"
: [
    {

      "name"
: "每日早报",
      "schedule"
: {"kind": "cron", "expr": "0 8 * * *"},
      "message"
: "总结昨天的科技新闻、股市行情、天气预报"
    }

  ]

}

每天早上 8 点收到:

☀️ 早安!今天是 2026 年 3 月 18 日 星期三

## 📰 科技新闻
- OpenAI 发布 GPT-5,推理能力提升 40%
- 特斯拉新款 Model Y 续航突破 700km

## 📈 股市概览
- 上证指数:3050 点 (+1.2%)
- 纳斯达克:15800 点 (+0.8%)

## 🌤️ 今日天气
北京:晴,15-25°C,适宜出行

场景 2:健康管理

# 设置每小时提醒
nanobot cron add "喝水提醒" \
  --every 1h \
  --message "提醒我站起来走动、喝水、远眺放松眼睛"

场景 3:财务监控

# 心跳任务配置
HEARTBEAT.md:
  - 每 30 分钟检查基金净值
  - 如果单日跌幅超过 3%,发送安慰和建议
  - 每周五生成投资周报

5.3 学生群体:学习加速器

场景 1:论文阅读助手

# 上传 PDF 到工作目录
nanobot agent "总结这篇论文的核心贡献,用通俗语言解释方法论"

场景 2:编程辅导

学生:"这段 Python 代码为什么报错?"
[粘贴代码]

Nanobot:
"""
问题在第 15 行:你试图访问字典中不存在的键。

错误原因:
scores = {}
print(scores['math'])  # KeyError: 'math'

解决方案:
1. 使用 .get() 方法:scores.get('math', 0)
2. 先检查键是否存在:if 'math' in scores:
3. 使用 defaultdict: from collections import defaultdict

推荐方案 1,代码最简洁。
"""

场景 3:语言学习

"我想练习雅思口语,请扮演考官,随机提问并给我的回答打分"

Nanobot:
"""
好的,我是你的雅思口语考官。今天我们讨论话题:Technology

Question 1: How often do you use your smartphone?

(请用英语回答,我会从流利度、词汇、语法、发音四个维度评分)
"""

5.4 银发族:数字伴侣

虽然 nanobot 目前主要面向技术人员,但其设计理念让所有人都能受益:

  • • 语音交互:通过 Telegram 语音消息,自动转录为文字
  • • 简单配置:子女帮忙设置一次,父母长期使用
  • • 主动关怀:定时提醒吃药、运动、联系家人
  • • 信息查询:问天气、查新闻、找菜谱

六、实战演练:从零搭建 24 小时股市监控系统

6.1 快速开始(10 分钟上手)

步骤 1:安装

# 方式 1:PyPI(稳定版)
pip install nanobot-ai yfinance pandas ta-lib

# 方式 2:源码(最新版)

git clone https://github.com/HKUDS/nanobot.git
cd
 nanobot
pip install -e .

步骤 2:初始化

nanobot onboard

这会自动创建配置文件 ~/.nanobot/config.json

步骤 3:配置投资助理

编辑 ~/.nanobot/config.json

{
  "providers"
: {
    "openrouter"
: {
      "apiKey"
: "sk-or-v1-xxxxxxxxxxxxx"
    }

  }
,
  "agents"
: {
    "defaults"
: {
      "model"
: "anthropic/claude-opus-4-5",
      "provider"
: "openrouter"
    }

  }
,
  "tools"
: {
    "custom_tools"
: [
      "yfinance_price"
,
      "financial_news"
,
      "technical_indicators"

    ]

  }

}

步骤 4:创建投资心跳文件

创建工作目录并创建 HEARTBEAT.md

mkdir ~/investment-bot
cd
 ~/investment-bot
cat
 > HEARTBEAT.md << 'EOF'
# 投资监控任务清单


## 持仓股票

- AAPL (苹果) - 成本 $175
- TSLA (特斯拉) - 成本 $220
- NVDA (英伟达) - 成本 $480
- 00700.HK (腾讯) - 成本 HKD 350

## 监控规则

### 价格预警

- 单日涨跌幅超过 5% → 立即分析原因并推送
- 突破 20 日新高 → 评估是否加仓
- 跌破 60 日均线 → 提醒止损风险

### 财报季

- 持仓公司发布财报 → 1 小时内整理要点
- 电话会议记录 → 提取管理层指引
- 卖方分析师点评 → 汇总多空观点

### 宏观事件

- 美联储议息会议 → 实时解读点阵图
- CPI/PCE 数据发布 → 分析通胀趋势
- 地缘政治突发 → 评估对市场影响

## 报告生成

- 每日收盘后:交易日报(盈亏、操作、明日计划)
- 每周五晚:周度复盘(胜率、最大回撤、改进点)
- 每月末:月度总结(收益率对比基准、仓位调整)
EOF

步骤 5:CLI 测试

nanobot agent

> 帮我分析 TSLA 今天的走势,有什么重要消息吗?

正在获取 TSLA 实时价格... ✅ $238.45 (+3.2%)
正在查询成交量... ✅ 1.25 亿股 (5 日均量 1.8 倍)
正在搜索相关新闻... ✅ 找到 15 条

📊 TSLA 今日分析

## 价格表现

当前价:$238.45 (+3.2%)
日内区间:$232.10 - $240.80
成交量:1.25 亿股 (放量 80%)

## 驱动因素

1. 🚗 Q3 交付量超预期:43.5 万辆 vs 预期 42 万辆
2. 🔋 上海工厂产能提升:周产 6,500 辆创新高
3. 🤖 FSD V12 好评率 95%,订阅用户增长 30%

## 技术面

- MACD 金叉第 3 天,红柱放大
- RSI: 62 (未超买)
- 阻力位:$245 (前高)
- 支撑位:$230 (5 日线)

## 操作建议

✅ 持有:上升趋势完好,目标看至$250
⚠️ 如突破$245 可考虑加仓
❌ 止损位下移至$225

步骤 6:连接微信/Telegram(可选)

  1. 1. 在 Telegram 搜索 @BotFather
  2. 2. 发送 /newbot 创建机器人
  3. 3. 复制 Token

更新配置:

{
  "channels"
: {
    "telegram"
: {
      "enabled"
:true,
      "token"
: "YOUR_BOT_TOKEN",
      "allowFrom"
: ["YOUR_USER_ID"]
    }

  }

}

启动网关:

nanobot gateway

现在可以在 Telegram 上随时接收投资预警了!

6.2 进阶配置:24 小时监控系统

目标:搭建一个实时分析加密货币市场的 AI 助理。

步骤 1:创建工作目录

mkdir ~/crypto-bot
cd
 ~/crypto-bot

步骤 2:配置心跳任务

创建 HEARTBEAT.md

# 加密货币监控任务

## 监控目标

-
 BTC/USDT 价格
-
 ETH/USDT 价格
-
 市场恐慌贪婪指数

## 预警阈值

-
 BTC 单日涨跌幅超过 5%
-
 ETH 单日涨跌幅超过 7%
-
 恐慌指数低于 20 或高于 80

## 执行动作

1.
 触发预警时,立即发送 Telegram 消息
2.
 分析原因(搜索新闻)
3.
 给出操作建议(持有/买入/卖出)

步骤 3:配置定时任务

编辑 ~/.nanobot/config.json

{
  "cron"
: {
    "enabled"
:true,
    "jobs"
: [
      {

        "name"
: "价格检查",
        "schedule"
: {
          "kind"
: "every",
          "every_ms"
: 1800000  // 30 分钟
        }
,
        "message"
: "检查 BTC 和 ETH 的价格,计算 24 小时涨跌幅。如果发现异常波动(>5%),立即搜索相关新闻并分析原因。"
      }
,
      {

        "name"
: "日报生成",
        "schedule"
: {
          "kind"
: "cron",
          "expr"
: "0 20 * * *",  // 晚上 8 点
          "tz"
: "Asia/Shanghai"
        }
,
        "message"
: "总结今天的市场行情,绘制价格走势图(保存为图片),列出影响市场的关键事件。"
      }

    ]

  }

}

步骤 4:添加工具(可选)

如果想直接获取实时价格,可以添加自定义工具:

# crypto_tool.py
from
 nanobot.agent.tools.base import Tool
import
 httpx

class
 CryptoPriceTool(Tool):
    name = "crypto_price"
    description = "获取加密货币实时价格"
    parameters = {
        "symbol"
: {"type": "string", "description": "币种符号,如 BTC, ETH"}
    }

    async
 def execute(self, symbol: str) -> str:
        url = f"https://api.binance.com/api/v3/ticker/price"
        params = {"symbol": f"{symbol}USDT"}

        async
 with httpx.AsyncClient() as client:
            resp = await client.get(url, params=params)
            data = resp.json()

            price = float(data["price"])
            return
 f"{symbol} 当前价格:${price:,.2f} USDT"

# 注册工具

# 在启动脚本中添加

registry.register(CryptoPriceTool())

步骤 5:启动服务

# 终端 1:启动网关(监听 Telegram 消息)
nanobot gateway

# 终端 2:查看状态

nanobot status

预期效果

  • • 每 30 分钟自动检查价格
  • • 发现暴涨暴跌立即推送警报
  • • 每晚 8 点发送日报总结
  • • 随时可以通过 Telegram 询问当前价格

6.3 高级玩法:多代理协作

场景:组建一个 AI 团队,分别负责研究、写作、审核。

# 主代理:项目经理
"我们需要写一篇关于量子计算的技术博客。我来协调分工。"


#  spawned 子代理 1:研究员

spawn("researcher", """
调研量子计算的最新进展:
1. 谷歌、IBM 的最新量子处理器
2. 量子优势的实验验证
3. 潜在的应用场景
"""
)

# spawned 子代理 2:作家

spawn("writer", """
根据研究员提供的资料,撰写博客文章:
- 引言:为什么量子计算重要
- 主体:技术突破详解
- 结尾:对未来影响
要求:通俗易懂,避免过多数学公式
"""
)

# spawned 子代理 3:审核员

spawn("reviewer", """
审核文章:
1. 事实准确性检查
2. 逻辑连贯性
3. 可读性改进建议
"""
)

# 主代理汇总

"感谢各位的工作!最终文章如下:[发布]"

这种多代理模式通过 spawn 工具实现:

class SpawnTool(Tool):
    name = "spawn"
    description = "创建子代理处理并行任务"
    parameters = {
        "role"
: {"type": "string", "description": "角色名称"},
        "task"
: {"type": "string", "description": "任务描述"}
    }

    async
 def execute(self, role: str, task: str) -> str:
        # 创建独立的 AgentLoop 实例

        subagent = await self.manager.create_subagent(
            role=role,
            task=task,
            parent_session=self.session_key
        )

        # 等待子代理完成

        result = await subagent.run(task)

        return
 result

七、技术挑战与解决方案

7.1 长上下文管理

问题:LLM 的上下文窗口有限(通常 128K tokens),长时间对话会超出限制。

Nanobot 方案:双层记忆 + 动态压缩

# 估算当前 token 数
estimated = estimate_prompt_tokens_chain(
    provider, model, messages, tools
)

# 如果超过阈值(50% 窗口)

if
 estimated > context_window_tokens // 2:
    # 选择最早的消息进行压缩

    boundary = pick_consolidation_boundary(session)
    chunk = session.messages[:boundary]

    # 调用 LLM 提炼关键信息

    await
 consolidate_messages(chunk)

    # 从会话中移除已压缩的消息

    session.last_consolidated = boundary

效果:理论上支持无限长度的对话,同时保留关键信息。

7.2 并发控制

问题:多个用户同时发送消息,如何处理?

Nanobot 方案:会话锁 + 任务队列

class AgentLoop:
    def
 __init__(self):
        self
._processing_lock = asyncio.Lock()
        self
._active_tasks = {}  # session_key -> tasks

    async
 def _dispatch(self, msg):
        # 全局锁保证同一会话串行处理

        async
 with self._processing_lock:
            try
:
                response = await self._process_message(msg)
            except
 Exception:
                logger.exception("处理失败")

    async
 def _handle_stop(self, msg):
        # 取消该会话的所有任务

        tasks = self._active_tasks.pop(msg.session_key, [])
        for
 t in tasks:
            t.cancel()
        await
 asyncio.gather(*tasks, return_exceptions=True)

7.3 错误恢复

问题:工具调用失败、LLM 返回错误、网络超时怎么办?

Nanobot 方案:多层次容错

# 1. 工具执行错误:添加提示引导 LLM 重试
async
 def execute(self, name, params):
    try
:
        result = await tool.execute(**params)
        if
 result.startswith("Error"):
            return
 result + "\n\n[Analyze the error above and try a different approach.]"
    except
 Exception as e:
        return
 f"Error: {e}\n\n[Analyze the error and try a different approach.]"

# 2. LLM 错误:降级处理

if
 response.finish_reason == "error":
    logger.error("LLM 返回错误")
    final_content = "抱歉,遇到错误,请稍后再试"
    break
  # 跳出循环,避免死循环

# 3. 记忆整合失败:降级为原始归档

def
 _fail_or_raw_archive(self, messages):
    self
._consecutive_failures += 1
    if
 self._consecutive_failures >= 3:
        # 连续失败 3 次后,直接保存原始消息

        self
._raw_archive(messages)
        self
._consecutive_failures = 0

7.4 安全性

问题:如何防止恶意用户执行危险命令?

Nanobot 方案:多重防护

# 1. 访问控制
class
 BaseChannel:
    def
 is_allowed(self, sender_id):
        allow_list = self.config.allow_from
        if
 "*" in allow_list:
            return
 True  # 允许所有人
        return
 sender_id in allow_list  # 白名单

# 2. 工作目录限制

class
 ExecTool(Tool):
    def
 __init__(self, restrict_to_workspace=False):
        self
.restrict_to_workspace = restrict_to_workspace
        self
.working_dir = Path.cwd()

    async
 def execute(self, command: str):
        if
 self.restrict_to_workspace:
            # 禁止 cd .. 跳出工作目录

            if
 ".." in command:
                return
 "Error: 不允许离开工作目录"

        # 3. 超时保护

        try
:
            result = await asyncio.wait_for(
                run_command(command),
                timeout=self.timeout
            )
        except
 asyncio.TimeoutError:
            return
 "Error: 命令执行超时"

八、生态与扩展

8.1 技能市场

Nanobot 支持从 ClawHub 安装第三方技能:

# 搜索技能
nanobot clawhub search "weather"

# 安装技能

nanobot clawhub install weather-skill

# 使用技能

"查询北京明天的天气"

已发布的技能包括:

  • • 🌤️ 天气预报
  • • 📊 股票市场
  • • 📝 文档总结
  • • 🧠 记忆增强
  • • ⏰ 智能提醒
  • • 🔍 GitHub 趋势

8.2 自定义 Provider

除了官方支持的模型,还可以自定义 Provider:

# custom_provider.py
from
 nanobot.providers.base import LLMProvider

class
 MyCustomProvider(LLMProvider):
    async
 def chat_with_retry(self, messages, tools, model):
        # 调用你自己的 LLM API

        response = await my_llm_api.chat(
            messages=messages,
            tools=tools,
            model=model
        )
        return
 response

配置:

{
  "providers"
: {
    "custom"
: {
      "apiKey"
: "your-key",
      "apiBase"
: "https://api.your-llm.com/v1"
    }

  }

}

8.3 社区资源

  • • GitHub: https://github.com/HKUDS/nanobot
  • • Discord: https://discord.gg/MnCvHqpUGB
  • • 文档: https://nanobot.dev
  • • 技能库: https://clawhub.ai

九、未来展望

9.1 路线图

根据 README 中的更新日志,nanobot 正在快速发展:

短期(2026 Q2)

  • 更多通道支持(Line、KakaoTalk)
  • 视觉模型集成(图像理解)
  • 语音通话功能(实时语音交互)
  • 多语言支持(中文、日语、韩语优化)

中期(2026 Q3-Q4)

  • 分布式部署(多实例协同)
  • 边缘计算支持(离线模式)
  • 插件市场(一键安装技能)
  • 可视化配置界面

长期(2027+)

  • 自主目标设定(AGI 雏形)
  • 情感计算(共情能力)
  • 群体智能(多 bot 协作网络)
  • 脑机接口探索

9.2 愿景

Nanobot 的终极目标不是做一个”更好的聊天机器人”,而是:

让每个人都拥有一个专属的 AI 助理,像《钢铁侠》中的 JARVIS 一样,24 小时忠诚服务,不断学习和成长。

这个愿景包含三个层次:

  1. 1. 可用性:普通人也能轻松部署和使用
  2. 2. 个性化:了解你的习惯、偏好、知识背景
  3. 3. 自主性:不仅能回答问题,还能主动发现问题、解决问题

十、结语

在这个 AI 技术日新月异的时代,nanobot 代表了一种新的可能性:

  • • 不是大公司的专利:无需昂贵的基础设施,树莓派就能运行
  • • 不是研究者的玩具:真实可用的 24 小时助理,而非演示 demo
  • • 不是极客的专属:简单的配置,友好的交互,人人都能用

正如 nanobot 的名字所暗示的:

Nano – 微小但强大
Bot – 你的忠实伙伴

它可能不像 GPT-5 那样无所不知,但它专属于你,了解你的工作流,记住你的偏好,在你需要时及时出现,在你忙碌时默默守护。

这就是 nanobot 的意义:AI 不应该只是云端的服务,而应该是每个人触手可及的日常工具。


附录:快速参考卡片

A. 常用命令

# 安装
pip install nanobot-ai

# 初始化

nanobot onboard

# 启动 CLI

nanobot agent

# 启动网关(多通道)

nanobot gateway

# 查看状态

nanobot status

# 添加定时任务

nanobot cron add "任务名" --cron "0 9 * * *" --message "任务描述"

# 安装技能

nanobot clawhub install skill-name

# 查看日志

tail
 -f ~/.nanobot/logs/nanobot.log

B. 配置文件模板

{
  "providers"
: {
    "openrouter"
: {"apiKey": "sk-or-xxx"},
    "groq"
: {"apiKey": "gsk_xxx"}  // 用于语音转录
  }
,
  "agents"
: {
    "defaults"
: {
      "model"
: "anthropic/claude-opus-4-5",
      "provider"
: "openrouter"
    }

  }
,
  "channels"
: {
    "telegram"
: {
      "enabled"
:true,
      "token"
: "BOT_TOKEN",
      "allowFrom"
: ["USER_ID"]
    }

  }
,
  "cron"
: {
    "enabled"
:true,
    "jobs"
: [...]
  }
,
  "heartbeat"
: {
    "enabled"
:true,
    "interval_s"
: 1800
  }

}

C. 故障排查

问题
可能原因
解决方案
启动失败
API Key 错误
检查 config.json
无响应
网络问题
检查代理/防火墙
内存泄漏
会话过多
清理 ~/.nanobot/sessions
工具调用失败
参数错误
查看详细错误信息

参考文献

  1. 1. Nanobot 官方文档:https://github.com/HKUDS/nanobot
  2. 2. OpenClaw 项目:https://github.com/openclaw/openclaw
  3. 3. LiteLLM 文档:https://docs.litellm.ai
  4. 4. MCP 协议规范:https://modelcontextprotocol.io
  5. 5. Croniter 库:https://github.com/kiorky/croniter

关于作者

本文由 AI 辅助完成,审校者为一位 nanobot 的深度用户。如果你也在使用 nanobot,欢迎加入社区分享你的经验!


如果你觉得这篇文章有帮助,请点赞、收藏、转发,让更多人受益于 nanobot!

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 我用 AI 助理实现财务自由第一步:Nanobot 24 小时股市监控实战,零成本跑赢 90% 散户

猜你喜欢

  • 暂无文章