AI・機械学習
オープンソースのキャンドルのみの仮想通貨ポンプ検出器 – 機械学習コントリビューター募集
An open-source, candle-only crypto pump detector–looking for ML contributors (github.com)
要約
このプロジェクトは、BinanceとBybitの1分足・5分足の市場統計と過去のローソク足アーカイブからデータを取得し、仮想通貨のポンプ・ダンプ相場を検出し、Telegram経由で通知するTypeScript製のオープンソースツールです。セットアップは簡単で、取引所のAPIキーは不要です。検出されたポンプイベントを手動でレビューし、機械学習モデルの改善に役立てるための機能も備えています。
全文翻訳
Pump and Dump Crypto Screener
TypeScript pnpm monorepo で、Binance および Bybit から 1分足/5分足の市場統計とバルク kline アーカイブを取得し、ポンプ/ダンプ相場を検出し、Telegram でアラートを送信します。
ライブボットを試す: Telegram で @pumpdumpscreenerautobot を開く
要件: Node.js 20+, pnpm 9+, pm2 (本番環境用プロセス管理).
セットアップ方法
取引所の API キーは不要です。Binance と Bybit のデータは、公開バルクアーカイブと公開 REST エンドポイントから取得されます。
無料アカウントが 2 つ必要です (それぞれ約 2 分).
サービス
セットアップ
Turso
ポンプ、監視実行、Telegram サブスクライバーを保存します。
Turso CLI: turso db create screener → config.js に URL + 認証トークンをコピーします。
Telegram
ポンプアラートと /stats /runs /about ボット
@BotFather → /newbot → docs/telegram_setup.md を参照してください。
1. 依存関係をインストールして設定します
pnpm install
cp config.example.js config.js
# Turso + Telegram を設定します (上記の表を参照)
config.js を編集します — 最低限、データベース、telegramBotToken、およびプライベートな classifierTelegramChatId を設定してください。
/start を送信したユーザーは自動的にアラートにサブスクライブされ、/stats, /runs, /about を使用できます。アラートを分類できるのは、設定されたチャットのみです。
ポンプのルックバックおよびスキャン設定は pump の下にあります (config.example.js のデフォルト値):
database: {
url: "libsql://screener-....turso.io",
authToken: "...",
},
telegramBotToken: "123456789:ABC...",
classifierTelegramChatId: "36772199",
web: {
port: 3000, // ローカルアプリサーバー; nginx がパブリック HTTP/HTTPS を終端します
host: "127.0.0.1",
},
pump: {
days: 5, // ダウンロード + スキャンのためのルックバックカレンダー日数
minScore: 80,
scanCache: true,
requireCalmPrePump: false, // 機能フラグ: ポンプ前に落ち着いた 2 時間の期間を要求します
},
2. データベースをビルドして初期化します
pnpm build
pnpm db:bootstrap
コード変更後は必ず pnpm build を再度実行してください — PM2 は再ビルドしません。
3. PM2 で開始します
本番環境の実行は、リポジトリルートの ecosystem.config.cjs で定義されています。これは 3 つのプロセスを開始します:
PM2 name
実行内容
役割
pump-monitor
pnpm pump:monitor
ダウンロード → スキャン → ポンプを永続化 → Telegram アラート
pump-bot
pnpm pump:bot
/stats, /runs, /about、および Pump | Dump | None ボタンのクリック
pump-web
pnpm pump:web
保存された最後の 10 件のポンプを表示するプレーン HTTP ページ
pm2 start ecosystem.config.cjs
PM2 はすべてのプロセスを稼働させ続けます。pump-monitor がパイプライン実行を完了すると終了し、PM2 は直ちに次の実行を開始します (autorestart: true)。これにより、手動の cron ループが置き換えられます。
初回実行では、pump.days のローソク足を data/market_stats/ にダウンロードします — ネットワーク + ディスクが必要です。数時間かかる場合があります。市場データはリポジトリに含まれていません。
Web ページはデフォルトで 127.0.0.1:3000 の pump-web によって提供されます。パブリック HTTP/HTTPS のために nginx を前に配置してください。docs/nginx_letsencrypt.md を参照してください。
再起動後も PM2 を維持するには: pm2 save
pm2 startup # 表示されたコマンドに従って実行します (サーバーごとに 1 回).
ポンプイベントレビューア
/review の手動レビューアは、検出されたポンプを人間がラベル付けしたデータセットに変換し、スクリーナーの評価と改善に役立てます。これは、高速でキーボードフレンドリーなワークフローのために設計されています:
ステータス、カテゴリ、取引所、シンボル、日付で保存されたポンプイベントをブラウズおよびフィルタリングします。
スクリーナーの検出時刻を中心に、1分足または5分足のOHLCVチャートとともにTelegramサブスクライバーの投票を検査します。
チャートは、ローカル履歴が利用可能な場合はそれを使用し、それ以外の場合はイベントの公開BinanceまたはBybit APIから4時間ウィンドウをロードします。
各イベントを、ウィックスパイク、弱いポンプ、持続的な動き、ボリュームのみ、流動性の低いノイズ、または不明瞭として分類します。オプションで信頼度とコメントを記録します。
キーボードショートカットで保存して次に進み、既存のラベルを再確認し、レビューの進捗を追跡し、ラベル付けされたデータセットをJSONまたはCSVとしてエクスポートします。
人間によるアノテーションは、元のポンプレコードとは別に保存されるため、レビューは検出器の出力を変更しません。
ワークスペースは既存のTursoデータベースを使用し、ブラウザから取引所へのリクエストは行わず、簡単なHTTP Basic認証で保護できます。
セットアップ、アクセス制御、デプロイメント、リリースチェックについては、ポンプレビューオペレーターガイドを参照してください。
PM2 の日常的な操作
pm2 status
pm2 logs # すべてのアプリ
pm2 logs pump-monitor # ダウンロード + スキャン パイプライン
pm2 logs pump-bot # Telegram ボット
pm2 logs pump-web # HTTP ページ
pm2 restart ecosystem.config.cjs # config.js またはコード変更後 (先に再ビルド)
pm2 restart pump-monitor # パイプラインのみ再起動
pm2 restart pump-bot # ボットのみ再起動
pm2 restart pump-web # HTTP ページのみ再起動
pm2 stop ecosystem.config.cjs
pm2 delete ecosystem.config.cjs
config.js を編集した後、影響を受けるプロセスを再起動します (pm2 restart pump-monitor, pump-bot, または pump-web)。config の変更のみの場合は、再起動すれば PM2 のリロードは必要ありません。
分類ボタンには pump-bot が実行されている必要があります — これは ecosystem.config.cjs に含まれており、本番環境ではオプションではありません。
pump-monitor が行うこと
PM2 によって駆動される各実行は、エンドツーエンドのパイプラインです:
ダウンロード — Binance と Bybit からの最後の pump.days の 1分足/5分足ローソク足 (アーカイブ + REST フォールバック)。docs/fetch_all.md を参照してください。
スキャン — ポンプ/ダンプ検出。data/market_stats/reports/pump_events.ndjson に出力します。
永続化 + アラート — ポンプエピソードを Turso に upsert します。新しい、現在のポンプごとに Telegram メッセージを送信します (coin|pump_start_utc)。
前の正常なモニターサイクルが開始される前に終了したエピソードは、履歴バックフィルです。これらは /review 用に保存されますが、新しいアラートとしてはブロードキャストされません。
取引所のシンボルユニバースは、data/market_stats/reports/symbol_universe.json が pump.universeRefreshDays (デフォルト: 4 日) 古くなったときに再発見されます。これにより、新しいリスティングが追加され、削除された銘柄が後続の取得とスキャンから除外されます。
ディスク上: data/market_stats/ (archives/, api_fallback/raw/, reports/).
キャッシュされたシリーズは、繰り返し実行ではスキップされます。何も自動的に削除されません — Disk usage and retention を参照してください。
classifierTelegramChatId に送信されたアラートには、Pump | Dump | None ボタンがあります。pump-bot は、コールバックがそのチャットから来たことを確認してから pumps.classification を書き込みます。他のサブスクライバーは、分類ボタンなしで同じアラートを受け取ります。
Turso のブートストラップ (1 回限り):
turso db create screener
turso db show screener --url
turso db tokens create screener
pnpm db:bootstrap
Telegram の詳細: docs/telegram_setup.md。
スキャンキャッシュ
データ/market_stats/reports/scan_cache/ の下のコインごとの結果 (基盤となる CLI の --cache-dir で上書き可能)。
検出器のバージョン、スキャンパラメータ、ウィンドウ開始、および取引所ごとのロードされたローソク足の識別子が変更されない限り、エントリは再利用されます — ファイルの mtime ではありません。
新しい 5 分足バーは、増分テール再スキャン (~400 バー) をトリガーします。UTC の深夜ウィンドウロールは、フル再スキャンをトリガーします。
config.js で pump.scanCache: false を設定するか、scan_cache/ を削除してから pm2 restart pump-monitor を実行することで、キャッシュを無効にできます。
スキャンはワーカー・スレッド・プールを使用します (CPU コアを自動検出)。
本番環境のスキャンステップでは、コンパイルされた dist/cli.js とネイティブ・ワーカー・スレッドを使用します (Linux/VDS で必要).
ディスク使用量と保持期間
パイプライン内の何も削除されません — 各実行は追加するだけです。
長期間稼働する VDS では、data/market_stats/ は無制限に増加します (数ヶ月で 100 GB 以上は普通です)。
パス
保持するもの
増加
読み取りバック?
archives/
Binance バルクアーカイブダウンロード、シンボル=X/日付=YYYY-MM-DD 日 × シンボル
はい
api_fallback/raw/
REST フォールバックローソク足、日付=YYYY-MM-DD/シンボル=X 日 × シンボル
はい
extracted/
アーカイブを NDJSON に展開、日付=YYYY-MM-DD/シンボル=X 日 × シンボル
はい
— archives/ から再生可能
reports/pump_detector/<runId>/
オーケストレーターログ + コインあたり 2 ファイル (各 ~50 MB)
いいえ
reports/scan_cache/
コインごとのスキャン結果 シンボル数のみ (~6 MB)
はい
reports/pump_detector/ が通常最大の容量を占めます。PM2 が pump-monitor を終了した瞬間に再起動するため、各スキャンで新しい実行ディレクトリが作成され、コードパスで読み取られない 1 日あたり数 GB のデバッグ出力が発生します。スキャン自体は pump.days のローソク足しか必要としません。より長い保持期間は /review UI のために存在し、これはチャートを描画するために archives/, api_fallback/, および extracted/ を読み取ります。保持期間を下回るチャートは TradingView にフォールバックしますが、Turso の保存されたポンプ行は影響を受けません。
scripts/prune-market-data.sh は、日付で両方を削除します。デフォルトではドライランです:
./scripts/prune-market-data.sh # プレビュー: マッチしたディレクトリとサイズ