見出し画像

QuantZoneでできそうなこと①

2022年11月10日付けで、本企画で運用を行っていたFTX Japanに関東財務局による行政処分が発出されました。
本企画は中止とさせていただき、11月末を以て記事を全て削除させていただきます。
この度は本企画の読者の皆様、特に本企画を通してFTX Japanに口座開設された方に多大なご迷惑をお掛けすることになり、誠に申し訳ございませんでした。

QuantZoneを多用することになると思うので、何ができそうかを調べてみました。
とりあえず、使えそうなものを抜き出して並べてみます。他の全ての数式については、最後のほうに画像添付します。

その後、できそうなこと・難しそうなことを考察します。

マーケットに関するデータ

現在価格系

  • price("BTC-PERP")・・・現在価格。おそらくマーケットプライス※1。

  • last_trade_price("BTC-PERP")・・・最終約定価格。

  • price("BTC-PERP", n)・・・n分前の価格。

  • price("BTC-PERP", 60*24*365)・・・このように、数年前の価格も取得できる。

  • price("BTC-PERP", 60*24*365*10)・・・このように、10年前の価格 とかありえない過去だと、上場時価格が入るぽい。BTC-PERPだと10564.25ドル固定となる。

※1 FTXのマーケットプライスは、ベストAsk価格・ベストBid価格・最終約定価格の中央値です。

平均価格(MA)系

  • average_price("BTC-PERP", n)・・・直近n分間における平均価格。

  • ewma_price("BTC-PERP", n)・・・直近n分間の指数平滑移動平均価格。

最大価格・最小価格系

  • max_price("BTC-PERP", n)・・・過去n分間における高値。

  • min_price("BTC-PERP", n)・・・過去n分間における安値。

板系

  • bid_price("BTC-PERP")・・・ベストBid価格(最良買い気配価格)。

  • offer_price("BTC-PERP")・・・ベストAsk価格(最良売り気配価格)。

インデックス系

  • index_price("BTC-PERP", n)・・・n分前のBTC-PERPのインデックス価格。

  • average_index_price("BTC-PERP", n)・・・インデックス価格の平均。

  • ewma_index_price("BTC-PERP", n)・・・インデックス価格の指数平滑移動平均。

あとは、Volumeを取得できるのと、MOVE系商品に関するもの(今回一切使わない)があります。

アカウントに関するデータ

詳しくは省略しますが、以下のようなものを取得できます。

  • 証拠金の多寡や維持率

  • ポジションサイズ

  • 現在レバレッジ

  • 現在ポジションの損益

ポジションサイズを取得するとき、以下に注意したほうがよいでしょう。

  • position("BTC-PERP")・・・ポジション数量を正の数で返す。つまり、ロングポジションもショートポジションも、その絶対量が返ってくる

  • position_net("BTC-PERP")・・・ショートポジションをマイナスで取得したいなら、こっちを使う。

  • position_side("BTC-PERP")・・・ロングポジションを持っている場合は1、ショートポジションの場合は-1が返ってくる。ポジなしだと0。

あと、現物の保有量はポジションとして取得することはできません。「残高」として以下で取得できます。

  • balance("BTC")・・・BTC現物の残高が返ってくる。

その他

数学関数

  • abs(x)・・・絶対値。

  • max(x, y)・・・最大値。3個以上指定可能

  • min(x, y)・・・最小値。同じく3個以上指定可能。

  • floor(x), ceil(x)・・・整数に切り捨てと切り上げ。小数点以下桁数は指定できないぽい。

  • sign(x)・・・符号。プラスなら1、マイナスなら-1、0なら0。

日付関連

  • time・・・UNIX時刻。1970年1月1日からの経過秒数。

  • minute・・・現在時刻の分(0~59)。

  • hour・・・現在時刻の時間(0~23、UTC時刻)。

  • day_of_week()・・・曜日。月曜が0、日曜が6。

あとは論理演算子(andとかor)、算術演算子(+とか)、比較演算子(<とか)などが存在します。省略します。

所感

価格は、基本的には「〇〇分前の価格」しか取得できません。
現状だと、たとえばOHLC(4本値、ローソク足)によるバックテストを行ったとしても、精度よく実際の運用に乗せるのは難しいでしょう。

また、QuantZoneは約15秒に1回実行されます(最近では約1分に1回になっている、という情報を頂きましたので、別記事で検証します)。
このタイミングによって現在価格がずれたりするでしょうし、不利な執行をせざるを得ないかもしれません(たとえば、00分00秒ぴったりに執行したほうが、00分10秒で執行するよりも有利、ということはよくあります)。

これらの制約から、精度が必要なストラテジーではなく、ざっくりとした適当な運用でも問題ない「おおらかなストラテジー」を検討する必要があるでしょう。

執行面で言うと、おそらく成行で約定させるような方法だと、ストラテジーの成績が良いものほど劣化が進みやすい気がします
指値を離したところに置くようなストラテジーのほうがやりやすいでしょう。
どのみち、コスト計測をしっかり行い、劣化度合いをしっかりウォッチする必要があると思います。

できそうなこと・難しそうなこと

正直、移動平均を求めるのも厳しいです。平均価格は分単位でしか求められません。
このため、例えば1時間足の24期間移動平均求めようとすると、以下のような辛い状況になります。

(
price("BTC-PERP", 60*0)+
price("BTC-PERP", 60*1)+
price("BTC-PERP", 60*2)+
price("BTC-PERP", 60*3)+
price("BTC-PERP", 60*4)+
price("BTC-PERP", 60*5)+
price("BTC-PERP", 60*6)+
price("BTC-PERP", 60*7)+
price("BTC-PERP", 60*8)+
price("BTC-PERP", 60*9)+
price("BTC-PERP", 60*10)+
price("BTC-PERP", 60*11)+
price("BTC-PERP", 60*12)+
price("BTC-PERP", 60*13)+
price("BTC-PERP", 60*14)+
price("BTC-PERP", 60*15)+
price("BTC-PERP", 60*16)+
price("BTC-PERP", 60*17)+
price("BTC-PERP", 60*18)+
price("BTC-PERP", 60*19)+
price("BTC-PERP", 60*20)+
price("BTC-PERP", 60*21)+
price("BTC-PERP", 60*22)+
price("BTC-PERP", 60*23)
)/24

これを実行してみると、文字数制限によりある時点の長さからエラーになります。
おそらくこの文字数制限の他にも、使っている関数・変数の数にも制限がありそうです(50個で限界ぽい)。

エラーの様子

例えこれがエラーにならなかったとしても、最大値・最小値は「直近〇〇分の最大値(最小値)」でしかとれないため、単純にはできそうにありません(変数を使ったやり方でできないかを次回検証してみます)。

このように、いわゆるOHLC(始値・高値・安値・終値)を取得するのも一苦労です。
タイムフレーム(1分足、15分足、1時間足とか)を指定した4本値を使いたくてたまりません

一方、以前QuantZoneで回転ボットを作ったときは、〇時間の最高値から〇%下がったところに指値を出す、みたいなことをやっていました。
このような価格の騰落率をベースにした単純なものであれば、QuantZoneのみで実行できます。

この先、本企画ではできることの中から選択してやっていくのですが、一縷の望みを賭けてFTXチームにQuantZoneの拡張をお願いしてみようと思います。

頼んだで、FTXさん…!!

FTXにお願いしてみること

  • 4本値を取得したい。
    open_price("BTC-PERP", "1h", 3) みたいにして3本前の1時間足のOpen価格をとれる、みたいな。

  • max_price、min_price、average_priceにオフセットがほしい。
    max_price("BTC-PERP", 60, 15) みたいにして15分前の段階からの60分間の最高値をとれる、みたいな。

  • floor関数とceil関数は小数点桁数を指定したい。
    floor(x, 2) みたいにして小数点以下桁数を指定して切り捨て、みたいな。

  • average_priceは、タイムフレームを指定できたらなぁ
    average_price("BTC-PERP", "1h", 24) みたいな

  • ベスト板は、厚みを取得したい。
    bid_size("BTC-PERP") みたいな

  • Depth(ある枚数を取引するのにどのくらいの板が必要か)を取得したい。
    bid_depth("BTC-PERP", 10) みたいにして10枚成行したいときの板の枚数(あるいはベスト価格からその板までの差分)を取得できたらなぁ

とりあえず以上。

QuantZone数式一覧

QuantZoneの数式一覧のスクリーンショットです。

スクショ①
スクショ②
スクショ③

・・・

追記(2022年11月9日)

本企画の運用で利用しているFTX Japanの母体であるFTXの経営状況が不透明になっています。
筆者の観測によれば、FTXおよび関連会社のAlameda ResearchがFTTトークン(FTXが発行したトークン)を担保に運用を行っており、リーク記事やBinance CEOによるFTT売却ツイートを発端に資金引き出しの取り付け騒ぎが起こった模様です。

11/9現在、FTXはBinanceによる救済合併に舵を切っています。
FTX Japanは日本国内で登録済みの暗号資産交換事業者ですので、顧客資産は分別管理・保護されています。

本企画自体は続行する予定(場合によってはFTX以外を利用します)ですが、状況に応じて方針を転換する可能性があります。

この記事が気に入ったらサポートをしてみませんか?