wrappy は、暗号資産 bot を作るときに毎回書きがちな処理をまとめた非同期 Python ライブラリです。
たとえば次のような用途を想定しています。
- bot 共通のログ出力
- Discord / LINE への通知
- GMO / BitBank / BitFlyer / CoinCheck の API ラッパー
- Lighter 向けの補助機能
- bot 開発時に使う一部の分析ユーティリティ
人間向けの概要と使い方:
- この
README.md
LLM に読ませるためのリポジトリ要約:
AI コーディングエージェント向けの運用ルール:
AI エージェントにこのリポジトリを触らせる場合は、少なくとも LLM_REPO_GUIDE.md と AGENTS.md を先に読ませるのが安全です。
- 共通基盤:
Log,Notify,BotBase - 取引所ラッパー:
GMO,BitBank,BitFlyer,CoinCheck - オプション機能:
wrappy.lighterwrappy.utilの分析用関数
この README では、実際にこのリポジトリに存在する API だけを説明します。
コア機能だけ使う場合:
pip install -U git+https://github.com/lawnn/wrappy.gitLighter も使う場合:
pip install -U "wrappy[lighter] @ git+https://github.com/lawnn/wrappy.git"分析ユーティリティも使う場合:
pip install -U "wrappy[analytics] @ git+https://github.com/lawnn/wrappy.git"Lighter と分析ユーティリティをまとめて使う場合:
pip install -U "wrappy[full] @ git+https://github.com/lawnn/wrappy.git"full は lighter と analytics をまとめた extras です。
wrappy は、オプション依存が入っていなくてもトップレベル import が壊れないようにしてあります。
基本的には次の使い分けで考えると分かりやすいです。
- 取引所ラッパーを使う:
from wrappy import GMO, BitBank, BitFlyer, CoinCheck
- Lighter を使う:
from wrappy.lighter import LighterDealer, DealerConfig, WsInfo
- 分析関数を使う:
from wrappy import simple_regression, trades_to_historical- ただし
analyticsextra が必要
もしオプション依存が足りない状態で該当 API を触ると、wrappy は「何を install すべきか」を含んだエラーメッセージを返します。
まず config.json を用意します。
最小構成の例:
{
"exchange_name": "demo",
"bot_name": "sample-bot",
"log_level": "INFO",
"log_dir": "log"
}実運用に近い例:
{
"exchange_name": "gmo",
"bot_name": "sample-bot",
"log_level": "INFO",
"log_dir": "log",
"line_notify_token": "",
"discordWebhook": "",
"gmocoin": ["API_KEY", "API_SECRET"],
"bitbank": ["API_KEY", "API_SECRET"],
"bitbank_keys": [
["API_KEY", "API_SECRET"]
],
"bitflyer": ["API_KEY", "API_SECRET"]
}各キーの意味:
exchange_name- ログファイル名などに使う識別子です。
bot_name- bot 名です。ログ出力やファイル名に使われます。
log_levelDEBUG,INFOなどの標準的なログレベルです。
log_dir- ログファイルの出力先ディレクトリです。
line_notify_token,discordWebhook- 通知先です。どちらも未設定なら通知は送られず、warning ログだけ出ます。
gmocoinGMOを使うときに必要です。
bitbankまたはbitbank_keysBitBankを使うときに必要です。bitbank_keysは複数 key をローテーションしたいときに使います。
bitflyerBitFlyerを使うときに必要です。
このライブラリは「bot ごとに毎回ゼロから API ラッパーや通知まわりを書く」手間を減らすためのものです。
たとえば、普通なら次のような作業を bot ごとに書くことになります。
- 設定ファイルを読み込む
- logger を初期化する
- Discord や LINE に稼働通知を送る
- 各取引所ごとに違う REST API のエンドポイントを叩く
- 失敗時の例外処理を書く
wrappy を使うと、このあたりを共通化した状態から bot ロジックだけに集中できます。
これは「取引はまだしないが、bot の起動・停止・例外通知だけ欲しい」というケースです。
import asyncio
from wrappy import BotBase
async def main():
bot = BotBase("config.json")
bot.log_info("starting")
await bot.statusNotify("bot started")
if __name__ == "__main__":
asyncio.run(main())この例で分かること:
BotBaseだけでも logger を使えます。- 通知先が未設定でもクラッシュせず、warning だけ出して継続します。
たとえば「BTC_JPY に 0.01 の指値売買を出したい」という最小例です。
import asyncio
from wrappy import GMO
async def main():
bot = GMO("config.json", "BTC_JPY")
result = await bot.limit_order("BUY", 0.01, 100)
bot.log_info(result)
if __name__ == "__main__":
asyncio.run(main())この例で分かること:
GMO("config.json", "BTC_JPY")のように、設定ファイルと銘柄を渡して使います。- 高レベルメソッドは内部で GMO の対応エンドポイントに変換されます。
import asyncio
from wrappy import BitFlyer
async def main():
bot = BitFlyer("config.json", "FX_BTC_JPY")
result = await bot.market_order("BUY", 0.01)
bot.log_info(result)
if __name__ == "__main__":
asyncio.run(main())この例でのポイント:
- 新しいコードでは
BitFlyerを使うのを推奨します。 - 旧来互換として
wrappy.bitflyerも残していますが、README ではBitFlyerを正規名として扱います。
import asyncio
from wrappy.lighter import LighterDealer, WsInfo
async def main():
ws = await WsInfo.run_overlay_from_config("config.json", overrides={"symbol": "ETH"})
dealer = await LighterDealer.from_config("config.json", symbol="ETH")
async with dealer:
order = await dealer.create_limit_order(price=3000.0, size=0.005)
print(order)
await ws.aclose()
if __name__ == "__main__":
asyncio.run(main())この例でのポイント:
- Lighter は optional 機能です。
lighter-sdkが必要です。 - 新しいコードでは
wrappy.lighterから import してください。 - Lighter の詳しい説明は wrappy/Lighter/README.md を参照してください。
wrappy から直接使う公開 API:
Log,Notify,BotBaseGMO,BitBank,BitFlyer,CoinCheckAPIException,RequestExceptionnow_jst,now_jst_str,now_utc,now_utc_str,now_gmt,now_gmt_str,fromISOformatsimple_regression,plot_corrcoef,np_shift,np_stack,resample_ohlc,df_list,trades_to_historical,Objective
wrappy.lighter から使う公開 API:
LighterDealer,DealerConfig,WsInfowrappy.lighter.markets
AI エージェント運用も含めた基本検証は、次の 1 コマンドで回せます。
python scripts/verify_agent_ready.pyこのコマンドでは次を確認します。
wrappyとtests/agentの bytecode compiletests/agent配下の回帰テスト- 一時ディレクトリへのローカル install
- install 後の
import wrappyとfrom wrappy import *
短い別名コマンドもあります。
make agent-checkこのリポジトリを初めて読むなら、次の順番が分かりやすいです。
README.mdconfig.jsonの実例を作る- 自分が使いたい取引所クラスを 1 つ選ぶ
- まずは「ログだけ」「通知だけ」「ticker 取得だけ」など小さい例から試す
- 問題なければ注文系メソッドに進む
たとえば GMO を使うなら、いきなり複雑な bot ロジックを書くよりも、まずは次の順で確認すると安全です。
GMO("config.json", "BTC_JPY")が作れるbot.log_info("hello")が出るawait bot.statusNotify("hello")が動くawait bot.fetch_my_position()のような読み取り系を試す- その後で
market_order()やlimit_order()に進む
- 取引所 API は外部サービスなので、将来仕様変更される可能性があります。
- Lighter を使うには
lighter-sdkが必要です。 - 分析関数を使うには
analyticsextra が必要です。 - 両方まとめて入れるなら
fullextra が使えます。 - README にある例は「入口としての最小例」です。実運用では例外処理、レート制限、ポジション管理を別途検討してください。