既存戦略調査 (2) ultraistterさん
mmbot作成で重要な点まとめ。
— 極上カップヌードル(しなさい) (@akagami_v2) January 6, 2019
情報源(上から初心者向け):
① @mmbotXXX 氏のnote
② @blog_uki 氏のnote・ブログ
③ @ultraistter 氏のツイート
独自研究:
①短期価格予測モデル
②在庫管理ネガティブフィードバック
③ナンピン研究(タイミング・価格・ロット)
④最適化(Sim構築・疑似強化学習含む)
bot以外でも以前から勝手に存じ上げ崇拝しているultraistterさんは、botの世界でもカリスマらしく、重要な情報源としてAKAGAMI氏にも挙げられてますね。自分も機械学習の適用に関心があることもあり、彼の戦略を早めに調査するのは有意義そうです。ということでツイートを漁ってみようと思います。
かなり長くなってしまったので2回に分けました。
黎明期
僕もビットコイン取引をやってみたけど、今日の損益+31円 :( ただ、手数料ないと少額短期で無駄な取引を繰り返してても手数料死しないのでボットで遊ぶ場としてはいい気がする。
— id:ultraist (@ultraistter) August 28, 2016
この時期からスタートしてそう。ここから読んでいきます。
裁量について
裁量で学べることを割と重視されている印象。
BTCFX、1週間ほどやってみて、資金6倍くらいに増えてるけど、1日で24万失った日もあって、危険な感じはするものの累計では+にできそうな気はする。最近は欲を捨てて細かい範囲で利確か損切りかするリクエストを投げて放置しててだいぶ安定している。画面見て反応していると負ける。
— id:ultraist (@ultraistter) June 4, 2017
Kaggle Grandmaster だけど勘でトレードしている。
— id:ultraist (@ultraistter) June 4, 2017
ユーザースキルが重要なネットゲームをやっていれば100時間以下は雑魚で500時間くらいからそれなりに強くて個人差が一番出るところで1000時間以上は強いというのが経験的に分かるので、まず1000時間やるのが重要だと考えているけどその前に資金がマイナスになって退場するかもしれない。
— id:ultraist (@ultraistter) June 4, 2017
データ分析しかしていないと価格予測にしか見えないけど、実際やっているとトレーダーの行動予測(あのへんで買った人が多く前回ここで反転してるからここで利確する人が多いな...みたいな)が重要だと分かるとか
— id:ultraist (@ultraistter) December 7, 2017
2017年夏頃の戦略
BTCは価格が上がってボラが大きくなったのと、今のところ最高値はそのうち更新するという前提がおける雰囲気なので(僕はそう盲信している)やりやすくなった。特に後者は非常に強力で、単純にはできるだけ下で買って戻ってくればいいだけになる。底の予想と資金内でどこでどれだけ買うかという問題
— id:ultraist (@ultraistter) September 3, 2017
問題は、1.予想より下がって強制ロスカ、2.予想より下がった時に買う資金が残ってない、3.下がったまま二度と戻ってこない。1,2は欲を出さずに常に余力を残しておく、3は反発やレンジのスキャで含み損を相殺していく、マジで戻らなかったら負けを認める😇。最近はこれやってます。
— id:ultraist (@ultraistter) September 3, 2017
これは今だと厳しそう
初bot?
BTCFX botいつまでたってもやらない雰囲気になってるので400行くらいの簡易スキャbotを作ってみた。通常時には微益ながらもプラスになってるけど、取引量が増えてBFのAPIが遅延してくると注文と建玉がむちゃくちゃになってくるので対策しないといけない。
— id:ultraist (@ultraistter) October 13, 2017
botだいぶ強くなってぱっと見は時給1000円くらいはいけそうな気がするけど、たまに10分間くらいの利益を1回の損切りでふっ飛ばすのでダメかもしれない。理由は分かってるけどちょっと面倒... とりあえずは明日の朝に期待‼️(爆死の前フリではない)
— id:ultraist (@ultraistter) October 13, 2017
botの24時間の収益は6,156円でした(BTC 0.15枚だけ使用)。昼から調子良いのはパラメータちょっといじったせいかもしれないです(そうならもっといけるはずだしそうであってくれ)。平均でこれくらいでてくれれば放置で月18万なのでベースラインとしてはいいと思う。 pic.twitter.com/b4UVuCzWhw
— id:ultraist (@ultraistter) October 14, 2017
8~24秒以内で抜ける高速スキャなので多分相場に関わらずそれなりに安定しているはず。ただ遅延するとボコボコになるのでいろいろ対策が必要そう。
— id:ultraist (@ultraistter) October 14, 2017
今の自分のbotは、資金2万で30~60円くらいの利益をひたすら積み上げていくタイプなので、バグってなければ爆死はしにくいと思います(バルサラの破産確率で調節する)。長期ポジ持つタイプは今日の17時頃のような動きで数秒で爆損することがあるのでよく考慮されてないと危ないと思います。
— id:ultraist (@ultraistter) October 15, 2017
初期からかなり頻度高めのアプローチを取られている模様。最初は日時1万円前後からスタートを切っている。僕もまずはその辺を目標にスタートしたい。
機械学習の利用を開始?
やれることは分かってきたので真面目に機械学習するか
— id:ultraist (@ultraistter) October 17, 2017
AlphaBitZero作ってる
— id:ultraist (@ultraistter) October 19, 2017
シミュレーション環境作ってOpenAI/baselinesでちょちょい...
— id:ultraist (@ultraistter) October 19, 2017
バックテスト/強化学習用のシミュレーション環境作ったけど、今のbotを移植すると倍くらい勝つのでなにかバグってるっぽい。金が絡むと毎回よい方向にバグるので分かる。
— id:ultraist (@ultraistter) October 24, 2017
この辺ではまだ機械学習を使ったbotを投入してそうなメッセージはなし?
パラメータ最適化・シミュレーションについて
シミュレーション上で hyperopt で最適化したbotくん、日次+34,676。まだBTC 0.2枚(小指)しか使っていない。画像はまた撮れなかったけど、今20分で+1,500なのできっと明日はもっといっているヤツが撮れます(爆死の前フリではない)。
— id:ultraist (@ultraistter) October 27, 2017
スキャbotが一番稼げる荒れている時に遅延して注文が通らなかったり遅れて爆損したりが、実環境ではあまり強くない理由なので、遅延ゼロでむっちゃ強くなる。一応遅延もシミュレートしているけど流石に30秒も遅れる世界だとどうしようもないので最悪でも4秒に設定した世界で最適化している。
— id:ultraist (@ultraistter) November 2, 2017
遅延も入れてシミュレートして最適化している。
botくん日次+51,035。また遅延で飛ばしてたけど回復。今月から枚数を倍にして、シミュレーション上でデータを時間単位で分けて儲からない側から50%で利益が最大になるように最適化してます。儲かる側は実環境では遅延してて儲からないので切り捨てて最低時給を上げる。 pic.twitter.com/kepmUXLks0
— id:ultraist (@ultraistter) November 3, 2017
儲からない側、儲かる側ってどういう意味だろう。マーケットの状況を2つに分類して、戦略を切り替えている?
ルールベースの場合、できるだけ正確なシミュレーション(完璧は無理,部分約定,成行のスリッページ,遅延など考慮)を作って利益最大にする設定(枚数,利確/損切り幅,エントリ条件の閾値,タイムアウトなど)を探す最適化問題にするで間違いないと思う。長期足を使うとオーバーフィッティングもあるので注意
— id:ultraist (@ultraistter) November 18, 2017
シミュレーション環境で気をつけるべき点、及び調整すべきパラメータが列挙されていて大変ありがたい。
前に貼られている画像を見るとデータが現物?シミュレートは約定履歴を順に再生してifo買いの場合side="SELL"でpriceが指値より小さい場合のsizeを指値から引いていって0になったら約定で状態遷移。うまくいくバグは、損切分が実際より小さくなっているケース多(板の端のpriceやスリッページが未考慮
— id:ultraist (@ultraistter) November 20, 2017
ありがちなバグの解説。
0.2くらいまでは問題ないと思いますが、0.5くらいから成行が結構滑る印象です。また板があるように見えててもbotが高速に出したり引っ込めたりしててすり抜けることがあります。
— id:ultraist (@ultraistter) November 22, 2017
0.2ぐらいまでは大丈夫、だったらしい。今はどうか。
botくんは復活どころか利益倍以上になってるけど、よく考えると固定枚数でやっててBTCの価格が上がってるのに利益が増えていないので利率が下がってきていた。パラメータ最適化は hyperopt でやってて自動化できるので毎日過去2日くらいのデータで再学習・更新したいけど毎日動きが変わるのも不安。
— id:ultraist (@ultraistter) December 1, 2017
前は同じにしてましたが、最近分けてます。1時間おきくらいには自動で更新されるのと、トレンドという概念が存在するなら、予測期間に近いデータに対しては過学習気味でもいいのではと思い始めています。
— id:ultraist (@ultraistter) February 3, 2018
ショートとロングで違うパラメタを使ってる。
bFの環境の改善によるパフォーマンス向上
botくん日次+110,185。6日から放置しているので朝書いたように環境の改善による恩恵だけどやっと1日10万超えた。日次マイナスでも出ない限り、今月はもう放置。放置と言いながら気になって気になって仕方がないけど頑張って放置する練習をする。botくんを信頼して任せる‼️ pic.twitter.com/UOF0nHlF8U
— id:ultraist (@ultraistter) November 9, 2017
日次が1日10万を超える。
毎日トラブルはあるものの、開発開始日(10/13)から日次レベルので勝率100%だし、ここ5日の平均3.4万で月にすると結構あるので、ひとまず1ヶ月くらいほっとくか。(死亡フラグではない)
— id:ultraist (@ultraistter) November 5, 2017
勝率100%は強すぎです……高頻度系はやっぱり安定しやすいですかね。
botくんの15日間。+1000kは超えた。負け日0。半分をここ5日で取ってるので残り15日に期待したいところだけど、昨日からBTCの動きが落ち着いてきているからか日次が減ってきているのであまり伸びないかも。 pic.twitter.com/LRtbPOExRX
— id:ultraist (@ultraistter) November 15, 2017
BTCの動きが大きい日のほうが性能が良いアプローチを使っている事がわかる。
bF API について
API、うちは実運用ではPubNubのAPIからくる約定履歴だけ監視してる。RESTの約定履歴はバックテスト/最適化/学習用。板やtickは古いデータが取れないで使っていない(ひどい
— id:ultraist (@ultraistter) November 11, 2017
約定履歴のみでやってる?(やってた?)
ただ、side="BUY",side="SELL"の最終履歴から売り板と買い板の端はだいたいこの辺で、スプレッドはこのくらい、って予測はして使ってる。普通に板を見ればいい気がするけど、学習時と環境を変えたくないので。
— id:ultraist (@ultraistter) November 11, 2017
「学習」という言葉が出ており、いつからかは謎だがいつの間にか機械学習を使っていることも示唆される。(アクティブ)スプレッドの予測に使っているようだ。
毎日4:00~4:10がメンテナンスでbf取引所が停止します。bf停止中に他の取引所で価格を大きく動かされることがあるので、その前後はポジ解消して停止するのが無難だと思います。
— id:ultraist (@ultraistter) November 23, 2017
メンテ前後は停止。
うちもだいたい同じ。ポジ取得→決済→ポジ取得→0なら終わり、ポジ変わってなかったらsleep(1)しながら30回くらい取得し続けて(どこかで反映されてたら終わり)それでも変わらなかったらもう一回チャレンジ。VERY BUSY以上が出たら少し休憩。例外出たらリセット+休憩。今日の遅延での損はなかった。
— id:ultraist (@ultraistter) November 25, 2017
あとこの処理中の例外は全て握りつぶさないと何度もリセット処理が走ってしまう。
— id:ultraist (@ultraistter) November 25, 2017
遅延対策の考え方。非常に具体的で、有り難い。
IFDOCOしか使ってないけどサーバーの調子がよくないとき注文が出るの遅すぎて厳しいのは分かる。bfのサーバーはなにでこんなに遅延状態が変わるのか謎。出来高と関係ないところで負荷かけられているのか、台数調節しているのか。
— id:ultraist (@ultraistter) December 25, 2017
標準のIFDOCO注文使ってますが、getchildordersを0.3sでポーリングしてて、最初のLIMITが未約定/約定、次のLIMITが発行、STOP_LIMITが発行、などの場合ごとにタイムアウトやキャンセル成行など追加機能をつけてます。
— id:ultraist (@ultraistter) December 25, 2017
IFDOCOについて。
BUSYは一度出ると一定期間ロット減らして動かしてます。VERY BUSYは止めてる。BUSYは頻繁に出るのでそれで止めるとほとんど動けなくなるのと、ずっとBUSYのときは損することが多いので扱い難しいですね。
— id:ultraist (@ultraistter) January 17, 2018
サーバーステータスについて。
高頻度系は注文が出るの2秒遅れると利益半分になって、4秒遅れると期待値反転するくらい遅延に敏感なのでとにかく遅延に弱い。
— id:ultraist (@ultraistter) February 7, 2018
遅延の影響のイメージ。
約定と板乗り判定をリアルタイムAPIでやるようにして、API数制限気にしなくてよくなったはずが、注文増やすと"Your ordering has been limited due to submitting an irregular number of orders."が出るので結局増やせない。IFDOCO自作にしたので3倍の注文になってしまったし。
— id:ultraist (@ultraistter) March 14, 2018
自作IFDOCOを使っている時期も。
前のSFD確認するのをwebsocketに置き換えたやつ。自分はプロセス作ってQueueでやり取りしてるのとこうしたけど、もっとカッコイイやり方がドキュメントに書いてあると思う。https://t.co/KWl0iCybW3
— id:ultraist (@ultraistter) April 26, 2018
SFD確認するコード。絶対参考にしよう。
戦略について
これはこれまで書いてないというか当たり前の話だけど、どのタイミングで入るかと、ロング/ショートどちらで入るかが一番重要だと思う。特に後者の精度が高ければ、逐次ロング/ショート切り替えながら動けるので価格がどう動いてようと関係なくなる。
— id:ultraist (@ultraistter) November 22, 2017
(少なくともこの頃は)ask, bid両方出すいわゆるmmbotとは違うアプローチのようだ。
損益グラフが凹むのは、1エントリで大きな損失が出てるか、連続して負けてるかで、前者は損切りの条件かやり方が悪くて、後者は価格の変動に勝率が影響を受けている(ロング/ショートの切り替え精度がよくない)、だと思います。(短期でたくさんトレードする場合の話)
— id:ultraist (@ultraistter) November 22, 2017
ロング・ショートの切り替え精度と損益グラフの見た目の関係。
それで (勝率 * 平均利益) - ((1 - 勝率) * 平均損失, がプラスになるように調節されていれば、トレード数を増やすほど利益が増えるというだけ
— id:ultraist (@ultraistter) December 7, 2017
やはりアクティブスプレッドを取っていくという基本方針ではあるみたい。
勝てるところ以外では入らない、は基本ですよ。ただbotだとあまり厳しくするとエントリ回数が減って機会損失が大きくなるので、とりあえず何らか勝ちやすさの値を出してエントリするかの閾値を最適化する感じですね。
— id:ultraist (@ultraistter) December 4, 2017
機械学習について
価格は、トレーダーの予測→予測に従った行動→売り/買い取引量の力関係の変化→価格、の順に変化で、前の特徴量で予測できれば先回りできるので、結果である価格より取引量を使うのがよいと僕も思う。テクニカル指標なんかも信者が多ければトレーダーの予測に使われるので本来の性能以上になる。
— id:ultraist (@ultraistter) November 30, 2017
特徴量について。
昨日は+130,000。Userなんとかさんは取引量うちの10倍以上あるので...😬ボラは直近の価格の振幅やスプレッドなどからの割合で様々な値を表現すれば対応できると思う。BTCは価格が上がり続けるので絶対値だと古くなる(古いデータも使えない
— id:ultraist (@ultraistter) November 27, 2017
新しい技を使う人やbotの出現を考えると、毎日学習するほうがいいと思う(やりたいけど今の状態で安定しているようなのでまだやっていない
— id:ultraist (@ultraistter) November 27, 2017
再学習について。
最近は毎日前日のデータ入れてパラメータ探索やり直さないと急激に弱るので、難易度変わったという話を関係しているかも。絶対値使わないように気をつけてたけど、諦めて学習ジョブ回し続けて最新パラメータをbotから参照できるようにしたほうがよさそう。
— id:ultraist (@ultraistter) January 12, 2018
途中から、毎日学習するようになっている。
botは短期の特徴しか見てないけど、パラメータ探索している範囲が長期の特徴になってるから、トレンド変わると次にパラメータ更新されるまで調子悪くなる気がする。(例えば使用しているデータ範囲でショートの勝率が高いとショートエントリする条件がゆるくなってたり)
— id:ultraist (@ultraistter) February 3, 2018
こっちはパラメタだけど、トレンドについてなのでここにペタリ。
強化学習
botくんはやってること同じまま強化学習botにしたので様子見。自分の状態を持ってないので0. なにもしない, 1.ロング, 2. ショート ボタン連打するだけ。前は取引数が減りやすくて単純なルールでポジりまくる手法に勝てなかったけど並列化で機会損失減らせるようになったので使えるようになったはず
— id:ultraist (@ultraistter) January 5, 2018
強化学習にしてから興味と知性が復活してきたのでいろいろ試してるけど、実環境だとルールベース高頻度に勝てないな。シミュレーション上だと超勝てるので、板のPubNub APIに反応するbotの影響とPubNubの約定履歴が抜けて特徴量変わるのがあるのかなと。とりあえずPubNubの約定履歴保存してる。
— id:ultraist (@ultraistter) January 10, 2018
つづく
めちゃくちゃ長くなってしまったので一旦ここまで。
この記事が気に入ったらサポートをしてみませんか?