HyperliquidのWebSocketでファンディングレートをリアルタイム監視してLINE通知するPython実装
はじめに
Hyperliquidのファンディングレートは8時間ごとに更新されます。年率換算で10〜40%を超えるレートが発生したとき、即座にポジションを取れれば大きな収益機会になります。
しかし手動でチェックし続けるのは現実的ではありません。
この記事では以下を実装します:
- Hyperliquid WebSocket でファンディングレートをリアルタイム受信
- 年率換算レートが閾値を超えたら LINE Notifyに即通知
- 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トークンの取得
- notify-bot.line.me にアクセス
- 「マイページ」→「トークンを発行する」
- 通知を送りたいトークルームを選択
- 表示されたトークンをコピー
実装コード
.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 です。自由に改変・利用してください。