2025年6月

在旅途中重新遇见你 —— 2025上海亲子之行

一、出发:一场计划已久的父子旅行

这个夏天,兑现了和薯条去年的承诺,我带着儿子踏上了一趟前往上海的亲子旅行。没有太多复杂的行程安排,也不是为了打卡名胜,只是想在他还愿意牵我手的年纪,多留下一些只属于我们两个人的回忆。

薯条5岁开始,只要每年条件允许,我都会和老婆孩子计划一次旅行,去年新加坡旅行回来,薯条最大的愿望就是今年去上海海昌看虎鲸,于是今年我们踏上了上海之旅,带他去看我10年前看过的上海,璀璨的东方明珠,人群熙攘的外滩,新旧相互辉映的万国建筑群,可爱的虎鲸。

二、旅途中:他的眼睛比景色更动人

第一站我们去了上海自然博物馆,一进去他就像脱缰的小马,看到任何东西都充满着好奇,大大小小,历史悠久的动植物标本让他目不暇接,我们还预订了两场电影,“蛟龙入海” 他感受到了海洋的深不可测和生物的多彩多样,“大象”

此次旅行中,他问了我很多问题,上至天文,下至地理,深至科学的尽头,我不知道怎么解释那些复杂的原理,但我知道,我应该鼓励他的每一个小问号。

最后一站我们去了海昌海洋动物园,在那里他看到了心心念念的虎鲸,之前一直喜欢读海洋类的百科全书,入金各种
他眼里的世界那么新鲜,那么有趣。那一刻,我忽然意识到,我们总以为是我们带孩子去认识世界,其实,是他们帮我们重新认识了世界。

三、小意外:他在成长,我在学习放手

在旅行的途中,每次参观景点或者是坐地铁过安检时,他总是抢着需要自己处理自己的行李或者是自己去看路牌找厕所,而我总是不经意间和他说,哎呀,让爸爸来,但是我忽略了一点,他慢慢长大了,原来他早就不再需要时时刻刻的保护,而我却还停留在他牙牙学语时的模样。我们都在成长,只是我得学会——适当的放手,也是深情的陪伴。“他终究在慢慢长大”

四、回望:这一趟,不只是去旅行

回程的飞机上,他靠着我睡着了,疲惫且惬意。我看着他逐渐褪去稚气的脸,心里百感交集。

也许这趟旅行以后,他会去得越来越远,我牵他的时间会越来越短。但我相信,在他心里,会有一个地方,永远记得——爸爸曾经陪他一起看过城市的灯光,一起走过陌生的街巷,一起欢笑、迷路、吃甜筒。

旅行结束了,但他今年要当哥哥的故事,才即将要开始。

五、结语:愿未来,我们都不缺“在一起”的时光

这趟亲子旅行让我重新认识了儿子,也让我意识到:孩子最需要的,不是父母完美无缺,而是那份真实而专注的陪伴。

生活再忙,也别错过和孩子一起走过的一段路。因为有些风景,只适合牵着他们的小手去看;有些话,只能在一场旅途中才说得出口。

愿我们都能在成长的路上,彼此靠近,彼此理解。那份属于父子间的默契和温暖,是世界上最不该被辜负的风景。
微信图片_20250624133357.jpg

🚀 实战精讲:一分钟数据也能玩转的 RSI 增量更新技术


在量化交易中,RSI(相对强弱指数) 是一项经典且高效的动量指标。但对于分钟线、秒线等高频数据场景,传统的 RSI 算法存在效率瓶颈,尤其是在实时系统中反复扫描历史K线极其不划算。

本篇文章,我们将系统性讲解一种基于平均涨跌幅的 RSI 增量更新算法,并结合实盘中常见的多币种管理、风控联动等场景,逐步构建一套高性能 RSI 技术体系。


📘 RSI 的基本原理回顾

RSI 的经典计算公式为:

RSI = 100 - 100 / (1 + RS)
RS = 平均上涨幅度 / 平均下跌幅度

其中,“平均”一般采用 N 日(或 N 根K线) 的移动平均值,常用周期为 6、14、21 等。


🎯 实战问题:分钟线数据如何高效计算 RSI?

在高频场景下,例如:

  • 加密货币:全天 1440 根 1min K线
  • 美股分钟线:每个交易日约 390 根
  • 高频策略:每秒响应一次行情更新

我们若用全量遍历方式去计算 RSI,不仅性能开销大,而且不具备持续性。


✅ 增量更新方案:仅需保存 avgGain 和 avgLoss!

1. 初始化阶段(N 个数据)

先计算 N 根K线的平均涨幅、跌幅(SMA):

avgGain₀ = sum(gains) / N
avgLoss₀ = sum(losses) / N

2. 实时更新阶段(从 N+1 开始)

只需使用上一时刻的 avgGainavgLoss,加上当前一根K线的涨跌值,使用递推公式更新:

avgGainₙ = (PrevAvgGain * (N - 1) + 当前Gain) / N
avgLossₙ = (PrevAvgLoss * (N - 1) + 当前Loss) / N

再将其带入 RSI 公式即可得到最新值。


🧩 多币种实时 RSI 追踪器(PHP 实战)

我们将 RSI 更新器封装成类,每个交易对(symbol)拥有一个独立实例。

class RSITracker {
    private int $period;
    private float $avgGain = 0.0;
    private float $avgLoss = 0.0;
    private ?float $lastClose = null;
    private int $initCount = 0;

    public function __construct(int $period = 6) {
        $this->period = $period;
    }

    public function update(float $close): ?float {
        if (is_null($this->lastClose)) {
            $this->lastClose = $close;
            return null;
        }

        $delta = $close - $this->lastClose;
        $gain = max($delta, 0);
        $loss = max(-$delta, 0);
        $this->lastClose = $close;

        if ($this->initCount < $this->period) {
            $this->avgGain = ($this->avgGain * $this->initCount + $gain) / ($this->initCount + 1);
            $this->avgLoss = ($this->avgLoss * $this->initCount + $loss) / ($this->initCount + 1);
            $this->initCount++;
            return null;
        }

        $this->avgGain = ($this->avgGain * ($this->period - 1) + $gain) / $this->period;
        $this->avgLoss = ($this->avgLoss * ($this->period - 1) + $loss) / $this->period;

        if ($this->avgLoss == 0) return 100.0;

        $rs = $this->avgGain / $this->avgLoss;
        return round(100 - 100 / (1 + $rs), 2);
    }
}

📦 多币种支持示例

foreach ($symbols as $symbol) {
    $trackers[$symbol] = new RSITracker(6);
}

$trackers['BTC-USDT']->update($close);

⚙️ 风控联动机制

  • RSI > 70 → 超买,触发止盈或做空提示
  • RSI < 30 → 超卖,触发抄底或买入提示
  • 可设置状态锁防止重复触发,回归 30~70 后解锁

🔌 可接入的实战系统

模块接入方式说明
OKX / Binance 行情WebSocket 每分钟推送收盘价
Webman 系统注册为定时或事件驱动组件
Redis 缓存保存 RSI 状态,跨进程共享
策略联动RSI 信号触发下单模块

🧠 总结

RSI 作为一个经典指标,在高频场景下也能轻量级运行,只要你用对方式!

通过增量更新、状态缓存和策略联动,我们可以构建出一个实盘可用、响应迅速、性能稳定的 RSI 处理框架。


📮 加入我们

欢迎关注我们,加入米多量化交流社群,一起探讨:

  • 交易信号构建
  • 多因子择时
  • 高频风险监控
  • 实盘风控插件设计