ちぎっては投げるブログ

Programming, Android, RaspberryPi, Digital Devices, Kinkuma Hamster...

ビットコインはITエンジニアが小銭稼ぎをするチャンスかもしれない話 #仮想通貨

f:id:mczh:20171220225137p:plain

仮想通貨相場の盛り上がり

バブルだ、バブルだと言われ続けて、時に30%ほど値段を落としながらも次の週にはしれっと高値更新しているビットコインは、現状では買えば多くの人が利益をあげられたと思う。

70万から始めて数か月で1000万にした人や、半月で原資分の利益は確保した人、MONAコインの投げ銭で100万以上もらった上にMONAコインが暴騰した人など、なんとも夢のある話を見かける。

とはいえ、儲かる反面には、儲かっていない人もいて、そうした人は語りたがらないので表には出てこない。

今はお祭り、アマチュアアワーで、だれでも投資すれば儲かるという風潮があるが、そうは言っても知識や経験は必要だろう。

ちなみに私はそんなに儲かっていない。

ITエンジニアは一般ユーザよりちょっとメリットがある

ところで表題の話だが、現在のお祭り状態において、私たちエンジニア(このブログの読者はITエンジニアが多いと想定している)は、ちょっと頑張れば有利な状態にいると思っている。

金融についての知識は疎い場合が多いだろう。おそらくはCMを見て投資を始めたサラリーマンや主婦と大差ない。これは各自で勉強する必要がある(とはいえ、現状の仮想通貨市場に金融の常識が通用するだろうか?)。

では何がメリットと考えているかというと、ほとんどの取引所はAPIを提供している、という点である。つまり、自動取引プログラムをITエンジニアなら簡単に作れる。簡単といっても、アルゴリズムを思いつくのが簡単と言うわけではなく、実装が簡単という意味だが、そんなものに興味を持たず活動できる時間に手動でのみ取引している一般ユーザと比較すれば優位にいるはずだ。

具体的な方法は?

Botを開発しているユーザは、そのコア技術を公開してはいない場合が多い。同じ仕組みのクローンボットが世にあふれると利益が減る、あるいはボットの動きを想定して嵌められる可能性があるからだ。

そうした中で、リスクが少なく、人間では大変そうな、プログラムのほうが優位そうな手法の概要をいくつか書いてみる。 どうやれば実現できるか、利益が出るかはまた個人で考える必要がある。

取引所間価格差を狙う

国内にはいくつかの仮想通貨取引所が存在するが、相場が大きく動くときには価格差が発生する。

国内ビットコイン市況 | Bitcoin日本語情報サイト

を見ると、ふだんはそれほど大きくない格差であるが、時には数万円、先日は10万以上の格差が開いていたこともある。

たとえば、今の状況はQUOINEXZaifは約4万円の差がある。

f:id:mczh:20180113111025p:plain

そこまでは行かなくても、数千円程度の乖離は日に数度発生することがある。

これを逐一拾おう、という戦法である。

現在は、価格が低く評価されがちなのはQUOINEXで、一方、Zaif, CoinCheck, bitFlyerのどこかが高い場合が多い。ただし、QUOINEXは送金が遅いので注意。

さらには国内に限らず、海外取引所も含めれば、より取引所間格差が見込める。日本では深夜のニュースでも、海外では時差があるので、市場の反応速度が異なるのだ。

海外なら、たとえば取り扱い通貨数が多く、日本語も一応は対応しており、最近はハードフォークコインが付与されることで人気なBinanceが良いだろう。

全自動で取引までやってしまうと誤爆が怖い、という場合には、各取引所のAPIで価格を定期取得し、差が一定になったらメールやLINEで通知する、というプログラムにするといいだろう。

取引所の混雑で繋がらない、を軽減できる

ZaifbitFlyerは、相場が過熱してくるとサーバが落ちることがある(他はどうだろうか?)。正直取引所がどうにかするべきでは?と思うが、そうは言っても落ちるものは落ちるので、ユーザはなんとか対策を考える必要がある。

そこでAPIだが、GUI(WEBページ)は落ちていても、APIでの注文は通るときがある(それすら通らないときもあるが)。

大きく値動きして、一般ユーザがアクセス出来ずに立ち往生しているときにAPI経由で取り引きできるのは有利に働くだろう。

また、上述の取引上間格差の情報など、自分にとって必要な情報や取引インターフェースを持った「俺の考えた最強の取引所まとめサーバ」を自前で作っても良いだろう。だが、もしインターネット上のサーバに作る場合には、セキュリティを十分に気をつけなければいけない。

マイナス手数料で稼ぐ

Zaifなど一部の取引所は、取引をするとむしろお金をくれる。手動でやるにはわずかな額だが、botであれば何度も決済ができる。

急激な価格変動に備えた仕組みが必要になるが、ごはん代を稼ぐ程度にはいいのではないだろうか。

ただし、現在はZaifで取引開始するためのハガキがかなり滞っているらしいので、とりあえず早めに口座作成の申請だけしておくとよいだろう。

レンディングBotで稼ぐ

PoloniexやQUOINEXには、レンディングサービスがある。レンディングとは、ビットコインを貸すことで利益を得る方法である。リスクは低いが、貸した相手が破産し取引所も取り立てに失敗する可能性があるので、リスクは0ではない。たまに利子が異常に高騰するときがあり、年利が70%になったときもある(もちろん、その後下落したので実際には年利はそこまでは高くない)。

f:id:mczh:20180113111536j:plain

このレンディングだが、手動でやると貸した通貨が返ってくるたびに再度オファーを出す必要がある。さらに、そのときどきで適切な金利を設定する必要がある。

そこで、 bitseeder.net

や、

cryptolend.net

などのサービスがあるが、利子のうちの数%、あるいは固定費が利用料として取られる。

これを自分で作れれば、利用料は払わずに済む。とはいえ、こうしたサービスは十分な研究の上で自動で金利設定や貸し出し期間を調整してくれるので、素直に餅は餅屋のほうが良い可能性が高い。

落ちてくるのを待機して常に注文を出しなおす

ビットコインは、傾向として大きく落とすときには現在価格の20~30%ほど落とすと底の場合が多いように見える。

なので、それを捕まえるために下のほうに注文を出しておくのだが、一方で価格はどんどん上昇してき、当初は20%下落相当で置いておいた注文が、気づいたら遥か遠くになるときがある。

しかし、いつも価格を見てちょうど良い位置に注文を出しなおすのはかなり面倒である。そこで、API経由で自動で気に定期的に注文を出しなおすことで、下落を捕まえやるくすることが出来るかもしれない。

無理のない範囲で色々試してみよう

いくつか書いてみたが、当然のことながら投資は自己責任である。失っても泣かない、数万程度から始めるのが良いだろう。

いっそ、最初は実際にはお金を使わずに、このプログラムを実際に動かしたら?を仮定して利益を計算してみるのがいいだろう。計算もまたプログラム上で出来る。また、プログラムでの取引は、過去の価格データをテストデータとして扱えるので、ここ数か月の相場で動かしたら利益は出たのか?年単位で見たら?など、手動に比べて利益の想定がしやすいのもメリットである。(しかし、実際に動かし始めると遅延やや接続障害に悩まされることになるが、そこもまた、腕の見せ所だろう)

最近はアカウント作成の認証にもかなり時間がかかるので、とりあえずアカウントだけ作っておくのもいいだろう。

coincheck.com

bitflyer.jp

zaif.jp

せっかくのお祭りバブル状態なので、普段の業務で身に着けたプログラミング技術を存分に奮って、火傷しない程度にお小遣い稼ぎをしてみるのもいいのではないだろうか。

Amazon Echoで話しかけた言葉をIFTTTに通知する方法

この記事はスマートスピーカーIFTTT 大喜利 アドベントカレンダー2017の18日目です(前日の21時に急遽登録しました)。

qiita.com

Echoに話しかけた内容を取得できない?

Amazon Echoは、前回のAmazon EchoとRaspberry Piで部屋の照明を制御する #おうちハック - ちぎっては投げるブログで使ったように、IFTTTと連携することで出来ることの幅が大きく広がるが、ひとつ不満がある。 それは、任意の言葉をトリガーにできるが、その言葉やその言葉の一部を取得する方法がないという点である。

f:id:mczh:20171217210409j:plain

これが出来ると、話しかけた内容を他のサービスに食わせたり、そのうち数字部分だけを使って処理したりと多様な処理が可能になるのだが、なぜだかEchoのIFTTTトリガーは入力の取得に対応していない。(おそらく。ちなみに、Google Homeでは出来るようだ)

そこで、なんとかならないか?と考えて思いついたハック的な方法は、「やることリスト」もしくは「買い物リスト」を流用する方法である。

やることリスト、買い物リストはIFTTT側で入力された言葉を[AddedItem]として使用できる。これによって入力を取得し、他のサービスに投げればよい。

前回のBeebotteのBodyに使えばRaspberry Piにも通知できるので、いろいろ夢が広がる。

デメリットとして、「やることリスト」もしくは「買い物リスト」が本来の意味を失う。

ツイートするIFTTTレシピ例

とりあえず、話しかけた内容をTwitterに投稿するレシピのスクショを以下に示す。

f:id:mczh:20171217210411j:plain

これでAlexaに「こんにちは を買い物リストに追加して」と話しかけると、Twitter側には、

「こんにちは」ってアレクサに話しかけたなう

と表示されることになる。

Slackの無料枠を最大限利用するために、特定チャンネルのメッセージを定期削除するようにした

この記事はSlack Advent Calendar 2017の17日目の記事です。

Slack Advent Calendar 2017 - Qiita

Botを作ると言ったな、あれは嘘だ

f:id:mczh:20171216225030p

Botの定義とは?という話もあるが、いわゆる話しかけるとそれに答えてくれるものをbotとするなら、今回の記事はbotではない。だが、自動でなにかしてくれるのは全部botと呼ぼうよ、と思えばbotを作ったと言えなくもない(詭弁)。  

古いメッセージを削除するbotを作る

Slackは無料での利用だと、最大1万メッセージまで利用できる。1万メッセージを超えると、古いものから閲覧検索が出来なくなる。(削除されるわけではないので、有料プランにするとまた見られるようになる)  

情報を貯めておくチャンネルと垂れ流すチャンネルがある

私のSlackの運用は、色々話をする雑談チャンネル系と、共有カレンダー等の情報を自動で流すお知らせチャンネル系と、保存しておきたい情報をメモしておく保存系チャンネルに分かれている。

  無料枠である1万メッセージを超えてしまうと、保存しておく必要のないチャンネルメッセージも、保存しておきたいチャンネルメッセージも区別せずに古い順に見えなくなっていく。  

そこで、雑談チャンネルや自動投稿チャンネルについて、一定期間より前の投稿を自動削除する仕組みを作ることで、保存しておきたいチャンネルのメッセージ寿命の延命を試みる。    

Slack Appを作成する

Slack API: Applications | Slack

Create New Appからアプリケーションを作り、トークンを取得する。  

特徴で「権限」を選択し、「スコープ」でそれっぽい権限を付与していく。 ここで、「それっぽい」がよくわからなかったので、適当に付与したが、実際には何が必要で何が不要だったのかの検証までは出来ていない。 おそらく、  

ユーザーのパブリックチャンネルにアクセスします
channels:history
ユーザーのパブリックチャンネルに関する情報にアクセス
channels:read
あなたのパブリックチャンネルを修正
channels:write

あたりが必須だと思う。  

Rubyスクリプトの作成

  削除は、以下のRubyスクリプトで行う。 Gemとして、slack-apiを使っているので、

gem install slack-api

が必要。  

require 'slack'
  Slack.configure do |config|
  config.token = "取得したトークン"
end
# name=>day
channel_names = {"チャンネル1" => 何日分を残すかの日数, "チャンネル2" => 以下略}
channel_backup_names = ["バックアップを書き出しておきたいチャンネル名"]
client = Slack::Client.new
channel_names.each{|channel_name, date|
  puts "#{channel_name},#{date}"
  File.open("/tmp/#{channel_name}.txt", "a") do |f| 
    channel = client.channels_list["channels"].find { |c| c["name"] == channel_name }
    begin
      history = client.channels_history(channel: channel['id'], latest: (Time.now - (60 * 60 * 24 * date)).to_i, count: 1000)['messages']
      history.each do |h|
        sleep 2
          if channel_backup_names.include?(channel_name)
            f.puts history.to_json
         end
         puts client.chat_delete(channel: channel['id'], ts: h['ts'])
       end
  end while !history.empty?
end
}

  必要なのはトークンと、チャンネル名と、そのチャンネルのメッセージを何日前まで残すかの情報である。

sleepを入れないとAPIアクセスしすぎでアクセス制限がかかるので、ちゃんとwaitしながら負荷をかけないように気を付けよう。

一応、/tmpの下にバックアップとして書き出している。/tmpの下なので放っておくと消えるので、とりあえず必要ならDropboxにアップロードしておくことにする。   

バックアップ周りは無駄なファイルオープンをしているので直したいが、この記事はアドベントカレンダーの締め切り前日に書いているのでひとまず後回しにする。  

Dropboxへのアップロードは以下を参考。   denpa-shinbun.com  

メッセージ数の変化

実行後にメッセージ総数が減るかを確認したが、減っていない。

調べたところ、最大48時間かかるとの記述を見つけたので後日確認したところ、ちゃんとメッセージが減っていることを確認した。

  このスクリプトをcronで動かすようにすれば、定期削除の完成である。

crontab -e

  ところで、privateチャンネルのメッセージは削除できなかった。権限の問題かと思い、いろいろ試してみたのだが、成功していない。