SocialBitcoinPortfolioでの資金の存在を確認する方法(Scala/Java編)

SocialBitcoinPortfolioに関しては以下の記事を参照してください。

http://socialbtcportfolio.com/

この記事では閲覧専用のAPI-Keyを使って、SocialBitcoinPortfolioの資金が本当に存在するのか確かめる方法を記述します。

KrakenAPIを使う

KrakenAPIはcurlで簡単に叩けるような簡単なものではありません。以下の様な面倒くさいヘッダーをたくさん付ける必要ああります。

PrivateメソッドはPOSTを使用し、次のように設定しなければなりません。

HTTPヘッダ: API-Key = APIキー API-Sign = HMAC-SHA512署名:(URIパス + SHA256(nonce + POSTデータ))を、base64でデコードされたAPI秘密鍵で署名してください

POSTデータ: nonce = (ナンス)常に増加する符号なしの64ビット整数 otp = 2段階認証用パスワード(未設定の場合は不要)

しかも説明がわかりにくいです(英語も同じ)。このため、主要言語で書かれたライブラリが第三者によって多数公開されています。一部はKraken公式にリンクが貼られています。 https://www.kraken.com/help/api#example-api-code

今回使用するJava用のライブラリ"XChange"は、KrakenやBitstamp、BTCChinaといった世界の主要な取引所を網羅したAPIラッパー群です。超すごいです。

GitHub - knowm/XChange: XChange is a Java library providing a streamlined API for interacting with 60+ Bitcoin and Altcoin exchanges providing a consistent interface for trading and accessing market data.

maven

libraryDependencies += "com.xeiam.xchange" % "xchange-kraken" % "2.1.0"

Scalaのプロジェクトを作って依存ライブラリに追加してください。

残高取得

gist94ea531ee48f727fc7cd

API-KeyとAPI-Secretはサイト上に記述されているものを使ってください。

残高取得メソッドを実行すると、EUR, XBT, JPYの資産がそれぞれいくらあるのかjson形式で得られます。 当然ですが、ビットコインを売り買いするようなコードを実行すると"Permission denied"という例外が発生します。

Javaで試したい方はXChangeのサイトを見てうまいことやってください。

ソーシャルビットコインポートフォリオというサービスを作った話

ビットコインに関係する何かを作りたくて仕方がなかったので、ちょっと作ってみました。

SocialBitcoinPortfolio http://socialbtcportfolio.com/

概要

ビットコインとユーロで構成される資産の割合(ポートフォリオ)を閲覧者の投票で決めてもらうのがSocialBitcoinPortfolioのメインテーマです。ビットコインとユーロの交換レート(XBT/EUR)が上昇すると思う人にはビットコインの方に、下降すると思う人にはユーロの方に投票してもらうといった具合です。

例えばビットコイン/ユーロの投票数がそれぞれ120/80だった場合、その時のレートで全体資産の6割がビットコインとなるように市場で売買して割合の調整(リバランス)を行います。このリバランスは100時間に1回、システムによって自動で行われます。

初期資産は私の入金した100,000JPYで、2015年2月4日に1XBT≒27,500JPYレートで3.63686XBTにしました。

仕組み

このサービスで使用されるビットコインとユーロはKrakenというアメリカの仮想通貨取引所のアカウントで管理されています。もちろん、私(@tanapro)の口座です。

KrakenではAPIが公開されているので、ビットコインの売買をアプリケーション経由で自由に行えるわけです。

残高の証明

SocialBitcoinPortfolioでは、KrakenAPIで必要となるAPI-KeyとAPI-Secretを公開しています。これは私の口座に紐付いており、「残高読み取り専用」のキーです。これを使用してもビットコインの売買、送金といった操作は行えません。APIを使用すると口座にあるXBT/EUR/JPYの保有量がJSON形式で得られます。

API-Key: HLTTSLx7zoJCdnZnHa/C9DE+BiMy86zg7YKTJjKBG7h2wz5spek1sj1L

API-Secret: 7drFRUJx9wFsvu/nnECGUridGF/PORd6KlTywX7b3Rm+f9MAfGAJWSZ8fCkVyEmP37ejmlzqKeas9v6REF3B5w==

このキーを使った具体的な確認方法については、後日記事にしたいと思います。

ユーロを選んだ理由

Krakenで一番取引量の多い通貨ペアだからです。下の画像を見れば一目瞭然だと思います。

XBT/JPY

f:id:dsaki:20150218005703p:plain

XBT/EUR

f:id:dsaki:20150218005822p:plain

ではなぜKrakenを選んだのかと言うと、Kraken社は昨年11月に日本進出しているからです。 このおかげで、日本の銀行からの日本円での入金、本人確認などスムーズに行うことが出来ました。 (日本にも他に取引所はあるのですが、現状だと取引量があまりにも少なく高頻度の取引には向いてないと判断しました)

SocialBitcoinPortfolioが市場に与える影響

ビットコイン取引市場における流動性は、リアル通貨市場のそれに比べるととてつもなく小さいです。スプレッド(売りと買いの差)もかなりあります。このため、たとえ少量の取引であっても市場に与える影響はそれなりに大きいのです。

例えば、以下の売り板で3XBT分の成行買い注文を出すと、XBT/EURのレートは約0.2上がります。

f:id:dsaki:20150219154147p:plain

仮想通貨取引市場間で裁定取引をしている人は必ずいるはずので、Krakenでの価格変動は他の取引所へも波及します。

さて、SocialBitcoinPortfolio(以下SBP)では100時間に1回、サイトトップのタイマーが0になると取引所に注文が送られます。買い注文になるのか売り注文になるのか、また取引量はいくらになるのかはその時点でのポートフォリオ状況と投票の割合によって変わってきます。また、注文の形式は成行注文です。

ということは、SBPから送られる決定された注文に対して、他の市場参加者は先回りして注文を出せばいいわけです。上記の売り板を例に取ると、仮にSBPから約3XBT分の買い注文が数十秒後に送られる状況であった場合、208.67€までの売りをすべて買い、それをそのままSBPに売りつければ差額がそのまま利益となります。もちろん、これが通用するのはSBPの存在を知っている者が少ない場合に限ります。存在が認知されれば簡単に利益を上げることは難しくなるでしょう。

いずれにせよ、SBPは市場に対して流動性の供給を促す存在になるはずです。今はまだ小さいですが。

※正確にはタイマーの数字が0になってから最大15秒以内に注文が取引所へ送信される仕様です。

寄付受付中

SBPに関してほんの少しでもワクワクした、可能性を感じたという方は寄付をしていただけると大変嬉しいです。以下のビットコインアドレスで受け付けています。

1P2HTAzmeeks4BbGEvsXywtGtCpadLMq1S

Address: 1P2HTAzmeeks4BbGEvsXywtGtCpadLMq1S | Blockchain Explorer

ビットコインを送金したことがないからテストで使ってみたい、という方も大歓迎です。

バックエンドについて

Scala + Play!Frameworkで動いてます。投票数、チャットの部分はPubNubというWebRTCを使ったリアルタイム通信機能を簡単に構築できるサービスを使用しています。サーバはHerokuを使いました。

今後の展開

3月中にiOS版をリリースします。 ビットコイン価格に関して議論できる場所を提供できるよう、今後も機能改善を重ねていきます。

===以下ポエム===

SBPを皮切りに仮想通貨に関連した、またはブロックチェーンを応用したアプリケーションを今後も作っていこうと考えています。既存の銀行システムに囚われずに価値/信用のやりとりが出来る未来、こんな素晴らしい世界を自分たちで作っていけるなんて最高にワクワクしませんか?

仮想通貨はまだまだ始まったばかりの技術です。数十年後、世界中で一般的に使用される通貨となるのか、あるいはマイナーな電子マネーと同じような扱いで終わるのか、今この記事を読んでいる皆さんのこれからの意識に掛かっています。

最近のリワード広告におけるインストール判定の仕組みについて&ブーストに失敗した話

「無料でポイントゲット」とか「稼げる!ポイントアプリ」といったちょっと怪しい気なアプリ、あなたも一度は目にしたことがあると思います。

これらはリワード広告と呼ばれるものの媒体なのですが、このリワード広告の仕組みとそれによって実現できる所謂「ブースト」という手法について実験も踏まえて説明していこうと思います。

リワード広告とは

アプリで指定された操作を行ったユーザにインセンティブを付与するタイプの広告です。ユーザと広告主の2つの視点から見ていきます。

f:id:dsaki:20141222145020p:plain

ユーザ視点

ユーザは、指定されたアプリをインストールするだけでポイントが貰え、一定以上貯まるとAmazonギフト券iTunesカードに交換できます。

もちろん、すぐに大金が貯まるわけではないのでiTunesカードに交換するためには毎日コツコツ貯めていく必要があります。ストアでの購入、アプリ内課金を絶対に行わないスマートフォンユーザは一定数いるので、その人達は課金アイテムを購入するためにこのような努力を行うわけです。

当然ですが、ユーザの目的はポイントなので指定されたアプリをインストールして初回起動を終わらせればもうそのアプリに用はありません。大半のユーザは端末から削除します。

広告主視点

ユーザが獲得するポイントを支払っているのは広告主です。先程の画像にある「モンスト全国マルチ掲示板...」というアプリの場合、ユーザは5ポイント獲得できるので広告主が支払っている金額は1インストールあたり10〜15円です。

ではなぜ広告主はお金を払ってユーザにアプリをインストールして貰っているのでしょうか、すぐに消されるにも関わらず・・・

それは、同時多発インストールに伴うランキングの上昇があるからです。

f:id:dsaki:20141222145918p:plain

「モンスト全国マルチ掲示板...」はAppStore無料ランキングの7位にランクインしています。AppStoreのランキングのアルゴリズムはストア黎明期の頃からだいぶ変化しており、継続率、起動率といった指標にも連動するようですが、それでも新規インストール数という指標のウェイトは未だに高いです。短期間にインストールされた数が大きければランキングを一気に駆け上がることができます。

ストアランキングに露出することにより、ストアにアクセスしてきた人が興味を持ってインストールすることになります。これが「自然流入」と呼ばれるもので、広告主としては自然流入こそが真の狙いでありこれをいかに大きくできるかが勝負となります。

インストール判定について

「ゲームをインストールして立ち上げた瞬間にsafariが起動してすぐ戻ってきた」という経験をしたことはありませんか?これはリワード広告におけるインストール判定のために必要なアクションなのですが、使っている側としては非常に不快ですね。

なぜこのようなアクションが必要なのかというと、アプリ単体では端末を一意に識別できる情報が得られないからです。この情報がなければ、同じユーザが「アプリのインストール」→「ポイントゲット」→「アプリの削除」を無限に繰り返して同じアプリで無限にポイントをゲットできてしまいます。この不正を防ぐために端末を一意に識別できる情報を管理する役割を、広告会社のサーバとsafaricookieに担ってもらっているのです。説明すると長くなるので、詳しく知りたい方は以下の記事なんかを読むと良いです。

Redirecting…

この手法では広告主の負担も大きいです。広告主はプロモーションを行いたいアプリにリワード広告会社が作った専用のSDKを導入し実装する必要があります。

最近のインストール判定について

safaricookieを使った判定は、初回起動時にsafariが強制的に開くのでとても不快です。さらに、初回起動時にプッシュ通知の許可を求める実装をしていた場合、アラートが計3回も表示されます。

safariを使わないインストール判定手法として最近流行っているのは、URLスキーム型の手法です。URLスキームとはアプリに割り当てることができるアドレスのようなもので、例えばiOSブラウザのURL欄に「coloplwcat:///」と入力すると、端末に白猫プロジェクトがインストールされている場合に限り白猫プロジェクトが立ち上がります。

URLスキームの特徴として、

  • 端末に入っているアプリのURLスキーム一覧情報は取れない
  • あるアプリがインストールされているか否かは分かる

といったことが挙げられます。Objective-Cのコードで「端末に白猫プロジェクトがインストールされているかどうか」を取得したいとき、白猫プロジェクトのURLスキームが"coloplwcat"だと分かっていた場合以下のように書くことで実現できます

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@“coloplwcat:///"] ]){ //インストールされている }

リワード広告の媒体であるポイントゲットアプリには、URLスキーム型リワード広告を提供している広告会社のSDKが入っています。このSDKは広告案件アプリのURLスキーマをできるだけ監視しています。

例えば、白猫プロジェクトをインストールすると30ポイント獲得できる案件があったとしましょう。ユーザが案件のボタンをタップしてAppStoreに遷移します。このとき、ポイントゲットアプリはバックグラウンド状態になりますが、iOSの場合最大で10分まで連続で動作し続けることが可能です。AppStoreに遷移したユーザが10分以内に白猫プロジェクトをインストールすれば、”coloplwcat:///”が開ける、つまりアプリがインストールされたことを検知できるのです。 また、10分以内にインストールされなかったとしても、ユーザが再度ポイントゲットアプリを起動すれば白猫プロジェクトがインストールされているか否かは判定できます。

URLスキーム型の最大の特徴は、初回起動時にsafariを起動することがないという点です。出稿するためにSDKを組み込む必要もなく、唯一求められる作業はURLスキームを設定することだけです(これは世に出ている大半のアプリがやっています)。このため、広告主を集めやすいという特徴もあるようです。 実際、コロプラ社のタイトルはどれもsafariは起動しません。なので、URLスキーム型のリワード広告にコロプラのゲームはよく出てきます。

欠点としては、重複ダウンロードを防ぐことができない点です。これに関しては各社いろいろな防ぐ手法を持っているようです。(すべてを防ぐのは難しいとのこと)

インセンティブなしのCPI広告について

ーーーここからは私がお金を稼ごうとする話ですーーー

これまで説明してきたのはインストールしたユーザにインセンティブを与えるタイプの広告です。ここから話すのはインストールしたユーザにインセンティブを与えないタイプの広告、つまり普通の広告です。

一般的なモバイル広告には大きく分けて2つの種類があります。ひとつはCPC(Cost per Click)で、もうひとつはCPI(Cost per Install)です。 CPCは広告がクリックされる度に費用が発生するタイプの広告です。ユーザが画面下部のバナーをタップする度に、広告主はお金を払う必要があります。そのお金は広告会社がマージンを取った後に開発者のもとに支払われます。

CPCの特徴としてはクリックされた後アプリがインストールされてもされなくても費用が発生することろです。開発者視点で見た場合、1クリックで得られる報酬は国内だと8円〜といったところでしょうか。

次にCPI広告。これはアプリが実際にインストールされたときのみ費用が発生するタイプの広告です。クリックされた回数は関係ありません。このインストール判定にも先ほどのURLスキーム手法が使われるわけです。開発者視点で見た場合、1インストール約200円〜300円といったことろです。

(最近日本で大規模にプロモーションを行っているアメリカMachineZone社の「Game of War」というタイトルは、CPI単価が他の何倍もあります。本気度が伺えます。)

ブーストに失敗した話

このCPI広告を導入したまとめサイト閲覧アプリを作り、ブーストを実施したのが12月の中旬です。ブーストに使用したのは某AC社のブーストプログラムで、2000インストール×単価10円=20000円 を最初に支払いました。 (ブーストが単価10円という破格の値段で実施できるのは、この広告会社の提供している広告をアプリに組み込んでいるからです。)

https://itunes.apple.com/jp/app/chaomatome2ch-for-buromaga/id933625850?mt=8&uo=4&at=10l8JW&ct=hatenablog

結果的にブーストは大失敗でした。自然流入は最初の5日でなんと0件。まずはDL数から見てみます。

  • 1日目 649
  • 2日目 315
  • 3日目 141
  • 4日目 74
  • 5日目 41

5日間の合計は約1200。ブーストを行う上で重要なのは超短期間でDL数を一気に伸ばすことなので、これでは効果が薄いです。さらに、これはAppleのせいなのですがこの期間でカテゴリにすら一度も露出しませんでした。ブーストを実施したのはアプリが公開されてから1週間後だったのですが、この時点ではまだランキングに組み込まれてなかったようです。公開後すぐに反映されるものもあればそうでないものもある。これは少し腹立たしいですね。

ちなみに、ブースト実施後8日目にカテゴリランキング50位に入っており、この日のDL数は176でした。アプリを公開して2週間後のことです。

まとめと次回予告

  • ブーストはアプリが公開されてから十分時間が経った後にやろう
  • ブースト会社はちゃんと選ぼう

アプリのブラッシュアップを行い、今度は某AD社のブーストプログラムでまた実験を行ってみたいと思います。今回使った費用は20000円で、収益は0円に近いです。

CookPadの開発コンテストに参加した話

https://info.cookpad.com/24contest_5

https://info.cookpad.com/24contest_5

毎年開催されているクックパッド社のエンジニア向け開発コンテスト。去年は入賞したので、今年は優勝を目指して参加しました。 今回のテーマは「誰かと話すキッカケを作るサービス」。かなり漠然としているので、正直なんでもアリかなという感じでした。

イデア出し

ということで、今年は「迷惑住人と話し合いをするきっかけを作るサービス」を作ることになりました。

迷惑住人との話し合いのお手伝いをするサービス

5時間くらいで出来ました。

http://meiwaku.herokuapp.com/

f:id:dsaki:20141019010102p:plain

「和解準備開始」ボタンを押すと、専用のチャットルームが生成されます。このチャットルームで迷惑住民と話し合いましょうということです。

もちろん、相手にこのチャットルームの存在を知らせなければなりません。Wakai.ではそのサポートもしてくれます。書類生成ページで必要項目を入力すると、警告文が記載せれた書類(.xls)をダウンロードすることができます。これを印刷して相手のポストに投函すればOK、簡単に相手にプレッシャーを与えることができますね。面と向かって相手に文句を言えないシャイなボーイでもこれくらいならできるはず。

あとは相手がこの喧嘩話し合いに乗ってくれるのを待つだけです。

技術的な話

Wakai.はPlayFramework+Scalaで実装し、Herokuサーバ上で動かしています。

チャットルーム機能は自分で実装したわけではなく、MilkCocoaというバックエンドサービスを使っています。

https://mlkcca.com/

既存のプロジェクトにjavascriptのコードを数行書くだけで、WebSocketを使ったリアルタイム通信の機能を簡単に実装することができる素晴らしいサービスです。

Excel文書出力機能は"Apache POI"という、JavaからExcelファイルを操作するライブラリを使用しました。

Apache POI - the Java API for Microsoft Documents

ローカルにテンプレートとなる.xlsファイルを用意しておき、必要な文字列だけ置換するという処理を行っています。

結果

https://info.cookpad.com/24contest5_award

入賞すらできませんでした。来年は本気出します。

「ソーシャルFX」という商標を取られた/取られていた話

SocialFX総裁の@tanaproです。破綻して数週間が経ちました。

商標出願された

ここにきて新たな材料が投下されたみたいなので書いておこうと思います。
はい、KLab<3656>さんですね。私も株を持っていたりスクフェスをやったりしているのでよく知っています。
この商標は「ソーシャルFX」というものですが、この名前、私の運営していたユーザ参加型FX取引プラットフォーム「SocialFX」ととてもよく似ていますね!すごい。
 
SocialFXは約1年間実働しており、一応受賞歴みたいなものもあります。
 

「ソーシャルFX」商標は以前にも申請されていた

出願元はFXプライムさんです。この会社もGMO傘下ですね。

これに関してはよく分かりません。KLabは知ってて申請したのか、それとも私の知らない事情があるのか・・・。それと、このソーシャルFXは2013年の4月に出願されており、私のSocialFXが動き始めたのは2013年の11月なので、完全に負けています。すいません。。
 
とりあえず、私が言いたいことは以下のツイートに要約されているので、KLabさんには一度目を通していただきたいです。よろしくお願いします。

SocialFXは破綻しました

http://socialfx.jp.net/

資産額が、ポンド/円10000通貨を新規取引するために必要な最低証拠金額を下回ったためです。

SocialFXの栄枯盛衰

f:id:dsaki:20140916121508p:plain

  • 2013/11/11 サービス開始(163501円)
  • 順調に増加
  • 2014/02/10 iPhoneアプリ公開(329033円)
  • 2014/01/15 353437円の最高値を付ける
  • 順調に下落
  • 2014/03/11 元本割れ(160041円)
  • 2014/03/12 このはコンテスト優勝(賞金20万円追加)関連サイト
  • 順調に下落
  • 2014/09/15 破綻(67915円)

過去記事

SocialFXを通じて色んな金融系サービスの中の人とお話しする機会がありました。その中で感じたことは「日本人のお金に対する価値観はもっと多様化した方がいい」ということです。多くの人は「節約した方が良い」「貯金は正義」といった考え方が正しいと信じて疑わない状態にあるかと思います。確かにそれも一つの考え方です。しかし、私はどちらもゴミだと思っています。お金は使った方が偉いに決まってるし、余ったお金は投資するべきです。あなたのお金に対する考え方は、あなたの意思によって導かれた結論ですか?

お金とは何なのか。今一度、皆さんに改めて考えていただければ、SocialFX総裁としてこれほどの幸福はありません。

===ポエムここまで===

運用者募集 & 今後について

私の自己資金で今後SocialFXを動かす予定はありません。SocialFXでお金を動かしたいという酔狂な方がいらっしゃいましたら、"info あっと pocketengineer.net" までご連絡ください。常時稼働できるMT4を用意していただくだけで、運用が可能です。

次のWebサービスについて

次に作ろうとしているサービスも、もちろんお金に関するものです。(SocialFXのような闇っぽいサイトではありません。)tanapro先生の次回作にご期待ください。

https://twitter.com/tanapro/status/511691626247245824

SocialFXが破綻の危機に直面している件について(通算2回目)

SocialFX総裁の@tanaproです。

 
ここ最近、SocialFXの資産状況がよろしくないです。以下の画像は、サービス開始時からの資産推移の様子です。

f:id:dsaki:20140905214202p:plain

 
SocialFXを簡単に説明すると、ユーザーの予想を元に私@tanaproのリアルマネーを使ってリアルFX取引を行うというものです。
 

2014年の成績

今年は見事な右肩下がりですね。皆さん、お金を溶かすのがとても上手で感心します。途中、webサービスの開発コンテストで優勝した際の賞金20万円の追加が無けれは、すでに破綻していたでしょう。考えられる原因として、1回あたりの投票機会に投票を行うユーザが1〜3人と少ないので、特定のユーザの予想に偏って取引されてしまうという影響が少なからずあるはずです。また、そもそも短期間の為替相場予想で的中させ続けることなど不可能で、ランダム的に取引している以上、スプレッド分ずつじわじわ削り取られていくのは必然であると考えられます。
 

通算損失

いわゆる"溶かしたお金"を計算してみると、
163500円(当初資金) + 200000円(賞金) - 136500円(現在資産) = 227000円
となります。約1年で20万弱の損失ですね。20万あれば何が買えるか、想像してみてください。
私は、SocialFXを通して20万円以上のエンターテイメントを享受しているので、後悔とかそういう気持ちは一切ありません。
 

破綻までのシナリオ

FX取引を行うには証拠金というものが必要です。「FXは損する可能性もあるから最低でもこのくらいの額は用意しておいてね」という金額で、一回の取引を行うために必要な最低保証金というものがFX業者によって定められています。
SocialFXが使っているFXTradeFinancialではポンド/円 1万通貨あたり約68000円の証拠金が必要です。(レバレッジ25倍、1ポンド170円換算)
資産額が68000円を下回ると証拠金不足のため、FX業者への新規注文が弾かれるようになります。この状態に陥ることがSocialFXの破綻というわけです。
 
実はすでに破綻の危機は経験しており、コンテストの優勝賞金20万円がGMOから振り込まれる直前、資産額が87000円と破綻一歩手前な状況がありました。今回もそろそろ破綻しそうだということで、奇跡が起こるのを信じています。
 

破綻を回避するために

大き分けて2つの回避案が考えられます。

投票してくれるユーザが頑張って予想する

よろしくお願いします!!!

賞金が出るイベントでまた優勝する

企業さん、よろしくお願いします!!!
 

iPhoneアプリ

iPhoneを持っている方へ

 以上です。