1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

HyperliquidのWebSocketでファンディングレートをリアルタイム監視してLINE通知するPython実装

1
Posted at

HyperliquidのWebSocketでファンディングレートをリアルタイム監視してLINE通知するPython実装

はじめに

Hyperliquidのファンディングレートは8時間ごとに更新されます。年率換算で10〜40%を超えるレートが発生したとき、即座にポジションを取れれば大きな収益機会になります。

しかし手動でチェックし続けるのは現実的ではありません。

この記事では以下を実装します:

  1. Hyperliquid WebSocket でファンディングレートをリアルタイム受信
  2. 年率換算レートが閾値を超えたら LINE Notifyに即通知
  3. systemd で24時間365日自動実行

コードをコピペして環境変数を設定するだけで動きます。

ファンディングレートを使ったデルタニュートラル戦略(価格リスクをヘッジしながら稼ぐ方法)は ファンディングレート裁定 完全マニュアル【2026年版】 で詳しく解説しています。


仕組みの概要

Hyperliquid WebSocket
        ↓ activeAssetCtx(ファンディングレート更新イベント)
Python スクリプト
        ↓ 年率換算 > 閾値(例:15%)
LINE Notify API
        ↓
スマートフォンに即時通知 🔔

ファンディングレートは8時間ごとの実効レートとして配信されます。年率換算式:

年率(%) = 8時間レート × 3(1日) × 365(1年) × 100

事前準備

必要なもの

  • Python 3.9以上
  • Hyperliquid Python SDK
  • LINE Notifyトークン

インストール

pip install hyperliquid-python-sdk python-dotenv requests

LINE Notifyトークンの取得

  1. notify-bot.line.me にアクセス
  2. 「マイページ」→「トークンを発行する」
  3. 通知を送りたいトークルームを選択
  4. 表示されたトークンをコピー

実装コード

.env ファイル(プロジェクトルートに作成)

# .env
LINE_NOTIFY_TOKEN=あなたのLINEトークン
THRESHOLD_ANNUAL=15.0   # 年率15%以上で通知

メインスクリプト funding_monitor.py

# funding_monitor.py
# Hyperliquid WebSocket ファンディングレート監視 + LINE通知

import os
import time
import json
import requests
import threading
from datetime import datetime
from dotenv import load_dotenv
from hyperliquid.info import Info
from hyperliquid.utils import constants

load_dotenv()

# ============================================================
# 設定
# ============================================================
LINE_TOKEN      = os.getenv("LINE_NOTIFY_TOKEN")
THRESHOLD       = float(os.getenv("THRESHOLD_ANNUAL", "15.0"))  # 年率%
BASE_URL        = constants.MAINNET_API_URL

# 通知クールダウン(同一コインを何分以内に再通知しないか)
COOLDOWN_MINUTES = 60
_last_notified: dict[str, datetime] = {}

# ============================================================
# LINE通知
# ============================================================
def send_line(message: str) -> None:
    """LINE Notifyにメッセージを送信する"""
    if not LINE_TOKEN:
        print(f"[WARN] LINE_NOTIFY_TOKEN が設定されていません")
        return
    try:
        requests.post(
            "https://notify-api.line.me/api/notify",
            headers={"Authorization": f"Bearer {LINE_TOKEN}"},
            data={"message": message},
            timeout=10,
        )
    except Exception as e:
        print(f"[ERROR] LINE送信失敗: {e}")


# ============================================================
# ファンディングレートの処理
# ============================================================
def calc_annual(funding_rate: float) -> float:
    """8時間レートを年率%に換算"""
    return funding_rate * 3 * 365 * 100


def should_notify(coin: str) -> bool:
    """クールダウン中でなければ True を返す"""
    now = datetime.now()
    last = _last_notified.get(coin)
    if last is None:
        return True
    elapsed = (now - last).total_seconds() / 60
    return elapsed >= COOLDOWN_MINUTES


def on_funding_update(msg: dict) -> None:
    """WebSocketからファンディングレート更新を受信したとき呼ばれる"""
    try:
        data = msg.get("data", {})
        coin         = data.get("coin", "?")
        funding_rate = float(data.get("fundingRate", 0))
        mark_px      = float(data.get("markPx", 0))
        annual       = calc_annual(funding_rate)

        now_str = datetime.now().strftime("%H:%M:%S")
        direction = "+" if funding_rate > 0 else ""
        print(
            f"[{now_str}] {coin:<10} "
            f"8h:{direction}{funding_rate*100:.4f}%  "
            f"年率:{direction}{annual:.1f}%  "
            f"価格:${mark_px:,.2f}"
        )

        # 閾値超えかつクールダウン外なら通知
        if abs(annual) >= THRESHOLD and should_notify(coin):
            direction_label = "📈ロング需要過熱" if funding_rate > 0 else "📉ショート需要過熱"
            message = (
                f"\n🔥 ファンディングレートアラート\n"
                f"コイン: {coin}\n"
                f"年率換算: {direction}{annual:.1f}%\n"
                f"現在価格: ${mark_px:,.2f}\n"
                f"方向: {direction_label}\n"
                f"時刻: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
            )
            send_line(message)
            _last_notified[coin] = datetime.now()
            print(f"  ✅ LINE通知送信: {coin} ({direction}{annual:.1f}%/年)")

    except Exception as e:
        print(f"[ERROR] on_funding_update: {e}")


# ============================================================
# WebSocket接続とサブスクリプション
# ============================================================
def start_monitor() -> None:
    """WebSocketに接続してファンディングレートを監視する"""
    print("=" * 60)
    print(f"  Hyperliquid ファンディングレート監視ボット")
    print(f"  閾値: 年率 ±{THRESHOLD}% 以上で LINE 通知")
    print(f"  クールダウン: {COOLDOWN_MINUTES}")
    print("=" * 60)

    info = Info(BASE_URL, skip_ws=False)

    # 全銘柄のファンディングレート更新をサブスクライブ
    info.subscribe(
        {"type": "activeAssetCtx"},
        on_funding_update,
    )

    print("✅ WebSocket接続完了。監視中...\n")

    # 接続を維持するためにメインスレッドを生かし続ける
    try:
        while True:
            time.sleep(60)
    except KeyboardInterrupt:
        print("\n🛑 監視を停止しました")


# ============================================================
# エントリーポイント
# ============================================================
if __name__ == "__main__":
    start_monitor()

実行してみる

python funding_monitor.py

正常に動いていると以下のような出力が流れます:

============================================================
  Hyperliquid ファンディングレート監視ボット
  閾値: 年率 ±15.0% 以上で LINE 通知
  クールダウン: 60分
============================================================
✅ WebSocket接続完了。監視中...

[10:32:15] BTC        8h:+0.0089%  年率:+12.1%  価格:$105,200.00
[10:32:15] ETH        8h:+0.0071%  年率:+9.7%   価格:$3,820.00
[10:32:15] HYPE       8h:+0.0312%  年率:+42.5%  価格:$38.42
  ✅ LINE通知送信: HYPE (+42.5%/年)
[10:32:15] SOL        8h:+0.0218%  年率:+29.7%  価格:$172.15
  ✅ LINE通知送信: SOL (+29.7%/年)

LINEにはこのような通知が届きます:

🔥 ファンディングレートアラート
コイン: HYPE
年率換算: +42.5%
現在価格: $38.42
方向: 📈ロング需要過熱
時刻: 2026-05-29 10:32:15

応用:閾値ごとに通知の重要度を変える

def get_alert_level(annual: float) -> str:
    """年率に応じたアラートレベルを返す"""
    abs_annual = abs(annual)
    if abs_annual >= 50:
        return "🚨 超高レート"
    elif abs_annual >= 30:
        return "🔥 高レート"
    elif abs_annual >= 15:
        return "⚠️  注意レート"
    return ""

# on_funding_update内で使用
level = get_alert_level(annual)
if level and should_notify(coin):
    message = f"\n{level}: {coin} 年率{direction}{annual:.1f}%"
    send_line(message)

24時間自動実行:systemdへの登録(Linux/WSL)

/etc/systemd/system/funding-monitor.service を作成:

[Unit]
Description=Hyperliquid Funding Rate Monitor
After=network.target

[Service]
Type=simple
User=ubuntu
WorkingDirectory=/home/ubuntu/funding-monitor
ExecStart=/usr/bin/python3 /home/ubuntu/funding-monitor/funding_monitor.py
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1

[Install]
WantedBy=multi-user.target
# 有効化・起動
sudo systemctl enable funding-monitor
sudo systemctl start funding-monitor

# ログ確認
sudo journalctl -u funding-monitor -f

Discord通知への切り替え(オプション)

LINE Notifyの代わりにDiscord Webhookを使う場合:

def send_discord(message: str, webhook_url: str) -> None:
    """Discord Webhookにメッセージを送信する"""
    requests.post(
        webhook_url,
        json={"content": message},
        timeout=10,
    )

まとめ

実装内容 コード量
WebSocket接続・サブスクライブ 〜15行
年率換算・閾値判定 〜10行
LINE通知 〜10行
クールダウン管理 〜10行
systemd常駐化 設定ファイルのみ

HyperliquidのWebSocket APIは非常にシンプルで、subscribe に1行渡すだけでリアルタイムデータが流れてきます。通知を受けてから実際にポジションを取るまでの判断は人間が行う設計にしているため、過度な自動化リスクなく運用できます。

ファンディングレートの活用戦略(デルタニュートラル・裁定取引)については以下も参考にしてください:


本記事のコードはすべて MIT License です。自由に改変・利用してください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?