FIREして市場に落ちている金を拾うブログ

30代でFIREし、プログラムを勉強して米国株式と仮想通貨で落ちている金をせっせと拾う記録。

OKXでbotを動かしていると止まる

現象

OKXでbotを書いて動かし始めたが、割りとすぐに活動停止。
数時間ハマったのでメモ。

原因

orderをWebSocketでやっていたが、どうやら100個orderを出すとフリーズするらしい。
ちょうど100個なので仕様みたい。しかしドキュメントを読むがそんな仕様があると記載がない・・・なぜ?

解決策

REST APIですべてのorderを出すようにしたら治った。
Rate LimitもRESTとWebSocketで共有化されているみたいなので影響はない見込み。

Python3インストール時にMakeするときにunicodeobject.cのところで止まる

タイトルの通り。調べたところ、PythonではなくGCCのバグらしい。

jpdebug.com

Optimizationを外すとOKらしい。
なお、configureのところでOptimizationを外すだけではだめで、Configureで生成したMakefileの中身をいじりに行く必要がある。

Makefileを操作するとPermission Deniedが出るので、権限をSudo chmod 777 Makefileで与えよう。
あと、00(ゼロが2つ)ではなく、O0(オーゼロ)みたい。紛らわしい。上記ページからコピペして対応しよう。

VSCodeでDigital Ocean にリモートSSHアクセス

全然知らなかったですが、VCCodeの拡張機能でRemote SSHというのがあり、AWS, GCP, DOにアクセスできるらしい。
そうすると、わざわざ手元PCで環境構築やSSHでのファイル転送をせずとも、実行環境でリモートアクセスして開発できるので良いかと思い実行してみた。

参考:

www.digitalocean.com

mono-i-love.hatenablog.com

モノアイさんの記事に記載のような形でSSH通信確立しているなら話は早いです。
むちゃくちゃ丁寧に書かれているので、その前提で話を進めます。

要求事項

  • ChromeOSではないこと
  • VSCodeを導入済み
  • SSH秘密鍵・公開鍵を生成していること
  • Ubuntu 18.04導入済み

なお、Ubuntuhは20.04でもいけました。

STEP1 Installing the Remote-SSH Plugin

簡単なので割愛。

Step 2 — Configuring the Remote-SSH Plugin and Connecting To Your Server

ここはConfigで少し調整が必要。

Host [my_remote_server]
HostName [your_server_ip_or_hostname]
Port [Port number]
User [user name]
IdentityFile [/location/of/your/private/key]

[my_remote_server] : このSSH設定の名前を適当に入れてください。
[your_server_ip_or_hostname] : Digital Ocean側にログインするユーザー名を入れてください。
[Port number] : ここはDigital Oceanの公式に記載なかったですが、モノアイさんの記事で設定していた場合、Portを22から変更しているはずです。そちらをいれてください。
[/location/of/your/private/key] : SSH秘密鍵を格納したファイルの場所を記載してください。

あとは記事の通り、左下にある緑色のボタンを押して、ちょこちょこやればDigital Oceanにアクセスできるはずです!

なぜFIRE後のポートフォリオに仮想通貨を組み込むか

FIRE後に仮想通貨に手を出す人はごくわずか

FIREに関するインフルエンサーやYoutuberなどを見ても、仮想通貨をおすすめしている人はほぼいないと思います。
居たとしても、インフレヘッジのためのデジタルゴールドとして、総資産の3%くらいを上限に持ちましょうという程度。

自分は総資産の2割くらいを仮想通貨に投資してます。現状では、結構なレアケースだと思います。
そこで本稿では、なぜこのようなポートフォリオに至ったのかを説明します。

教科書的な株式:債権=50:50で安心できない

FIRE後、総資産の4%を取り崩す形にすれば資産は残存し続けるとよく言われると思います。
その際には、全て株式で持つのではなく、株式:債権=50:50程度で持つと30年後の残存確率が最も高くなると言われています。

でも、それで安心できるでしょうか?

債権の利回りもBND:1.84%、AGG:1.89%と2%を下回っており、高配当株式もVYM:2.75%、HDV:3.38%と低いです。
組み合わせても全体のインカムゲインが3%にも全く届きません。

では値上がりした分、持ち分を取り崩すかというと、
現在の米国S&P500の平均PERは20.5倍程度と高水準にあり、今後の株式のパフォーマンスは過去10年ほどではないことが予想されます。

本当に、本当に大丈夫?

いや、データの上では安心できるはず、というのはわかります。でも、自分の人生をかけられるほど確からしいのか?
人によると思いますが、自分はもうちょっとリスク分散しつつリターンを増やしたいな~と思いました。

とはいえ代替手段がほぼない

しかし代替手段がありません。

せいぜいREITですが、ほとんど株式と値動き変わらなくない?というかコロナショックのとき、なぜか株式より値下がったよね?
最近のREIT利回りって4%切ってて高配当株式と大差なくない?
となって、本当に何もないんですよねー。

あえて言えば不動産投資に手を出すかですが、個人的にこの人口減少トレンドの中で流動性の低い不動産をポートフォリオに抱える、
しかも一定のインカムを産もうとすると総資産のほとんどが不動産になるという判断に踏み出せませんでした。

仮想通貨は個人が手を出せるオルタナティブ投資として随一の自由度

そんなときに友達に仮想通貨を教えてもらいました。
読み込んだのはこの記事です。

note.com

目からウロコでした。
仮想通貨といえば、供給が増えないことを頼りに、需要が増えることをどれだけ信じて、
ビットコインを握り込めるか勝負という印象を持っていましたが、現実は全然違うことを教えてくれました。

自分の理解としては、規制がほぼ働いてない中で、勝手にデリバティブ開発が行われ、リスクの取り方の自由度が広がっていたのです。

ビットコインみたいな電子ゴミを買うとかアホでしょという人は、アービトラージ、現先、FR取り、IEOをやればいいのです。
もうちょっとブロックチェーンの将来に期待を持つ人は、現物積立をやってもいいでしょう。
ヨーロピアンさんやDEGさんみたいに、記事を書いてアフィリエイト収入を得てもいいと思います。

結構間口が広がってるということを教えられました。

FIREしてる人の目線では、相場変動リスクがないアセットとして仮想通貨をポートフォリオに組み入れるのが最適ではないか

そしてポートフォリオに立ち返ると、一定割合を仮想通貨にする合理性があるように思えました。

・今後パフォーマンス低下(もっと言えば値下がり・バブル崩壊)が懸念される株式のウェイトを下げたい。
・しかし債権の利回りは低すぎて買いたくない。

ヘッジすれば元本変動リスクをなくせる仮想通貨は、債権の代替として機能すると思えました。
完全にヘッジして元本変動リスクゼロにしても、低く見ても20%程度は利回りが出せると感じています。
債権の代わりにポートフォリオに組み込めば、インカムゲインで十分以上に生活できます。

一方で取引所GOX、コントラクトバグ、Rug pullなどの元本全損リスクがあるので、すべて仮想通貨にするようなことはできません。
あくまで一定割合をポートフォリオとして組み込むことで、様々なリスクのバランスを取れるものとして捉えることができると思います。

例えば50%株式、30%REIT、20%仮想通貨とすると、
年間のインカムゲインが総資産の6%くらいになるので8000万円ほどあれば人並みの生活ができます。

さらに踏み出せば事業にできそう

さらに色々調べていると、仮想通貨botterという人種がいることがわかりました。要はシステムトレードです。

最近はAWSなど、個人でも使えるクラウドが普及していることもあり、個人でHFTがやれるようになってきました。
加えて、仮想通貨は大手金融事業者が手を出していないので個人でも儲かる環境にあります。
結果として、ルールを理解して出し抜いた人が儲かる世界で、今月1億円儲かりましたという報告もしばしば見られます。

事業としても面白くない?

そのような経緯で、正確にはFIはしたがREせず、仮想通貨botter目指してPythonを勉強中です。
本ブログは、そのPythonを勉強したことを忘れないようにするために取っているメモが中心です。気が向けば投資全般の話も書きたいと思います。

Websocket実装に向けて非同期処理を勉強する(WebSocket)その4

前回に引き続き、まちゅけんさん記事を見ながら勉強。

結論としては、何個かバグ取りをした結果、動くようになった。
以下メモ。

place orderのresponseでresultの中身のないものが返ってくる

例えば既に出している指値をmodify orderしたときに、すでに指値が約定してしまっていることがある。
その場合、resultの中身が入ってないので、ハンドラで返ってきたデータにあわせて挙動を調整することとした。

    async def handler(self, obj):
        try:
            data = await obj.json()
        except ValueError:
            logger.debug('Value Error')
            raise
        else:
            if not data['success']:
                logger.debug(f'{data["error"]}')
            return data['result']            

FTXからResponseが返ってこないときにTimeout Errorが出る

よくある話。
以前、自分でクライアントを設定していたときはRequestにHTTPAdapterを設定しRetryしていたが、今回はpybottersのClientを使っているので中身を確認。
aiohttpのClientを使っていたので、aiohttp.ClientTimeoutを設定し一定時間でTimeoutするようにして、
Try Exceptでエラーを吐いてループを続行するように変更した。

結果

まだ駄目だめだと思われるが、Maker注文約定から、ヘッジのためのTaker注文発注約定まで、
RESTでは0.7~1.3秒くらいかかっていたところが、0.4~1秒くらいに短縮された。微妙?笑
まぁ、まだできたばかりで最適化余地がいっぱいあると思うのでこれからちょびちょびやってこうと思います。