ビットコインとシステムトレード (Bitcoin & Automated Algorithmic Trading)

ビットコインの自動売買システム構築とトレード実践結果 (Automatic Bitcoin Trading System Implementation and Trading Result)

【予告】仮想通貨FXで3.5万円からバイトやめて1億円を稼いだニートのトレード手法を分析

 f:id:deshita:20171122022336j:plain

バイトやめた戦士

「億ったどぉぉおおおおおおおおおおおおおおおおおおおおwww」

2017年11月7日、とある勝利宣言ツイートが暗号通貨(仮想通貨)の世界を駆け巡った。リツイートは300、いいねは1000を超え、多くの称賛・羨望を集めた。1億円を稼ぎ出したツイート主の名は「バイトやめた戦士」 @musyoku_fighter (以下、戦士)だ。

バイトやめる戦士からハードフォークして爆誕した1人のファイターであり、本業は芋掘りを始めとした農業を営む滋賀のニート・主夫である。

仮想通貨FX (BTCFX)

仮想通貨元年の今年2017年。ALTコインの高騰もあり、億り人と呼ばれる億万長者が数多く誕生した。一方、ALTコインの盛り上がりはICOバブルや草コインブームを経て現在一段落を見せ、多くの損失・消耗も生んでいる。

そんな今、過去最高潮の盛り上がりを見せ、注目を集めているのがビットコイン証拠金取引(以下、BTCFX)だ。

BTCFXは価格変動(いわゆるボラティリティ)が大きく、レバレッジ(5倍〜100倍)をかけることができる。そのため、数千円の少額からでも始められ、資金を短期間で10倍、100倍、1000倍と増やすことができる可能性を秘めている。

ただし、そこは他の相場と同様、「ヤクザ」と呼ばれる資金力を武器にしたパワープレイヤーや、発生したトレンドに群がる「イナゴ」、自動的なアルゴリズムに忠実に沿って淡々と高速トレードを行う「bot」など、様々なプレイヤーがひしめいている、個人同士が金で殴り合うゼロサムの戦場である。

その持ち金を賭したソシャゲ・eSportsとも言えるBTCFXで、コツコツと再現性あるトレードを重ね、BTCFX史上最高水準の1億円の利益を約半年で稼ぎ出したのが戦士である。

戦士以外にも、1日に数百万円を稼ぎ出す凄腕プレイヤーは多い。しかし、安定感・利益額・資産推移の美しさ、どれを取ってもNo.1と言える強さを見せているのが戦士だ。現時点で、BTCFXの絶対王者として君臨していると言っても過言では無い。

別名、メロンマンの異名をとる戦士は何よりも実績を重視している。日々、メロンカラーの損益曲線をTwitter上で公開し、幾多の同業プレイヤーを魅了している。 

ファイターであるということ

この記事を読んでいるのは、少なくともその戦場に興味があるか、既に参戦して善戦を重ねているか、もしくは、負傷してリハビリ中か、そのいずれかであろう。もしかすると、戦士を超える強者もいるかもしれない。

戦士は戦った。そして、勝利した。だが、その真相は闇に包まれたままだ。高額を稼ぎ出すトレーダーにも関わらず、決して気取らず慎ましく暮らし、一種の素朴を持ち合わせているがゆえか、戦士は愛されている。ある者はそれ以上の素朴さ・ピュアさを携え、戦士に問う。

「どうやって勝ったのか?(教えてください!おなしゃす!)」

と。戦士は答える。

「戦いを重ねることだ。実戦経験に勝るものはない。」

ファイターであるために

我々が戦士から学べることは何か。

それは、戦いの軌跡・歴史を振り返り、少しでも多く戦い方のヒントを学ぶことだ。

この記事ではSPA!取材班でもリーチできなかった戦士のこれまでを(公開情報を元に)振り返り、そして分析する。戦士から学びを得ようとする者の一助になれば幸いだ。

また、もしかすると、戦士自身もこの記事を読み、他者視点からの分析を目にすることで、何らかの示唆を得ることがあるかもしれない。

鶏が先か卵が先かわからないが、1人でも多く、バイト中のフリーターがバイトをやめ、バイト時給以上の成果を上げることを願う。

バイトやめるのが先かBTCFXで稼ぐのが先か。

答えはない。

ただし、戦士はバイトをやめることで勝った。

バイトと相場で消耗し、一念発起してバイトをやめた末に生み出した可処分時間。少しでも長い時間相場に向き合い、トレーダーとしての勝ちパターンを磨いたことは間違いない。決して、一朝一夕で稼げるようになったわけではない。絶え間ない相場研究・農業と両立した実践トレード・高度なメンタルコントロールの結晶である。

記事の内容

有料noteでは3つのポイントに絞り、戦士について振り返り、分析する。

・バイトやめた戦士のこれまで
・戦士の損益曲線を分析
・戦士から我々が学ぶもの

(以後、近日公開予定。乞うご期待。)

参考

バイトやめた戦士戦歴(資産推移)

バイト時代【130万円スタート】

2017年2月 71万円
2017年3月 35万円
2017年4月 21万円(最小3.5万円)

バイトやめて以降

2017年5月 570万円
2017年6月 1186万円
2017年7月 1819万円
2017年8月 2751万円
2017年9月 4547万円
2017年10月 7867万円
2017年11月 8556万円(11月2日)
2017年11月 1億円(11月7日)

Quoine, BtcBox, coincheck, zaif, そしてbitFlyer その2 - The latest situation of Japanese Bitcoin exchange competition Part 2

f:id:deshita:20170304180508j:plain

以前にエントリを書いてから状況が変わってきたので、その2として書きます。

主観がかなり入っております。

bitcoin-system-trading.hatenablog.com

2月・3月は出来高に関して下記のような構図が続くと思われます。

bitFlyer >>> Quoine > coincheck = zaif >>> BTCBOX >>> Kraken

1ヶ月の間に構図が大きく変わってきて、現時点ではこのような感じかと。

Quoine = coincheck = zaif > bitFlyer >>> BtcBox >>> Kraken

  • bitFlyerはFX部分で解決すべき問題があるはずで、FXはここでは考慮から除外。
  • Quoineは恒常的に割安だったことが多く、そこがトレーダーの不安を掻き立てていた部分があったかと。最近は落ち着いてきて、不安が払拭されつつある(はず)。トレード画面の使い勝手は良いが、痒いところに手が届いていない印象。
  • coincheckは読みどおり躍進。地道な改良を積み重ねて攻めモード。
  • zaifは正直どの部分が支持されているのか、まだあまりわかっていません。。
  • BtcBox/Krakenは今後の取引所競争に勝ち抜いていくにはもう厳しいのではないか(撤退もありえる?)

また、海外に目を向けるとCNY圏崩壊後、価格について下記のような構図が続いている模様。Fiatからの両替・送金手数料・所要日数を考えると効果的な裁定取引ができるのかは未知。ここはもう少し検証を続けていきたいところです。

KRW > JPY > USD = EUR > CNY

As the situation in JP Bitcoin market has been changed since I wrote my previous entry , I wrote this part 2 post. My forecast was that in February and March it seemed that the following volume-share composition would continue.

BitFlyer >>> Quoine > coincheck = zaif >>> BTCBOX >>> Kraken

However, it has changed significantly just in one month, and at this time it looks like this.

Quoine = coincheck = zaif > bitFlyer >>> BtcBox >>> Kraken

  • Since bitFlyer seems to have problems to be solved in the FX part, FX is excluded from consideration here.
  • Quoine's price was often cheap on a permanent basis, and there was a part that was stirring up traders' anxiety. Recently it has calmed down, anxiety is being dispelled (should be). Usability of the trade screen is good, but my impression that hands have not reached the itchy place.
  • Coincheck has increased its presence as I expected. Steady improvements are accumulated and they are in attacking mode.
  • Honestly speaking about Zaif, I am not sure what part is supported by traders..
  • Is not BtcBox / Kraken severe enough to win exchange competition. (I think there is a possiblity of exit from JP market)

Also, looking overseas, after the collapse of the CNY zone, it seems that the following price composition is continuing. It is unsure whether effective arbitrage transaction can be done considering deposit from fiat, overseas remmittance fee, and the required number of days for overseas remittance. This is the topic I want to continue verifying more.

KRW > JPY > USD = EUR > CNY

日本のビットコイン相場を暴落させるために必要な資金量 - The amount of funds necessary to crash Japanese largest bitcoin market

f:id:deshita:20170225020133j:plain

じわりじわりと上昇を続けての暴落(ガラ)。ビットコインらしい動きです。安定した決済通貨として利用できる日はいつの日やら。。

参考までに、いったいどれだけの資金量があれば相場にそれだけのインパクトが与えられるのか、板情報(bitFlyer現物)を元に計算してみました。

結果は下記の通りで、成行で一気に売りを浴びせた場合。実際は他者の追随もあるので、必要な資金量はもっと少ないかもしれません。

1.5億円あれば10%下げさせることができ、4億円もあれば3割減に持っていけます。思ったよりも少ないというのが印象です。豊富な中国マネーが流れ込んでいると考えられる今、そういった操縦で一時的に市場を混乱させるという行動もありえるかもしれませんね。

Crash after continued rising. It is a typical movement in bitcoin market. Does the day when we can use bitcoin as stable settlement currency come. .?

For your reference, I tried calculating based on the board information (bitFlyer spot) as to how much amount of funds is required to give such a crash impact to its market price.

The result is as follows and it is a case where we execute market sell orders at a time. Actually, others' reaction may boost it, so the necessary amount of funds may be less.

If we spend 150 million yen it can fall by 10%, if it is 400 million yen it can be dropped by 30%. My impression is that it is less than I expected. Now that it is thought that abundant Chinese money is flowing into JP BTC market, it may be possible to act to temporarily confuse the market with such maneuvering. 

f:id:deshita:20170225024400p:plain

f:id:deshita:20170225024409p:plain

ビットコインのHFT(高頻度取引)は可能か? その2 - Is Bitcoin HFT (high frequency trading) possible in Japan? Part 2

f:id:deshita:20170213215958j:plain

各取引所のAPI提供元ホストがどのロケーションに登録されているかを調べてみました。

  • bitFlyer/QuoineがCalifornia、
  • Zaif/coincheck/BtcBoxがTokyo(AWS)

という結果でした。

これはあくまでもリクエストの入り口がどこにあるかというだけで、その奥の物理構成がどうなっているかまでを示すものではありません。しかし、通信のレイテンシーボトルネックになってくるようであれば、リクエスト元(VPS等)のロケーションと極力揃えるなど、考慮に入れてもよいかもしれません。

I examined which location the API provider's host of each Japanese bitcoin exchange is registered. Here is the result.

  • BitFlyer / Quoine is California,
  • Zaif / coincheck / BtcBox is Tokyo ( AWS )

This is just where the entry point of requests is and does not indicate how the physical backend composition is built. However, if response latency seems to be a bottleneck , it may need to be taken into consideration, as your reference, such as aligning with the location of the request source ( VPS etc.) as close as possible.

www.iplocationfinder.com

HostHostnameISPCityRegion
api.bitflyer.jp 107.154.248.134.ip.incapdns.net Incapsula Redwood City California
api.quoine.com 104.20.0.28 (IP) CloudFlare San Francisco California
api.zaif.jp ec2-52-69-226-84.ap-northeast-1.compute.amazonaws.com Amazon Technologies Tokyo Tokyo
coincheck.com ec2-52-68-5-65.ap-northeast-1.compute.amazonaws.com Amazon Technologies Tokyo Tokyo
www.btcbox.co.jp ec2-52-69-156-194.ap-northeast-1.compute.amazonaws.com Amazon Technologies Tokyo Tokyo

よく頂く質問など feat. Bitcoin裁定取引 by abitra.net

私がBitcoinトレードを始めるにあたって参考にさせていただいた、Bitcoin裁定取引 by abitra.netのほげほげさんが、先月1月に「よくあるお問い合わせ内容など」を投稿されていたので、それに便乗してみますw

www.abitra.net

Q: アビトラで利益出ていますか?

A: はい。出ております。利益額はお伝えしておりません。

漢: はい。出ております。実績は月次で開示します。
ただし、具体額の開示ではなく利率や勝率のみとします。

Q: Bitcoinを中心とした投資を専業としているのですか?

A: いえ。Bitcoinの取引は遊びです。趣味でプログラムを覚えたので適当にAPIが充実しているBitcoinで遊んでいるといった感じです。

漢: いえ。Bitcoinの取引は遊びです。投資経験が浅いので、投資を行っているという感覚は乏しいです。マネーゲームです。思いつきベースで戦略や手法を考える・実際に思いつきを形にする・実戦で検証してみる・調整していく、というサイクルが楽しく、遊んでいるといった感じです。

Q: Bitcoinについてどう考えている?

A: 正直何も思う事はないです。遊び道具の一つといった感じでしょうか。。。また取引所にあるBitcoinはいつなくなっても仕方ないと考えています。
※もちろん失う事に対して全く何も考えていないとかではなく、国から何のライセンスや保証がないのでそんな物として考えているといった感じですね。そこが良い所だと思いますので。あっちなみにMtGoxでやられた1ユーザです。なので基本的に取引所は信用していません。

漢: 実体がないし、ひたすら胡散臭い。そういう理解をしています。ただし、崩壊はせず、今後長期的には伸びていくかと。なんだかんだ乱高下を繰り返しながらも長期的にはVolatilityもこなれていき、出来高も1年ごとに10倍くらいにはなることでしょう。きっと将来、今のこの時期を懐かしむときが来ると思います。

Q: Bitcoinで他に何かしてる?

A: はい。取引以外にも色々なBitcoinを利用したビジネスを作ったりしています。たいした利益にはなっていませんが、通販サイトの決済に利用したり、システム制作費をBitcoinでもらったり。localbitcoins.comを利用してリアルに会って色々な国の人の話を聞いたりするのは楽しいですね。
※ある国の方でBitcoinクラシックカーを買ったそうで、昔の物とデジタル(最新)が融合しているなーと感じて凄く興奮しましたw(国内だとそーいった事例はまだ少ないのかな。。。)

漢: 将来的にはBitcoinファンドを組みたいですが、法規制・資産保全・情報開示など、クリアすべき課題は多いと思っています。また、現在の日本市場は個人投資家(投機家)が多数ですが、インフラが整うにつれ、桁違いの大手資本が入ってくる可能性もありえると見込んでいます。単なるbot武器商人になるつもりはいまのところないです。他にもいくつかネタはありますが、しばらく温めますw

Q: アービトラージ(裁定取引)のプログラムはどうやって動かしてるの?どっかで売ってるの?作ってるの?

A: 取引のプログラムは全て自分で作成しており、プログラムはRubyです。それをサーバ借りてサーバ上で動かしている感じですね。

漢: クラウドサービス上で自分でRubyで書いて、クラウドサービス上(Linux)で動かしている感じですね。C#での高速化を検討中ですが、現状、ボトルネックは取引所システム側にあります。よっぽど複雑な戦略を実装しない限り、RubyPythonレベルでまだ事足ります。まだ、速度競争には突入していないと感じていますが、取引所の判断次第では性能増強もありえるため、いずれはやってくるはずです。

Q: アービトラージ(裁定取引)のシステムトレードってどうやってるの?

A: 各取引所がAPIを提供しているので、APIを利用して取引を行う感じです。

漢: 同上。APIページへのリンクはBlogに貼ってあります。

Q: アービトラージ(裁定取引)のAPIの利用は簡単?

A: APIの利用方法をお伝えすると長くなるので各取引所のAPIのドキュメントを確認して下さいませ。APIの利用は難しくないので安心頂ければと。 ご連絡頂く方の中にはGoogleスプレッドシートを利用して取引を行っている方もいるようなので。。。(どうやってるのかな。。。)

漢: GAS(Google Apps Script)とGoogleスプレッドシートの組み合わせでも実装は可能です。ただ、速度や安定性に懸念があるので、あくまで補助用途をオススメします。

Q: アービトラージ裁定取引)のシステムを販売又は提供してくれませんか?

A: 申し訳御座いません。システムの提供及び販売は行っておりません。提供していない理由はいくつかありますが、私はプロのプログラマ(システム制作会社で働いた経験ありません)では御座いませんので責任など取れませので。。。もし責任とらなくてもいいから作ってという心の広い方からの依頼でしたら制作させて頂きますw ただ私に頼むと高くなると思いますので、おすすめできないかもw
※過去にお問い合わせ頂いた方からの依頼でちょっと特殊な注文の取引のシステム制作を行った事がござます。(アビトラでは御座いません。)

漢: 同上。自分で組むと楽しいですよ。

Q: アビトラのシステム提供している所または人をしりませんか?

A: 直接知っていいないので何の保証もありませんが、検索で"Arbitrage Bitcoin github"として頂ければいくつか御座いますのでご参考までに。私は利用した事がないので。。。これらは殆ど国外の取引所を利用していたと思いますので、そこらへんが大丈夫であれば有りかもしれません。

漢: 同上。英語圏には情報が結構転がっています。それを輸入して紹介するのはこのBlogの一つの目的です(がまだ書けていない。。。)。

Q: 名前はなんて言うのですか?

A: ほげほげです。※公開しておりません

漢: 漢 a.k.a. GAMI (かんえーけーえーがみ)です。※実名は公開しておりません
カミカミだったり、新宿レペゼンではありません。

Q: 直接会って話をする事は可能ですか?

A: 可能です。私は東京の日本橋近くに住んでおりますので、近くでコーヒーを奢って頂けるのであればお会いする事が出来ます。
Bitcoinの話はもちろん、それ以外のビジネスの話など適当でも大丈夫ですw
※今までにもご連絡を頂いた方、十数人と直接お会いして色々お話をしています。

漢: 可能です。私も東京の日本橋近くに住んでおりますので、近くでカフェモカを奢って頂けるのであればお会いする事が出来ます。
Bitcoinの話はもちろん、それ以外のビジネスの話など適当でも大丈夫ですw
※まだ、直接お会いしたことはありません。

ビットコインのHFT(高頻度取引)は可能か? - Is Bitcoin HFT (high frequency trading) possible in Japan?

f:id:deshita:20170205210955j:plain

日本のビットコイン取引所でHFT(高頻度取引)は可能なのか、検証してみました。

条件

  • 国内最大規模で取引所システム性能が最も良いであろうbitFlyerが対象
  • Public APIの基本であるTicker取得を利用
  • 非同期処理で400ms間隔で100回のリクエストを送信(100〜300msでリクエストを投げても結果が返ってこず。取引所側でリクエスト制限を設けている模様)
  • 取引所が正常稼働している状態で測定(=gethealthで取得した取引所の状態がNORMAL)

結果

左側:timestampの値とその回数(同じ値が何度も返ってきている)

右側:各秒間において何種類の値が返ってきたかのカウント

f:id:deshita:20170205191552p:plain

右側をグラフ化しました。400ms間隔で投げているので、理論上は1秒間に最低2種類の値が返ってくるはず。しかし、取引所が提供するticker情報の更新はそこまで高速ではないようです。おおよそTPS(ticker per second)=1〜2程度です。

f:id:deshita:20170205185549p:plain

ticker取得でこの速度であるため、板情報取得や注文などはもっと遅いでしょうね。もっとも、内部で膨大な量のオーダーマッチングを行っているわけで、これでも莫大なサーバリソースが投入された末に実現されていることでしょうが。。

結論

株式市場で行われているようなミリ秒レベルのHFTは現状無理。現実的なところは、せいぜい1秒間隔での取引(Realtime APIを駆使すれば多少違うかも)。

気が向いたら日本国内取引所間の比較を行ってみて、「その2」として記事にします。

I tried to verify whether HFT (High Frequency Trading) is possible at the bitcoin exchange in Japan.

Conditions

  • For bitFlyer that is the largest in Japan and would have the best exchange system performance
  • Use Ticker acquisition which is the basis of Public API
  • Sending 100 requests at asynchronous processing at 400 ms intervals (Results are not returned even if I throw requests in 100 - 300 ms , it seems that exchanges have request limits)
  • Measurement with exchanges operating normally (= the state of the exchange acquired with = gethealth is NORMAL)

Result

Left side: timestamp value and its number (same value has been returned many times)

Right side: Count of how many kinds of distinct values ​​are returned in each second

I graphed the right side. Since it is thrown with intervals of 400 ms, in theory at least two kinds of values ​​will be returned in one second. However, it seems that updating the ticker information provided by the exchange is not so fast. Approximately TPS (ticker per second) = about 1 to 2.

Because this speed is acquired by ticker acquisition , board information acquisition and buy/sell order etc might be slower. However, the exchange are doing an enormous amount of order matching internally, so even this performance is achieved after huge server resource introduction. .

Conclusion

Millisecond level HFT as it is done in stock markets is impossible at present. The realistic thing is that at most, trading at 1 second intervals (it may differ somewhat if Realtime API is used).

If you feel like it, I will try comparing performance among domestic exchanges in Japan and write it as "Part 2".

bitFlyer自動取引botのコア部分(発注機能)Rubyソースコード

ビットコインをbitFlyer上で自動取引するbotのコア部分である発注機能(成行注文版)のRubyソースコードを公開します(エラーハンドリングが甘いですが、、間違いや改善点があれば教えてくださいm(_ _)m)。指値注文も、LIMITとpriceを指定すれば簡単に実装できます。product_codeを指定することで、現物にもFXにも使えます。ササッとアイデアを実装に落とし込めるのは、やはりRubyの強みですね。

lightning.bitflyer.jp

#!/usr/bin/ruby

require 'uri'
require 'net/http'
require 'time'
require 'securerandom'
require 'base64'
require 'json'

 

API_KEY = '{{ YOUR API KEY }}'
API_SECRET = '{{ YOUR API SECRET }}'

 

def order(product_code, buy_sell, size)
    timestamp = Time.now.to_i.to_s
    uri = URI.parse("https://api.bitflyer.jp")
    uri.path = "/v1/me/sendchildorder"

    body = '{
        "product_code" : "' + product_code + '",
        "child_order_type" : "MARKET",
        "side" : "' + buy_sell + '",
        "size" : ' + size.to_s + ',
        "minute_to_expire" : 10000,
        "time_in_force" : "GTC"
    }'

    text = timestamp + 'POST' + uri.request_uri + body
    sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), API_SECRET, text)
    options = Net::HTTP::Post.new(uri.request_uri, initheader = {
        "ACCESS-KEY" => API_KEY,
        "ACCESS-TIMESTAMP" => timestamp,
        "ACCESS-SIGN" => sign,
        "Content-Type" => "application/json"
    });
    options.body = body
    https = Net::HTTP.new(uri.host, uri.port)
    https.use_ssl = true
    response = https.request(options)
    result = JSON.parse(response.body)

    if (result['status'] == -201) then
        puts ' ' + product_code + ' ' + buy_sell + " You have reached the maximum amount of trades for your account class."
        return false
    end
    if (result['child_order_acceptance_id'] == nil) then
        puts ' ' + product_code + ' ' + buy_sell + " Insufficient funds"
        return false
    end
    if (result['child_order_acceptance_id'] != nil) then
        puts ' ' + product_code + ' ' + buy_sell + " id:" + result['child_order_acceptance_id'] + " size:" + size.to_s
    end
    return true
end