up: 📂Clojure開発
Clojureアルゴリズムトレード
ライブラリまとめ
取引所wrapper
knowm/XChange
ccxtのJava版. いろんな取引所APIのラッパー.
内部では, JAX-RSがつかわれているよう. HTTP/2と比べると100msくらいは体感遅い印象だが, 高頻度取引でなければあまり関係ないレベルか.
企業がバックアップでメンテナンスしているのか, 対応取引所や開発状況が異常に充実している印象.
io.contek.invoker
最近熱心に開発されているJavaのAPI wrapper. XChangeと比べると, 取引所で見劣りするものの, OkHttpをつかっているのでHTTP/2が使える.
テクニカル指標ライブラリ
ta-lib
Pythonでよく使われているta-libもあれはマルチプラットフォームなツールのラッパーなので, PythonだけでなくJavaやC++でもつかえる.
ta4j
-> 📝ta4j
📝ta4j
ta4jはJavaのテクニカル分析用ライブラリ.
BarクラスとBarSeriesクラス
Bar Series and Bars | Ta4j - Technical Analysis for Java!
BarクラスはOHLCVに相当, BarSeriesはOHLCVの時系列データ. BaseBarSeriesオブジェクトを生成して, ここにOHLCVに当たるデータであるBarオブジェクト(BaseBarで生成)を追加していく.
Basexxxというのが実装でBaseがついてないやつがinterface.
OHLCVデータは外部サーバからAPIで取得するか, 自分で歩み値をリサンプリングして用意するかして.addBarでseriesしていく. もしくは定期的に .addTrade/.addPrice関数を読んでデータを追加する.
インジケーターの使い方
Technical Indicators | Ta4j - Technical Analysis for Java!
JavaDocで利用可能なインジケーターは確認できる.
各indicatorの使い方はテストコードを参考にする(ドキュメントはない).
https://github.com/ta4j/ta4j/tree/master/ta4j-core/src/test/java/org/ta4j/core/indicators
Clojure Trading Bot Topics
API認証を通す方法
どの取引所もPrivate APIを使うためには認証を通す必要があるが, どこも同じような方法で認証をする. そしてその認証は他のコードやClojureでなくてもJavaを参考にコピペすればおけ.
4つの情報が必要.
- api_key: API Key. サイトから取得
- timestamp: リクエスト時のUnix Timestamp
- nonce: ランダム文字列. ここがrequest bodyのtextの場合も.
- signature:
- 署名用textをAPI SecretでHMAC_SHA256署名.
- だいたい同じなのでコピペでいける.
timestamp
Unix時間(とString変換).
(defn ->timestamp []
(.toString (System/currentTimeMillis))
nonce
ランダムな16bytesの文字列生成.
(import '[java.security SecureRandom])
(defn toHexString [bytes]
(apply str (map #(format "%02x" %) bytes)))
(defn generate-nonce []
(let [random (SecureRandom.)
bytes (bytes (byte-array 16))]
(.nextBytes random bytes)
(toHexString bytes)))
HMAC SHA256署名したHex(16進数)文字列
(import '[javax.crypto Mac])
(import '[javax.crypto.spec SecretKeySpec])
(defn secretKeyInst
[key mac]
(SecretKeySpec. (.getBytes key) (.getAlgorithm mac)))
(defn ->sign [key text]
(let [algo "HMACSHA256"
mac (Mac/getInstance algo)
secretKey (secretKeyInst key mac)]
(-> (doto mac
(.init secretKey)
(.update (.getBytes text)))
.doFinal
toHexString)))
References
- GitHub - funcool/buddy-core: Cryptographic api for Clojure
- 暗号に役立つClojure Lib.
- Encrypting Keys in Clojure Applications - Lambda Infinite
- Socket.IO 2.0 (WebSocket)
- bitFlyer Socket.IOにJavaの認証コード.
💡大量のデータに対するframe/payload sizeチューニング
ref. Using Aleph as a Clojure WebSocket Client | Matthew Downey
まだこれの意味するところを理解してないがメモ.
BitMEXのようなnoisy socketにはframe & frame payload sizeを設定しましょうという話.
(http/websocket-client
"wss://www.bitmex.com/realtime"
{:max-frame-payload 1e7 :max-frame-size 1e7})
この例でも :max-frame-payload 131072に設定.
https://github.com/skyscraper/md-aggregator/blob/master/src/md_aggregator/ftx.clj
JVM Performances Turning
GC周り.
- Forcing a JVM Heap Dump Programmatically from Clojure | Matthew Downey
- Why we chose Java for our High-Frequency Trading application | by Jad Sarmo | Medium
C++と互角?
;; https://twitter.com/draganrocks/status/1245988386005037056
Clojure has MUCH simpler syntax than C++ or Java, is fast even for numerical computing (via Intel’s MKL and DNNL, CUDA, cuBLAS, and cuDNN!). You get the benefits of C++ without the drawbacks. The book is about DeepLearning which you might or might not use in algo trading.
aleph websocket client examples
- https://github.com/lmchoi/crypto-arb/blob/master/src/crypto_arb/exchanges/common/feeds.clj
- https://github.com/skyscraper/algo-trader/blob/master/src/algo_trader/handlers/utils.clj
- https://github.com/solussd/tradebot/blob/main/src/tradebot/exchanges/coinbasepro/api.clj
- https://github.com/PabloReszczynski/phoenix-client
テクニカルインジケーター計算(バックテスト)
バックテストでのClojure: Sliding window Algorithmの実装は, tech.mlが便利. SMAもcumsumもいける.
ref. https://techascent.github.io/tech.ml.dataset/tech.v3.dataset.rolling.html
(roll/rolling ds
{:window-type :fixed
:window-size 5
:relative-window-position :left}
{:oi-delta-sma (roll/mean :oi-delta)
:liq-lv-cumsum (roll/sum :liq-lv)})
🤔Insights
仮説ベースだが, ClojureのLazy Sequenceやcore.asyncがtrading botにすごく活躍しそうな予感はしている(使いこなせればね).
💡Javaの肩に乗る
Javaはウォール・ストリートで使われてきた言語なのでそのライブラリが使える.
REPLから稼働中のbotを制御
これは強い.
Clojure: 並列プログラミング & 遅延シーケンスの力
検証できたらupdateする.
;; https://www.reddit.com/r/Clojure/comments/kzepdq/an_opensource_robinhood_client_for_algotrading/
Python is great for analysing data, and the ecosystem and libraries for algo trading get you further faster than Clojure. But when it comes to actually trading: it’s asynchronously receiving events (market data) and sending orders, then waiting asynchronously again for them to be filled. This is exactly where Clojure shines in my opinion, making it a great fit.
Seqenceの追加ではconcatの代わりにlazy-catを利用する.
メモリに乗らない大きなデータを一部だけ取り出して計算することができる.
🔗References
- GitHub - clojure-finance/clojure-backtesting: Backtesting framework for quantitative investing/trading
- HKU Business School開発, 複数人でメンテされている. ドキュメントも謎の充実.
🔍ClojureでのTrading bot開発事例まとめ
設計とかprotocolとか参考にしたいところ.
- https://github.com/weissjeffm/gdax-bot
- websocket clinetでgniazdoを利用.
- core.asyncを駆使してwebsocketの情報を処理.
- https://github.com/vonadz/trader
- incantarとか使われてる
- https://github.com/analyticbastard/xicotrader
- ガチめのフレームワーク.
- https://github.com/skyscraper/algo-trader
- 最近つくられている, manifold使われてる.
- https://github.com/skyscraper/md-aggregator
- market情報をwebsocket経由で蓄積.
- https://github.com/eeng/mercurius
- Clean ArchitectureでClojure Crypto Trading Botつくってみた.
- Using Aleph as a Clojure WebSocket Client | Matthew Downey
- 非同期ライブラリalephでwebsocket経由のticker取得.
- https://github.com/lmchoi/crypto-arb
- Arbitrage, manifoldの使い方のシンプルな例.
Java
Javaも参考に.
- https://github.com/teletha/cointoss
- 謎のガチっぽいJava Arbitrageコード🤔
Sixtant
ClojureでMarket making and algorithmic HFT している会社.
Algo trading & Market making の会社で働いている人のブログ(co-founder).
- Home | Matthew Downey
- Clojureの情報多め, ClojureでAlgo Tradingしてる?
- GitHub - SixtantIO/hum: An experimental library for efficient binary serialization of L2 book data.
- Using Clojure’s Transducers in Asychronous Systems | Matthew Downey
- これはbacktestを想定している.
- AMA with Sixtant - Market Making on dYdX - YouTube