ぷるぷるした直方体

エンジニアの雑記です。My opinions are my ownというやつです

取引所のAPIを使って約定データを取得するダウンローダーを公開しました

「ぼくの考えたさいきょうの取引せんりゃく」が完成したとしても、それが実際のマーケットで通用するかは不明です。 しかし、実際にトレードをすると資金がすぐ枯渇したり、限定的な期間での検証しかできません。 そこで、ヒストリカルデータを使ったバックテストを行い検証をするわけですが、そのためにはまずデータを集めないといけません。

利用するヒストリカルデータには様々な粒度が考えられます。 30日間の検証をしたいとすると、1時間足では24 * 30=720本、1分足では720 * 60= 43,200本になります。 要は非可逆圧縮されたデータなので、データ容量と検証精度はトレードオフの関係にあると考えられます。

では、非常にタイミングがシビアな取引戦略の検証には何を使うべきでしょうか? 後から取得できるデータで最小粒度は以下のような約定データです(例はbitFlyerの/executions)。

{
  "id": 39287,
  "side": "BUY",
  "price": 31690,
  "size": 27.04,
  "exec_date": "2015-07-08T02:43:34.823",
  "buy_child_order_acceptance_id": "JRF20150707-200203-452209",
  "sell_child_order_acceptance_id": "JRF20150708-024334-060234"
}

このような「いつ・どこで・どれだけ・買った/売った」という4種類の情報は、APIのある取引所なら提供していると思われます。

これを使った場合、30日間でどれだけのデータになるのでしょうか? 時期や取引所により大きく変わりますが、bitFlyerでは8,000万でした。 1分足が4万ちょいなので、約2,000倍です。

さて、これだけ大きいと当然1回のリクエストでは取得しきれません。 取得上限は大体500か1,000ですので、最低でも8万回はAPIを殴り続ける必要があります。 毎回APIから取得することもできないため、手元のストレージに溜めておく処理も要ります。

上手くクエリパラメーターを更新しないといけないですし、取引所ごとに呼び出し方法は異なり、データ形式も異なります。 あぁめんどい……。

ライブラリの説明

ということで、Rustのcrateとしてダウンローダーライブラリを公開しました。

github.com

https://crates.io/crates/pikmin

機能としては以下を備えています。

  • APIを繰り返し叩いてMySQLや標準出力等に書き込む
  • 中断からの復帰
  • traitを実装して渡すだけの簡単カスタマイズ
  • ビルトインでbitFlyer, Liquid, BitMEXのダウンローダー付き

下記それぞれを個別に実装することで、お好みの動作に変更できます。

  • 取引所APIからの取得
  • 約定データ書き込み
  • 進捗書き込み

例えば、Binanceのデータを取りたい時は、APIからの取得部分を実装して渡すだけです。 書き出し先をMySQLにするかCSVにするかや、 GCP上で動かす場合は進捗書き込みレイヤーをCloud Storageにするなど、 環境に応じて最小限の記述で済みます。

詳しくはdocをどうぞ。

crateの公開について

初crateのpublishでしたが、ドキュメント・CIの設定やツール類が整っており比較的快適でした。 特にTravisCIを使う場合は、先人の.travis.ymlを移植するだけで済みます。 また、cargo-releaseを使うとバージョンアップの処理を自動化でできます。

rust-lang-nursery.github.io

docコメントが無い箇所や冗長な記述を検出するため、事前に下記のようなwarningやClippyによるlintを掛けておくと良いでしょう。

#![warn(
  missing_debug_implementations,
  missing_docs,
  trivial_numeric_casts,
  unsafe_code,
  unused_extern_crates,
  unused_import_braces,
  unused_qualifications)
]
#![deny(clippy::pedantic)]
#![deny(warnings)]
#![allow(clippy::doc_markdown)]
#![allow(clippy::stutter)]
#![allow(clippy::cast_precision_loss)]
#![allow(clippy::cast_sign_loss)]
#![allow(clippy::cast_possible_wrap)]

まとめ

バックテストの第一ステップである取引データの取得を簡単にするため、共通処理をライブラリとしました。 また、レイヤーを切っているため、拡張性を持たせて環境依存の処理がしやすいようにしています。

もし需要があればご利用ください。

Her Story レビュー

英語のお勉強ができるゲームを探していたところ、巡り合ったこのゲーム。 クリア(?)したのでレビューを記載します。

なお、本記事はネタバレしないように気を使った結果、中身がほぼ無になりました。

store.steampowered.com

総評: +1 (オススメ!)

有象無象の魍魎が跋扈するSteamゲーの中でも、怪作と言って差し支えないでしょう。 そもそもゲームと言えるのか、そこから考えないといけないかもしれません。

合うかどうかは完全に人によりますが、私は面白かったです。 事前情報無しでのプレイを推奨します。

概要

ネタバレになるので書きません。

良かったところ

なんと言っても特徴的なのは、そのゲームシステムです。 何の説明も無い上に、他に類を見ない形で進行するので戸惑いしかないですが、やるべきことが分かるようになっているのが上手いですね。

システムが「これ」なので、自由度が高く人によって進行がバラバラになるのですが、核心に迫る箇所はちゃんと難しくなっています。 例えば、オープンワールドのゲームでは、貴重な装備があるエリアはそこに配置する敵を強くし、ゲームバランスを保っています。 それと似たようなことがこの作品でも行われているように見え、関心してしまいました。 難易度調整が成されているという点では、これはまさしくゲームだと言えるでしょう。

また、細かい視覚効果や本筋に関係のない要素が、味のある雰囲気を作っています。 ちょっとしたネタもあり、インターネット黎明期に詳しい人はより楽しめるかと思います。

良くなかったところ

とにかく特殊で、何をもってクリアとするかも分かりません。 結果、達成感はあまり得られませんでした。スッキリしない……。

シナリオ自体は特筆すべきものではなく、もっと凝っていれば良いと感じました。 後続の作品に期待できる……と言えるかもしれません。 馴染みがない単語や地名も多いので、日本の推理小説っぽければより個人的な評価は上がったかと思います。

ゲームバランスは全体として悪くないのですが、ノーヒントで知らないと無理やろというものもあります。 もう少しくっつけたり会話を増やしたりして、極端に短いものを削って欲しかったです。

字幕があるので英語の勉強に使えるかもしれませんが、かなり自信が無いとオススメできません。 日本語字幕パッチもあるそうなので、ゲームを楽しみたい方は使いましょう。

まとめ

本当に中身のないレビューになってしまいましたが、ネタバレを避けたのでしょうがないですね。

普通ではないゲームを探している場合はプレイしてみてはいかがでしょうか。 システム的には、脱出ゲーム好きであれば特に楽しめるのではないかと思います。

インデックス投資は勝者のゲーム レビュー

Prime Readingで無料だったので読みました。

インデックス投資は勝者のゲーム──株式市場から確実な利益を得る常識的方法 (ウィザードブックシリーズ Vol.263)

インデックス投資は勝者のゲーム──株式市場から確実な利益を得る常識的方法 (ウィザードブックシリーズ Vol.263)

  • 作者: ジョン・C・ボーグル,John C. Bogle,長尾慎太郎,藤原玄
  • 出版社/メーカー: パンローリング
  • 発売日: 2018/05/13
  • メディア: 単行本
  • この商品を含むブログを見る

総評: +1 (おすすめ!)

インデックス投資を勧める本はいくつかありますが、その中でも特に優れた本だと思いました。 主張はシンプルで原理的、本の構成は端的で読みやすいです。 特に長期投資を始めたいが何をしたら良いか分からない方にオススメの一冊です。

概要

かのVanguard社を設立したJohn. C. Bogleが2007年に記した本の和訳です。

Vanguardという時点でどのような主張になるか分かる人もいるかと思いますが……想像通りです。

なお、タイトルにもある「勝者」とは、市場平均に極めて近い投資成果を出せる人を指します。 決して1か月で資産が10倍になることを目指す本ではありません。

本書の主張

本書の主張は非常にシンプルで、下の三単語に集約されます。

長期」「分散」「低コスト

  • 投資対象は長期で持つべきで、短期的な売買を繰り返しても必ず手数料に負ける
  • 分散することで市場平均(≒最適なパフォーマンス)に近づく
  • コストは(悪い方向に)裏切らない

すなわち、アクティブ(取引を頻繁にしたり、投資対象を絞ることでインデックスを超えるリターンを狙う)なファンドを使うべきではなく、手数料が限りなく低いインデックス連動のファンドを使って放置すべし、という主張です。

良いところ

低コストインデックスファンドの代表的な会社であるVanguard。その創業者だけあって、主張が明確です。 この本を読めばその利点、またどのような商品を買えば良いのかが分かります。 長期投資のスタイルがまだ定まっていない場合、特に有益な本となるでしょう。

類書と比べてこの本が特徴的なのは、ひたすらシンプルな主張を繰り返すのと、実際の商品紹介(≒Vanguardの宣伝)があることです。これにより読みやすい本に仕上がっています。

また、ちょいちょい含蓄のある言葉が降ってきます。例えば、以下のようなありがたい言葉など。

大きな利益を狙うのではなく……市場平均から得られる数%のリターンで満足するべき

また、ポートフォリオ作成についても記載があり、債権との配分を変えることで投資スタイルに合わせる、と言った実践的な内容も含まれています。

良くないところ

全体として分かりやすいのですが、やや疑問に思った所もあります。 私が理解しきれていないかもしれませんが、ここにまとめておきます。

まず、平均回帰を前提としてアクティブファンドが勝てないと断定していますが、生きてる間に回帰するかどうかは分からないので、そこを仮定するのは正しいのかという疑問があります。 また、もしマーケットに明確なエッジがあり、それを利用できるようなファンドが限られていれば、長期に渡ってインデックスを上回る可能性はあるのではないかと考えられます(皆がそのファンドを使うと必ず負けますが、現実的にはそうならないので)。 これは、証券会社がトレーダーを抱えているのと同じ理由だと思われます。 ただ、一般人からすれば長期投資のインデックスファンドが最適解なのは変わらないですが……。

次に、「○○が優れているのは運用後の歴史が証明している」と書かれている箇所と、「○○が示した直近の利益は所詮ヒストリカルデータなのであてにならない」という相反する発言があります。 「コストを減らす原理に従おうね」程度の記載だけであれば、混乱が無く読みやすかったと思います。

そして、主張には賛成であっても、実践する時は以下の点に気をつける必要があるでしょう。

  • Vanguard以外の商品でより有利なものは無いか?
  • 指標はどれにするか - 全世界か米国株か?SPDRかMSCIか?日本除く?
  • 日本から米国の商品を買うコストは織り込んでいるか?

分散先の考察

本書の中で、著者は「米国株だけに分散すれば十分」と書いています。 分散すればするほど良いという当初の主張と反するように思われますが、著者曰く米ドルから変える無駄が発生することに加え、(雑にまとめると)以下の理由を述べています。

米国の大きな企業はグローバルで、各国から富を吸い上げている。よって米国株で分散投資すれば、それは世界各国に分散投資したのと同じである

うーん、力強い。基軸通貨としての強みもあり、米国人は自国で分散すれば十分というのは頷けるところです。実際、アメリカではVTはあんまり売れていないようです。 少しコストも掛かるので(0.1%)、一概にお勧めしにくいのかもしれません。

とはいえ、何が起こるか分からないという立場で分散投資を勧めるのであれば、VTを勧めるのが筋なように思われます。

まとめ

自社製品の宣伝と米国を前提にしている所はややデメリットですが、長期投資で習うべき原理原則を明確に説明してくれている良書でした。

実践する場合は、国内から買える類似した商品とも比較して、良い投信やETFを探しましょう。 ちなみに、Vanguardの日本支社が出来るとか出来ないとか。安価で買えるようになったら嬉しいですね。

ケアンズ(グレートバリアリーフなど)観光 レビュー

エアーズロック観光に続き、ケアンズにも行ってきました。 この記事では、観光地としてのレビューを記載します。

今回は趣向を変えて、アクティビティごとに紹介してゆきます。

総評: +1 (おすすめ)

  • The・観光地
  • 日本人多し
  • グレートバリアリーフはやっぱり凄い

特にグレートバリアリーフの価値が高いですが、その他にも出来ることが多く、退屈することなく過ごすことができるでしょう。

続きを読む

オーストラリアで見つけたソフトドリンク レビュー

以前の記事では、ワインっぽいソフトドリンクをAmazonで注文していました。

blog.esplo.net

本記事は似たような形式ですが、ワインっぽさは一切無く、単にオーストラリアで見つけたソフトドリンクを比べています。 ……とは言っても、ほとんどスーパーに売っていたもので、あまり変わったものはありません。 何なら日本のスーパーにも売っている可能性すらありますが、気にしないことにします。

オーストラリアのソフトドリンク事情

本題のレビューに行く前に、オーストラリアのスーパーではどのようにソフトドリンクが売られているかについて記載します。 その販売スタイルから、飲み比べには全く向かないです。

理由としては、小さい商品は異常に高く、大きい商品はかなり安いという特徴があるからです。 例えば、PRESHAFRUITという製品では、350mlボトルは$3.40(約278円)です。しかし2Lは$7.00で売られており、350mlに換算すると$1.22(約100円)になります。どういう物流してるんだ。 そのため、小さいボトルを買って飲み比べ、ということが厳しいです。

そんな中でいくつか飲み比べてみましたので、下記にレビューを記載します。 あえて並び替えはせず、雑多に列挙しています。

いつも通り、レビュー結果は主観であり、甘いものを高く評価しがちです。気になった方は自分で旅行に行って試してみましょう。

続きを読む

とっても便利なInteractive Brokers

米国株やオプションを頻繁に取引するのであれば、米国の証券口座は必須と言えるでしょう。 いくつか選択肢はありますが、中でもInteractive Brokers(以降IB)は非常に使い勝手の良い証券会社です。

本記事では、そんなIBの何が便利なのかをまとめておきます。

ちなみに、これも↓の記事と同じく4年ほど前のドキュメントから引っ張り出されてきました。

blog.esplo.net

Interactive Brokersの良い点

IBの利点は、「商品」「手数料」「安全」「ツール」が揃っているところにあります。

商品

世界の株式、先物、オプションはもちろん、FX、債券、投資信託など様々な商品に投資可能。 しかもそれが同じプラットフォームで、同じ口座内の資金で購入できるという圧倒的利便性です。

国内の証券会社だと、先物に資金を振り替えて……FXは別会社だ……などの手間が発生するところがほぼ全てだと思います。 利便性はもちろん、資金効率の面でも変わってきますね。

手数料

ネット証券なので、手数料も安いです。

株でもオプションでも、1取引あたり$1程度です。 すでに安いですが、数量で計算され取引価格にほぼ依存しないので、単価の高い商品を取引するとよりお得になります。

www.interactivebrokers.com

国内の証券会社だと、約定代金に応じた手数料が取られるところが多いのではないでしょうか。 少額なら$1を切るかもしれないので、取引スタイルに応じてお得か分かれますね。

安全

海外口座と聞くと胡散臭く思えますが、IBは非常に信頼性の高い会社だと言えます。

まず、預けている資産は保全されています。 ↓を読む限りでは、非常に頑健な体質に思われます。

www.interactivebrokers.com

次に、ログインや取引時に二段階認証が必須です。独自のアプリなのが残念ですが。 日本の証券会社ではあまり見かけませんね。なんでだろう

ついでに言えば、二段階認証をスキップするとRead-onlyのログインになります。 日本の証券会社でこの機能があればM○ney F○wardも楽だっただろうになぁ。なんでだろう

また、カスタマーサポートも手厚いです。 問い合わせをすれば翌営業日に返ってきますし、必要があれば日本語でも問い合わせできます。 サポートの状況は専用のページで確認でき、メールの山に埋もれる心配もありません。

さらに、顧客の資産を守ることを重視しており、オプション取引を始めようとすると、なんと試験が始まります。 ちゃんと知識を付けて取引してね、というアンクルサムの気遣いが見受けられます。

ツール

ネット証券らしくツールも充実しています。

Trading Work Station(TWS)というツールを使って取引できますが、これがむやみに高機能です。 全く使い時の分からない取引画面や発注方法があり、一生全機能を知ることはないと思えます。 しかも高機能なためか、貧弱なPCで開くと描画がもっさりします。プロ用のツールと言えるでしょう。 簡単にトレードしたい人にはスマホアプリもあります。こちらは非常に使いやすいです。

また、APIも公開されており自由にツールを作成することができます。 素晴らしいですね。国内証券取引所でAPIがある所は……見たことないですね。岡三RSS?

www.interactivebrokers.com

ちなみに、「ペーパーアカウント」というデモ口座を作ることができ、そこでAPIを叩いて確認できます。 本番口座で動作確認をしなくてよいですね。

なお、ツールに必要なデータはサブスクリプションモデルで、必要なものだけ購読します。 大体は月に数ドル程度です。 例えば、米国株の価格はデータを購入しないと15分の遅延データになります。 月数ドルのコストを押さえたい場合は、他のソースで価格を見て発注だけしましょう。

良くない点

そんな素敵なIBですが、辛い点もあります。

口座維持手数料

25歳以下は$3、それ以外は$10が毎月掛かります。 ちなみに開設後3か月は無料、払った手数料がコレ以上でも無料になります。

毎月定額のコストが発生するのは厳しいですが、取引が多い人は全く影響を受けないので取引スタイルに依りそうです。

データが有料

必要なマーケットデータを購読するシステムのため、欲しい情報が有料なこともあります。 基本的な情報は無料データであり、オプションの情報も$1/月と格安ですが、コストが掛かり続けることになります。

海外口座

残念ながら米国市民ではないので、送金とドル転に手数料が発生します。 IB自体は入金手数料を取りませんが、送金元の銀行や中継銀行によって手数料が取られます。 何も考えずに送金すると、少額であっても5,000円以上の手数料が発生することもあるので要注意です。

なお、IBからの出金は月に1回手数料無料です。 頻繁に出金することもないでしょうし、実質無料だと考えられます。

また、口座内の円をドル転するのも5銭のスプレッドで変換できるので、IBに円で送ってドル転するのが良いでしょう。

初回入金額制限

わざわざ海外口座を作る人であれば問題ないかもしれませんが、25歳以下は30万円、それ以外は100万円の初回入金が必要です。 スパム防止と資産保全のためですが、どこかに吸い込まれないか不安になりながら送ることになります。

開設方法

メモ程度ですが、解説方法のTipsを書いておきます。 もしかしたら変化しているかもしれませんので、参考程度に読んでください。

口座選択

IBは2種類あり、日本支社のIBと、海外口座のIB LLCがあります。 日本向けのを開設すると日本株しか扱えないので、間違えずにLLCの方を選びましょう。

用意するもの

  • 電気ガス水道の領収書(3ヶ月以内)
  • 顔写真付き身分証明書(有効期限内)

これだけです。 海外に口座を開いたことがある人は分かると思いますが、良く分からない書類を書く必要はありません。 ネット上でポチポチするだけで開設できちゃう。

用意した方がいいもの

  • 三井住友銀行の口座
    • SMBCダイレクト + 外国送金サービス
  • 新生銀行の口座

IBに入金するためには、シティバンクの口座に振り込む必要があります。 シティバンク口座宛ては外国送金扱いになるので、 普通に振り込むと2500円程度掛かってしまいます。

が、SMBCダイレクトの外国送金サービスは、シティバンク宛てが無料です。 そのため、入金はSMBCから行うと手数料無しで済みます。

また、海外からの送金を受け取ると、リフィティグチャージでこれまた2500円ほど取られることが多い。 が、新生銀行は無料なので、受け取りを新生銀行にすることで手数料を抑えられます。 コルレス銀行で手数料が取られるかは要確認です。

開設時の注意

基本的には↓からポチポチするだけですが、幾つか注意点があります。

開設はここから行えます

経験値が必要

オプションを含む一部商品を扱えるようにするには、「2年以上の取引経験、および一定以上の資産」が必要となります。 また、FXレートでのドル転もFX口座が必要です。

ここが開けないと意味が半減なので、足りない場合は経験を積んで出直しましょう。

口座の種別

Reg. Tマージン口座にすることで信用取引ができます。 必要な時にレバレッジが効くのでオススメです。 なお、日本の信用取引とは概念が少し違うので注意されたし。

可能ならポートフォリオマージン口座の方が良いですが……。10万ドルの資産がある人はどうぞ。

日本語の注意書きは信用しない

電気ガス水道の領収書は12ヶ月以内、顔写真ない証明書が候補にある、など余裕で嘘が書かれています。 英語を読もう。

開設申込み後

開設申込みをすると、家に確認の郵便が来た後、程なくして開設されます。

開設後45日以内に入金しないといけないので、SMBCの外国送金サービスに申し込んだ頃に開設するとちょうど良いタイミングになります。

まとめ

IBは取引所における重要な点を網羅した、非常に優れた証券会社だと言えるでしょう。 特に、オプションを始めてみたい場合や米国株を高頻度で取引したい場合、第一に検討すべき証券会社です。

LiEat レビュー

評価が高くストーリーが面白そうなのはさておき、ジャケットがかわいいので購入したLiEat。 三部作セットを一通りクリアしたので、全部ひっくるめたレビューを記載します。

store.steampowered.com

総評: 0 (やってもよい)

グラフィックとキャラクター・世界観は秀逸ですが、それ以外の要素が薄く、やや期待していたものとは違いました。 とはいえ、3作合わせても短く値段もお手頃なので、やって損は無い作品です。

雑な概要

ドラゴンの女の子と詐欺師が旅をしながらストーリー上の謎を紐解いてゆきます。 女の子は嘘を食べる能力を持っており、これを使って事件を解決します。

昔ながらの2D RPG形式を取っており、一応戦闘もあります。

良いところ

まず特筆すべきはグラフィックのクオリティです。 時折差し込まれるイラストやムービーが非常に良い味を出しています。 2D RPGならではのドット絵も綺麗に描かれており、世界観に浸るのに重要な役割をこなしています。

次に、キャラクター作りが上手く、100人中99人がクリア後のアンケートで「✓ エフィーナがかわいかった」となること請け合いです。 単にかわいいだけではなく、3作品を通して少しずつ成長が見れるのも素晴らしいポイント。

また、3作品は歯切れが良く統一感もある短編スタイルです。 全体を通して徐々に出生の謎が明かされていくので、軽やかに3作品を終わらせることができるでしょう。

さらに、マルチエンドなどの作り込みや、3作品でも定価298円と牛丼より安いなどの良い点があります。 しかもサントラ同梱。お得!

良くないところ

ここまでの評価であれば優れた短編と言えたのですが、やや疑問や不満に思った箇所がありました。

大きな疑問として、RPGである必要性があまり分かりませんでした。 「嘘を見抜く」ための探索があまり必要なく、かつ謎解きが親切すぎて難度が皆無なので、動き回れなくても問題がないように思いました。 さらに、ゲームバランスがイマイチで戦闘はボタン押しっぱで良いこと、戦闘までの演出が弱いことが「ノベルゲームで良かったのでは……?」という疑問に拍車をかけます。

細かい点としては、システムが古く音量調節が無い、画面解像度が2種類しかない、などの不満点もあります。

その他

  • 何故かギャラリーモードのサウンド設定だけ充実している

まとめ

やや勿体無く思う点はありますが、長所は小作品として非常に強いものが揃っています。 短時間で終わり安いので、ちょっとした気晴らしにはこれ以上無い作品だと言えるでしょう。

トレーディングシステム開発・調査メモ (2)

引き続き、botの挙動で気になった箇所を調査してゆきます。 前回記事はこちら。

blog.esplo.net

今回は遅延の計測がメインです。

仮説2-2: 数秒でクローズしているのは、タイムラグによって乖離した価格で約定していることが原因である

前回の宿題です。

前回記事のMotivating Exampleの情報を整理します。

  • ローカルの価格データは 477018〜476834付近(スプレッド180円程度)
  • 2018-12-02 01:39:27 UTCにオーダーが受け付けられた
  • 約2秒後(2018-12-02 01:39:28.873 UTC)に約定
  • オープンの約定価格は482126.0
  • クローズは3秒後(2018-12-02 01:39:31.763)、482311と482283で約定

詳細なデータ

オープンした約定データです。約定価格が482126.0となっています。

{
    "id": 613460271,
    "side": "BUY",
    "price": 482126,
    "size": 0.02,
    "exec_date": "2018-12-02T01:39:28.873",
    "child_order_id": "JFX20181202-013928-512467F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181202-013927-012822"
}

こちらはクローズ。

{
    "id": 613460418,
    "side": "SELL",
    "price": 482311,
    "size": 0.01,
    "exec_date": "2018-12-02T01:39:31.763",
    "child_order_id": "JFX20181202-013931-517900F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181202-013927-012831"
},
{
    "id": 613460419,
    "side": "SELL",
    "price": 482283,
    "size": 0.01,
    "exec_date": "2018-12-02T01:39:31.763",
    "child_order_id": "JFX20181202-013931-517900F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181202-013927-012831"
},

簡単な調査

詳細は約定価格の履歴を漁らないといけないですが、まずは簡単に調べられる1分足データを使ってみます。Trading Viewで当時のローソクを見てみました。

安値: 480860、高値: 482761

たしかに安値高値の間に入っています。その価格で配信されていたのは間違いないでしょう。

詳細な調査

当時BFが示したbid/askが必要です。これは約定履歴から確認する必要があります。約定履歴をひたすらfetchしてDBに放り込むPythonツールを利用し、下記のような出力が得られました。

ちゃんと履歴がありますね。近辺の価格を見ても大きく乖離はしていないようです。ではオーダーが受け付けられた約2秒前(2018-12-02 01:39:27 UTC)、またオーダーをbotから送ったであろう4秒程度前、WebSocketからデータが送られたであろう6秒程度前ではどうだったのでしょうか?

  • 約2秒前(01:39:27.000)
    • bid: 481827 (2018-12-02 01:39:26.450000)
    • ask: 482211(2018-12-02 01:39:26.997000)
  • 約4秒前(01:39:25.000)
    • bid: 481796 (2018-12-02 01:39:24.950000)
    • ask: 481849 (2018-12-02 01:39:24.997000)
  • 約6秒前(01:39:23.000)
    • bid: 481499 (2018-12-02 01:39:22.920000)
    • ask: 481630 (2018-12-02 01:39:22.873000)

6秒前まで遡っても、477018〜476834とは4,000近く差のある価格になっていました。 実際、477018を切る価格だったのは01:31:42.950000、実に8分弱前です。 WebSocketからの価格データが遅延したとは考えにくい長さです。

このことから、ローカルで持っている価格データがおかしかったと考えられます。価格データのログを出していなかったため、これ以上の調査はできませんでした。また発生したら調べたいと思います。

結論2-2

数秒でクローズしている原因はタイムラグだけではない。

Motivating Exampleにあるような5000円以上の乖離は無かった。約定履歴とWebSocketから配信されているデータが正しいとすると、botにバグがあることになる。再現した時点で再度検証する。

仮説3: BF WebSocketからのデータは75%以上の割合で500ms以上遅延する

仮説1の中で、BitFlyerのWebSocketからの価格データがかなり遅延している可能性が浮かびました。データが遅れると動きが鈍くなり、トリガーの精度低下やSL/TPの設定がおかしくなる現象を招きます。

ネットワーク遅延があるため一定のオーバーヘッドはありますが、500ms以上あると遅延していると仮定し、サーバーの状態が良くても発生しているのではないか?ということを調べてみます。

計測方法

下記のプログラムをGCPのasia-northeast1で数時間動かします。軽量なので、インスタンスはf1-microにしています。

gist.github.com

10メッセージに1回遅延を計測し、外部ファイルに吐き出しています。 ここでの遅延の定義は、約定履歴メッセージに含まれる時刻データと受け取った時点での時刻の差分です。

頃合いを見てこのデータをローカルにダウンロードし、箱ひげ図にプロットしました。

計測結果

約20時間動かし、46359データが得られました。単位はmsです。

おっと、外れ値があまりに外れているので何もわからないグラフになってしまいました。一つ飛び出ているデータを削っても似たようなグラフになったので、数値で見てみましょう。

46359 rows
  2018-12-04 21:47:51 - 2018-12-05 17:13:29
count    46359.000000
mean       184.676228
std        398.884247
min        -80.261000
25%         76.384500
50%        105.105000
75%        181.621000
max      28782.979000

マ、マイナスぅ!? 考えられる原因は以下ですが、1番が普通にありそうなのが怖いところですね……。

  1. BFが未来の時刻で配信している
  2. 計測プログラムにバグがある
  3. 時折光の速さを超えた配信がされている

最大遅延は28.7秒、最小遅延は-80msというトンデモな結果になりましたが、75%で見れば181msと当初の仮説より優秀な結果になりました。不安定な時はとことんおかしくなる類のシステムに見受けられます。

念の為計測時間を考慮した算出もしてみましたが、特に結果に影響はありませんでした。

結論3

仮説3: BF WebSocketからのデータは75%以上の割合で500ms以上遅延する

計測したところ、75%の割合では181ms程度だった。

計測ツールにバグがないとすると、配信されているデータの信頼性が疑わしい時がある。

仮説4: IFD注文では、正常時の取引所でも約定まで必ず1秒以上遅延する

またしても、前回調査で発見された問題です。取引開始時(IFD注文)、実際に約定するまで2〜4秒程度の遅延がありました。ここでは、毎回それが発生しているかどうかを調べます。

データ集め

これは、今までの約定データを使えば簡単に調査できます。まず下記のようなParent Order一覧を取得します(/v1/me/getparentorders)。

{
    "id": 141298782,
    "parent_order_id": "JCP20181204-033429-568254",
    "product_code": "FX_BTC_JPY",
    "side": "BUYSELL",
    "parent_order_type": "IFDOCO",
    "price": 0,
    "average_price": 428902,
    "size": 0.03,
    "parent_order_state": "COMPLETED",
    "expire_date": "2018-12-11T02:14:29.057",
    "parent_order_date": "2018-12-04T03:34:29.057",
    "parent_order_acceptance_id": "JRF20181204-033429-761002",
    "outstanding_size": 0,
    "cancel_size": 0,
    "executed_size": 0.02,
    "total_commission": 0
}

このparent_order_idを使い、'/v1/me/getchildordersから対応する注文を引いてきます。TP/SLによる約定結果も含めて返ってくるため、最後の要素だけ使用します。

[
    {
        "id": 740343317,
        "child_order_id": "JFX20181204-033457-094572F",
        "product_code": "FX_BTC_JPY",
        "side": "BUY",
        "child_order_type": "MARKET",
        "price": 0,
        "average_price": 429188,
        "size": 0.01,
        "child_order_state": "COMPLETED",
        "expire_date": "2018-12-11T02:14:29",
        "child_order_date": "2018-12-04T03:34:43",
        "child_order_acceptance_id": "JRF20181204-033429-568286",
        "outstanding_size": 0,
        "cancel_size": 0,
        "executed_size": 0.01,
        "total_commission": 0
    },
    {
        "id": 740342477,
        "child_order_id": "JFX20181204-033439-068825F",
        "product_code": "FX_BTC_JPY",
        "side": "SELL",
        "child_order_type": "MARKET",
        "price": 0,
        "average_price": 428616,
        "size": 0.01,
        "child_order_state": "COMPLETED",
        "expire_date": "2018-12-11T02:14:29",
        "child_order_date": "2018-12-04T03:34:29",
        "child_order_acceptance_id": "JRF20181204-033429-568263",
        "outstanding_size": 0,
        "cancel_size": 0,
        "executed_size": 0.01,
        "total_commission": 0
    }
]

最後に、このchild_order_idを使って/v1/me/getexecutionsから約定時間を取ってくれば完了です。

{
    "id": 619456202,
    "side": "SELL",
    "price": 428616,
    "size": 0.01,
    "exec_date": "2018-12-04T03:34:39.583",
    "child_order_id": "JFX20181204-033439-068825F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181204-033429-568263"
}

この例ですと、以下のように遅延が計算できます。

  • 親注文受付: 2018-12-04T03:34:29.057 (getparentorders から "parent_order_date")
  • 小注文発注: 2018-12-04T03:34:29 (getchildorders から "child_order_date")
  • 小注文約定: 2018-12-04T03:34:39.583 (getexecutions から "exec_date")

あちゃー、発注から約定まで10秒遅延してますね……。成行とは思えません。

算出方法は分かったので、簡単なプログラムを書いて直近100件の注文における遅延を出してみます。

10.000526
14.999824
22.000062
17.999986
5.999754
5.99966
21.999919
2.000142
2.000186
11.00037
8.000848
6.99988
0.000701
14.999447
13.999612
6.000358
5.000455
24.999334
24.000833
26.999897
21.000389
4.3e-05
...
0.00028
0.000204
0.000186
3.00005
2.00075
-8e-06
1.000091
0.00017
-0.000581
0.0002
-0.000178
0.00017
...
0.999356
2.000106
-0.000269
0.000326
1.000101
...
0.00024
7e-06
0.00029

上からデータを見ていくと、「やっぱり遅延が出てますね……あれ、結構短いなぁ……マ、マイナスぅ!?」と、楽しい気分になること請け合いです。マイナスは妙ですが、仮説3のWSでも見受けられたのでそういうものかもしれません。今回はまだ、DBが分散していたり、書き込み遅延があると考えれば説明が付きそうです。何にせよ配信データを過信すべきではありません。

さて、箱ひげ図にしてみると以下のようになります。

外れ値として20秒近い遅延はありますが、中央値はほぼ1秒です。データの連続性を鑑みると、取引所の状態による影響が非常に大きいと考えられます。取引所の状態は記録されていないため正確なことは分かりませんが、損失に影響がありそうであれば、機会を見て調べてみたいと思います。

            delay
count  100.000000
mean     4.870090
std      7.284449
min     -0.000581
25%      0.000242
50%      1.000096
75%      7.000057
max     26.999897
median 1.000096

結論4

仮説4: IFD注文では、正常時の取引所でも約定まで必ず1秒以上遅延する

直近100回では、50%近い注文が1秒以内に約定しており、必ず1秒以上遅延するとは言えない。

損失との関係はまだ調査していないが、expireを短くすることで遅れた注文を切ると良いかもしれない。

まとめ

今回も本質的な損失を減らす調査にはなりませんでしたが、botを作る上で考慮すべき必要があるので良しとします。

次回は、今回分かった遅延への対策を考えます。例えば、以下のような仮説を扱う予定です。

  • 親注文より子注文の方が速く約定するのでは?
  • WSからの遅延が大きい時に新規注文を止めれば損失が減るのでは?

「株式より有利な科学的トレード法」「超・株式投資」レビュー

オプション投資は無限の組み合わせができて楽しいです。 しかしそれは、どのようなシチュエーションでどの戦略を取れば良いのかが分かりにくいことも意味します。

本記事では、そんなオプション戦略を解説してくれる、入門に優れた本を2冊まとめて紹介します。 ちなみに両方とも著者は同じで、内容もかなり被っています。

なお、読んだのは2015年ですが、当時書いたメモが残っており、もったいないので記事にしました。

株式より有利な科学的トレード法

東大卒医師が実践する 株式より有利な科学的トレード法

東大卒医師が実践する 株式より有利な科学的トレード法

総評: +1 (オススメ)

著者のブログ記事によると、タイトルの胡散臭さとレイアウトの悪さは出版社の都合のようです。 そこを差し引いて考えれば、内容はわかりやすく実践的で、入門にはもってこいです。 後述の「超・株式投資」とは内容が被る箇所が多いので、オプションの戦略だけ知りたいなら本書だけで良いでしょう。

概要

主に下記6種類のオプションを使った手法を紹介し、原資産ホールドを上回るリターンを得られることを示しています。

  • プット売り・現金確保プット売り(CSP)
  • カバードコール(CCW)
  • バーティカル・スプレッド
  • バタフライ
  • アイアンコンドル
  • ダイアゴナル・スプレッド

良いところ

主要なオプションを使った戦略の説明と、それぞれ利用シーンと例が載っているため非常に分かりやすいです。 説明には原資産と比べたシャープレシオの改善が示されていたりと、入門には必要十分な情報が載っています。

また、各戦略は実践的な説明がされており、ロスカット基準などの出口戦略も記載されていることが多いです。 例えばブルプットスプレッドであれば、以下のような詳細な基準が書かれています。

  • ショートするプットは「原資産の価格から0.2×ivだけ低いストライク(K1)」
  • ロングするプットは「K1の3%下のストライク」
  • ロスカットは、損失が10%、またはK1より2%低くなったら行う

CCWではこう。

  • カバードコールにブルプットスプレッドを組み合わせ、カバードコールの利益を高める事ができる
  • 特に、「3%OTMのコールを売り、3%OTMのプットを売り、6%OTMのプットを買う」のが管理しやすい...

全体として、入門書として必要な内容が良くまとまっています。 同じ著者の本、「超・株式投資」、「週末投資家のためのカバードコール」の内容を集約したような構成になっており、この一冊で必要な知識は十分手に入るように思われます。

悪いところ

内容は上記の通り入門書として優れているのですが、それ以外の部分で減点要素があります。

何はさておき、縦書きが非常に辛いです。数字が多く出てくるのに何故縦書きなのか。 また、「科学的」が何を指すのかが分からないです。エビデンスを調べて〜、ということを指すのであれば、株式でも可能なはずです。

これらは出版社都合なようで、その苦悩の一端は下記の著者コメントに凝縮されていますので、ここに引用します。

本のタイトルは、よほど著名な方でない限り、出版社が勝手に決めるという出版業界の悪しき慣習をご理解ください。本のタイトルと内容が乖離しているのは、本書だけではないはずです。「論文のタイトルは最も大事」とありますが、最も大事なのは内容です。しかし、論文の場合、タイトルは自分で決められるのでいいです。

医学と投資についての随想 (KAPPA) : 拙書に対するレビューへのコメント

まとめ

まとまりが良く読みやすいため、オプション取引に興味がある方には必読の一冊になっていると思います。 また、これを読んで分からなければ下記の「超・株式投資」や「週末投資家のためのカバードコール」を読む、というゲートウェイ的な使い方もできます。

超・株式投資

超・株式投資 (Modern Alchemists Series No. 122)

超・株式投資 (Modern Alchemists Series No. 122)

総評: +0 (人によってはオススメ)

上記「株式より有利な(ry」と半分被るので、前半のETFの紹介が必要な人のみオススメです。

概要

2部構成になっており、前半はETFの比較、後半はオプション戦略について述べられています。 後半の内容は、上記「株式より(ry」と被ります。

良いところ

前半パートをざっくりとまとめると、インデックス投資の勧めとETFの紹介です。 この類の本は多いですが、銘柄とそれらを組み合わせたポートフォリオまで示してくれています。 比較的短くまとまっているので、今までインデックス投資について読んだことのない方にはお勧めです。

後半パートはオプション戦略の紹介で、主にCSPとCCWを使ったお手軽投資法です。 実際にオプションを使ってリターンがどれくらいになるのかが示されており、ざっくりと外観を掴むのと結果のイメージを掴む、両方が可能です。

良くないところ

全体としてはまとまりが良いのですが、冗長だったり逆に知りたいことが書かれていなかったりします。

前半のETFパートでは、正直掲載する必要のないと思える情報が沢山あります。 読み物としては面白いですが。 後半のオプションパートでは、「どういう時に」「どれくらいのリスクを取って」やるといいのかがあまり明確ではありません

また、戦略を外観するのであれば、メリット・デメリットをまとめた表があると良いなと思いました。

まとめ

全体として冗長&結論がわかりにくい、といった欠点はあるものの、実際にインデックス投資やCCW・CSPを始める後押しにはとても良い本でしょう。特に投資戦略をあまり知らない人が読むと、目から鱗な内容が沢山あるはずです。

ただし、後半パートについては前述の「株式ry」を読むと良いので、コスパは悪そうです。

合わせて読みたい

この本でもややこしい場合は、同じ著者の「週末投資家のためのカバード・コール」を読むと良いでしょう。内容が絞られておりよりシンプルです。

週末投資家のためのカバード・コール (Modern Alchemists Series)

週末投資家のためのカバード・コール (Modern Alchemists Series)

この本も読んだのですが、ドキュメントを漁ってもレビューが見つからなかったので記事はありません……orz

他のレビューなど

他ブログでもレビューされていますので、参考にしてください。

大まとめ

kappaさんの本を2冊(実質3冊?)紹介しました。 ややこしそうなオプション取引ですが、使えると何かと便利です。 本書を読んで始めてみてはいかがでしょうか。

なお、補足情報が得られるため、合わせて著者のブログも読むのをお勧めします。

医学と投資についての随想 (KAPPA)

約半年のオーストラリア留学にかかった費用

留学に行くとなると、費用は大きな心配事になるかと思います。 私も一体いくら必要なのか想像がつかず、送金しなさすぎたり急に資金を集める必要が生じたりしました。

本記事では、実際に留学に掛かった費用と、どのように負担を減らせるかについてを記載します。

掛かった費用

ここでは、ジャンルごとに掛かった費用を記載してゆきます。 自分の場合に照らし合わせて値段を考えてみて下さい。

なお、$1 = 80円で換算しています。

語学学校

  • 入学金: $200
  • 授業料: $350 / week
  • 教材費など: $250

18週間なら$6,750(540,000円)ほどです。

これは選んだ学校によって大きくバラつくと思います。 安くて良いところ、高くて悪いところなど様々ですので、目的に適った学校を選びましょう。

なお、大学だと$20,000 / year (1,600,000円)ほど掛かるようです。

  • 学校手配: $1,430 / mo
  • Airbnb: $302 / week
  • ホームステイ(朝夕食事込み): $300 / week

18週の前後1週間も滞在するとし、20週で$6,000(480,000円)ほどです。

通常、学校手配はさらにエージェントに依頼するため、クオリティの割に圧倒的に高くなります。 クラスメイトに聞いても様々な苦情が発生していたので、学校には頼まずAirbnbにするのを強くお勧めします。

家は特に節約が効くポイントです。 ルームシェアをすれば圧倒的に安くなります。

入国前(片道航空券、ビザ)

  • 航空券片道(Qantas): 62,000円
  • 学生ビザ: $560
  • OSHC(必須の保険): $310

合計131,600円ほどです。

航空券はシーズンに依存するのですが、一般に早めに取れば安いかと思います。 ちなみに、私は取っていたJetstarの航空券が当日にキャンセルされ、慌ててQantas便を取りました。

オーストラリアの学生ビザは他の国と比べて異常に高いです。OSHCという保険も必ず取らないといけないため、結構な出費になります。

食費

ホームステイだったので、朝夕は考慮しません。

  • ランチ: $5〜$10

ブリスベン市内にはフードコードがあり、$7もあれば色々な料理が食べられます。 また、路上の店でも同程度の値段で提供されています。

20週間(140日)では$700〜$1,400(56,000〜112,000円)です。ここも家と同じく、自炊をすればかなり安上がりです。

ちなみに、オーストラリアは物価が高いと考えている方も多いですが、スーパーの食料は安いです。 小さいものは高いですが、大きなものは安いので、まとめ買いができるなら節約ができます。

旅行

  • 航空券(シドニー往復): $191
  • 航空券(Brisbane -> Ayers Rock): $200
  • 航空券(Ayers Rock -> Cairns -> Narita): $1,357

もはや留学に関係ないですが、一応ここに書いておきます。 シドニーは東京大阪間くらいの気持ちで移動できます。

なお、Sydney、Ayers Rock、Cairns観光については下記記事をご覧ください。

blog.esplo.net

blog.esplo.net

(Cairnsはいずれ出ます……)

その他

  • IELTS($340)
  • ゲーセン($100)

ここは人によりけりですね。

ゲーセンはプリペイドカードを買う方式が主流です。 数十ドル入れるとボーナスが付いてくるので、見た目よりお得です。

金額のまとめ

大体20週間の留学で、学校・家・入国・食費で1,263,600円掛かっていました。 加えて旅行に行ったり試験を受けると追加で出費が生まれます。

工夫をすれば大きく削れる箇所はありますが、基本は頑張って貯金をするか、働きながら留学することになります。

節約方法

さて、大体必要な費用が分かりましたが、海外なので余計な手数料が掛かります。主な手数料は以下の2つ。

  1. クレジットカードの為替レート、およびそれに加算される手数料
  2. 海外への送金手数料

私が使った方法は下記の2つ、Sony bank WALLETTransferwiseです。

クレカの手数料を減らす

外貨建ての支払いをすると、Visaなどの決済会社が独自の通貨レートで変換をし、さらに手数料を付けて最終的な請求額になります。 Visaは安いほうですが、それでも合計1.5%以上の上乗せは避けられません。

さて、これをなるべく減らすには、外貨の請求を外貨のまま引き落としすれば良いです。 具体的には、最初に一括で外貨に変換をし、その外貨口座から引き落とせるカードがあれば安上がりになりそうですね。

ということで、Sony Bank WALLETがこのような条件を満たします。 これはクレカと同等ですが、実体はデビットカードで外貨口座から即時引き落とされます。

moneykit.net

為替レートは実際のレートから片道0.25の差なので、0.3%程度です。 高額な支払いでは1%の差は結構大きいですね。

他にも海外キャッシングといった方法もありますが、手間もかからず残高や利用履歴もアプリから分かるのでオススメです。 特にキャッシュレス社会のオーストラリアでは便利です。

海外送金手数料を減らす

海外に銀行口座を作った場合、そこへの送金手数料は非常に高いです。 少額でも3,000円以上かかったり、そもそも為替レートが悪いなどが相まって、気軽に送金はできません。

そこでTransferWiseを使います。これを使うだけで、圧倒的に安い手数料で送金ができます。しかも速い。

transferwise.com

仮に200,000円をオーストラリアの銀行に送金する場合、下記のように1,282円(0.6%)のみ掛かります。 他のややこしい手数料は一切なしです。

何故こんなに安くなるのか。それには面白い仕組みがあるので、気になった方は調べてみてください。

まとめ

半年弱、20週間の留学であれば、大体120万円程度が掛かります。 ルームシェアや自炊をするとかなり出費を抑えられますし、働きながら留学をするという手もあります。 海外特有の手数料は、便利なカードやアプリを使って安く抑えましょう。

TOEIC L&R TEST 900点特急 パート5&6 レビュー

TOEIC対策本として有名な特急シリーズ。試しに1つ買ってみたところ良作でした。

総評: +1 (オススメ!)

文法問題の思考力を付けるのに持ってこいで、900点を狙う上ではかなり効果的と言えるでしょう。

TOEIC L&R TEST 900点特急 パート5&6 (TOEIC TEST 特急シリーズ)

TOEIC L&R TEST 900点特急 パート5&6 (TOEIC TEST 特急シリーズ)

ちなみに、読み終わったのは随分昔で、レビュー記事を書いていなかったのを最近思い出しました。

良いところ

本書の最も特徴的な点はページ構成です。 1ページに問題があり、めくると答えと解説が書かれている楽しいクイズ形式。 また、各問題は1分以内に答えを出せるようになっており、通勤・通学に公共交通機関を使う場合に効果が高いです。

また、問題の難度が上手く設定されており、一通り理解するだけで(文法は)900点適正にはなると思われます。 さらに解説が非常に丁寧で、文法の理解だけでなく答えに行き着く論理を身につけることができます。

良くないところ

当然ながら、文法を網羅的に覚えるための本ではありません。 さらに、会話やリスニングに活かせる文法には遠いので、あくまでTOEIC対策として割り切って読むのが良いと思います。

TOEICの点数以上の英語力を求める場合は、他の本や動画を探しましょう。 BBC Learning Englishや、その他動画で分からなかった文法を適宜調べるなど、他の要素と絡めて勉強するのがオススメです。

まとめ

クイズ形式なため細切れ・短時間で勉強でき、かつクオリティの高い解説が付いています。 文法問題の対策には非常に効果があると考えられる良書でしょう。

ちなみに、900を取るまでに私がやったTOEIC対策は、公式問題集とこの本だけです(記憶にある限りでは)。

TOEICテスト新公式問題集〈Vol.5〉

TOEICテスト新公式問題集〈Vol.5〉

ポイント管理に疲れた人のためのクレカ: Booking.comカード

クレカのポイントモールを経由して……期限までにポイントを使って……ポイントを他のサイトを経由して変換……。僕もう疲れたよ……となっている人も多いのではないでしょうか?

私も最近しんどくなってきました。目標としていたマイルが貯まったからかもしれません。とにかく楽ちんで、しかもお得なカードは無いものか……。

ということでこの記事では、私の現在のメインカードであるBooking.comカードの良い点を紹介してゆきます。

楽なカードの定義

楽なカードとは何でしょうか?それは、使うだけでお得なカードだと言えるでしょう。さすがに使わないでお得なのはありません(付帯保険は別ですが)。

また、年会費があるとやや面倒です。使わなくなってもお金を払わないといけないですし、年会費を無料にする条件があるとそれも考えないといけません。

マイルを頑張って貯める例

以前私もやっていた、ひたすらマイルの還元率を上げる方法を引き合いに出し、面倒な点を列挙してみました。この手法では、「ANA Visa ワイドゴールド」「ANA To Me Card (ソラチカカード)」を使います。なお、2018年末現在は少し変化しています。

blog.esplo.net

  • 年会費がかかる(しかも2枚)
  • 毎月の支払いはマイ・ペイすリボで少しだけ払う必要がある(毎月忘れずに自分で入力する)
  • Amazonなどで買い物をする時は、三井住友カードのポイントサイトを経由
  • カードのポイント -> ポイントサイト -> メトロポイント -> ANAマイル(移行に3か月くらいかかる + 毎月上限がある)

これで1.62%のマイルが貯まっていました。マイルを集める上では極めて良い還元率ですが、とにかくめんどくさい

楽なカードとは何か

ポイント管理が必要なく、現金で還元されると楽だと思われます。

これに近いものとして、ポイントをキャッシュバックに変換できるカード、漢方スタイルカードというものを使っていました。これは貯めたポイントを変換すると、以降の月でそれに応じた引落額が減るというものでした。とても良いカードだったのですが(今はリーダーズカードに変わった)、結局ポイントを変換しないといけないことには変わりありません。

ということで、「楽なカード」は使うだけで現金口座に振り込まれたり、キャッシュバックされるカードとします。

楽なカードの一覧

ポイント管理から解放されるべく調査をしてみると、現金還元っぽいカードを2つだけ見つけました。

Google Pay還元のAndromedaカードと

www.jaccs.co.jp

キャッシュバック還元のBooking.comカードです。

どちらも還元率は基本1.0%です。

Andromedaカードの特徴

まさかのGoogle Pay専用でキャッシュバックされます。また、発行してしばらくや、クレカのポイントモールを経由すると還元率が1.5%に上がる余地があります。

おサイフケータイを持っている人なら検討の余地はあるかもしれませんが、Google Payの利用シーンが限られている現状、結局楽にはなりません。Google Payの普及に従ってカードの魅力が上がるので、引き続き注目する価値はあるでしょう。

Booking.comカードの特徴

こちらはどう頑張っても1%ですが、さすがにホテルの予約はお得です。カード専用サイトからホテルを予約すると+5%……ってそれ表示価格値上げされてないかなぁ……。不安。

Booking.com宿泊で貯める

また、Booking.comのGenium会員になれるコードが先着で貰えます。

という細かい利点はあるのですが、なんと言っても使うだけで引落額からキャッシュバックされるという楽さが最大のウリです。一旦ポイントを経由しますが、自動で翌月以降の引落額が減算されます。

ちょっと手間をかけて還元率を上げる

多少手間をかけてもお得さを増したい場合は、Kyashを使うと良いです。

kyash.co

支払いの裏側をBooking.comカードにすれば楽に+2%が実現できます。 注意点として、Kyashの上限額は厳しいので、大きな買い物をする時は上限を超えないかチェックしましょう。

まとめ

Time is money.

ポイント還元率は1%と高いわけではないですが、ポイント管理に疲れた人やミニマリストにはオススメのカードです。 私もしばらくメインとして使ってみたいと思います。

A Hat in Time レビュー

Steamストアで話題になっていたアクションゲーム、A Hat in Timeをやりました。

store.steampowered.com

総評: +1 (オススメ)

非常に優れたアクションゲームでした。特に絶妙な難度のパズル要素と世界観がよく出来ていました。 キャラクターの個性が強いので、ストーリーも楽しめること請け合いです。

概要

Steamストアで2017/10に配信された、3Dのアクションゲームです。 現時点で8,000近いレビューがあり、Overwhelmingly Positiveの評価を誇る売れっ子。

主人公はエイリアンで、帽子の力を使ってステージを進めてゆきます。

http://hatintime.com/hatintime.com

良かった点

全体としてポップでキュートなアクションです。 ただ可愛らしいだけでなく、中身もしっかりしています。

ステージクリア型のアクションゲームですが、パズル要素が上手く組み込まれています。 帽子の持つ能力を活かして進んでゆくのですが、ちょっと頭をひねる必要があったり、伏線として未知のオブジェクトが出たりという塩梅が上手いです。 ゼルダほど強いパズルでは無いですが、アクションが主でパズルはあくまで副として置かれているところがストレスを減らしています。

ストーリーは良い感じに雑で、鬼畜主人公が騒動を起こしたりざっくり解決したりします。 本来はあまり脳を使わなくて済む……はずですが、英語なので日本人の感想はやや異なりそうです。 とはいえ、決して底が浅いわけではありません。 宇宙船の内部にそれっぽい機材や環境があったり、主人公の生活を示唆するメモがあったりするのですが、これらについて多くが語られないので謎のままです。 考察とアンソロジーが捗りますね。

リソース面も良い出来だと言えるでしょう。 (特に)主人公のモーションが可愛らしいかったり、某ステージではホラーゲームでも通用しそうな演出があったりと優れています。 他にも、BGMはメインテーマをステージごとにアレンジしたものが使われており、統一感が出ています。 敵やオブジェクトを殴った時のエフェクトも楽しげで、世界観の補強の一役買っています。

いろいろと詰め込まれた作品ですが、全体のボリュームはちょうどいい分量に収まっています。 20時間程度でそこそこやり込み要素も進められますし、自由度が高いのでステージをスキップすることもできます。

良くなかった点

全体として良クオリティですが、作りが荒い部分もいくつか見受けられます。

まず、パズルがゴリ押しで何とかなる場合がありました。 アクションでパズルが何とかなるのは面白いと言えば面白いですが、やや作りの甘さを感じてしまいました。

また、PS初期の3Dゲームのように3D酔いします。 視点変更も多いアクションなのですが、特に補正は無いので人によってはプレイするのが厳しいかもしれません。

さらに、英語の発音がすごく気になります。 英語ネイティブがわざとやっているのか、ノンネイティブが普通に喋っているのかは分かりませんが、会話がなかなか聞き取りにくいです。 キャラに依りますが、異様に巻き舌なのでヨーロッパに行った気分が味わえます(?)。

総評

キュートな世界観が優れたアクションゲームで、楽しんでプレイできることでしょう。 ガチパズルを期待したり、3D酔いする人は要検討です。

総評は+1.5くらいなのですが、結局DLCを買うに至らなかったので+1にとどめました。

トレーディングシステム開発・調査メモ (1)

自動トレーディングシステム(=bot)が毎日ちょっとずつお金を稼いでくれると、精神が安らぎ健康になることが知られています [要出典]。

現在そこそこ安定して小銭を稼ぐbotが1体いますが、改善の余地は多くいずれ頭打ちになるのは目に見えています。そこで、botの理論強化・利益のスケールを目指し、他の環境や取引所で動くbotを作ることにしました。

まだ取り組んで2週間ほどで基幹部分を作っただけなので、収益を出すには多くの改善が必要に思われます。本記事では改善する上で取り組んだことを記載し、研究成果とbot作りの楽しさを伝えたいと思います。

とどのつまりは、ただの自分用のメモです。

前提

取引所はBitflyer、銘柄はFX_BTC_JPYです。ここは取引高が多いため流動性が高く、botを動かすのに適してると考えられます。一方で、既にbotが跋扈していたり、システムがすぐ不安定になったりと暴れん坊な側面もあり、一筋縄では行きません。

なお、スプレッドは安定時であれば0.02%程度(表示を信じれば)です。1単位500,000円だとすると100円、0.01ロットなら1円の損が積み重なることになります(実際のスプレッド、成行のスリッページは必要が生じたら計測します)。

手法はシンプルで、相場を監視して条件を満たしたらポジションを1つだけ取り、1分程度でクローズする超短期取引(=Scalping)です。ポジションを取るトリガーについては秘密としておきます。

ゴール

短期的なゴールは、ほぼ最小ロットで3日間のトータルがプラスとしました。1週間でN円などの利益目標を置くのはとりあえず後回しで、まずは損失を減らすことに重点を置きます。毎日プラスという目標でも良いですが、相場環境に依存する所が大きいので幅を持たせています。

botの現状

現在のbotは下記のような基本的な機能が出来ています。が、検証期間はこれからなのでバグが潜んでいる可能性は高いです。

  • 相場環境の監視
  • オーダーの発注
  • ポジションの監視・クローズ
  • 取引所の監視(不安定そうなら取引しない)

ちなみに、このbotは第3世代です。第1世代は他所で頑張っており、第2世代は諸事情で動いていません。第1と第2はPython製、今回はRust製です。

現在はポジションをIFD注文(成行、+900にTake Profit、-600にStop Lossを設定)で取って30秒でクローズするようにしています。

収益の現状

この状態で、0.02ロットで0時ごろから11時間ほど動かしてみました。テンションも下がる右肩下がりです。

このグラフ表示だけでは詳細がイマイチ良く分からないので、Pythonで雑に取引履歴を出すツールを作り、以下のような表示が出るようにしました。APIの/v1/me/getchildordersから引っ張ってきています(後述しますが、これが問題を引き起こしていました)。

微妙に損益が合いませんが、僅かな差なので無視します(アプリの表示が正しいとは限らない)。

...
2018-12-02 00:27:14, 0:01:12s, prof: -3.9, start: SELL, diff: 195.0, amount: 0.02,0.02
2018-12-02 01:31:36, 0:00:09s, prof: 15.48, start: BUY, diff: 774.0, amount: 0.02,0.02
2018-12-02 01:32:15, 0:00:17s, prof: 1.56, start: BUY, diff: 78.0, amount: 0.02,0.02
2018-12-02 01:33:04, 0:00:30s, prof: -18.26, start: SELL, diff: 913.0, amount: 0.02,0.02
2018-12-02 01:35:34, 0:00:18s, prof: -13.56, start: BUY, diff: -678.0, amount: 0.02,0.02
2018-12-02 01:36:04, 0:01:22s, prof: 9.8, start: SELL, diff: -490.0, amount: 0.02,0.02
2018-12-02 01:39:27, 0:00:02s, prof: 3.42, start: BUY, diff: 171.0, amount: 0.02,0.02
profit: -165.18000000000006, 120 trade

さらに加工する必要が生じたら、jsonなりCSVなりで吐き出すようにもできます。

仮説1: 逆に取引をすれば儲かる

誰しも思う仮説です。時間が決まっているなら上がるか下がるかしかないので、逆の取引をすれば爆益なのでは?という発想です。

履歴を見ると、取引回数は120回でした。仮にスプレッドが0.02%(約100円幅)であれば、lotは0.02なので2 * 120 = 240円払っていることになります。実際は-165円なので、スプレッドが無い世界なら+75円になっていると考えられます。そのため、逆の取引をすると-315円になってしまい、より損が拡がってしまいます。

ただし、これはスプレッドが0.02%で、かつ個別の取引に特性がないことを仮定しています。特定条件では逆の取引をすると良い、というのは十分起こり得るので、この発想には時折振り返って考える価値はあるでしょう。

実際、数時間逆の取引をするようにした結果は右肩下がりだったので、間違ってはいないと思われます。

結論1: 現在の取引方向は全体的には合っているので、一旦このまま動かす

仮説2: 異常なポジションが損失を生み出している

履歴を見ると、以下のような取引が散見されます。

2018-12-01 21:17:04, 0:00:01s, prof: -4.5600000000000005, start: SELL, diff: 228.0, amount: 0.02,0.02
2018-12-01 21:17:05, 0:00:01s, prof: -1.06, start: SELL, diff: 53.0, amount: 0.02,0.02

現在の設定では、この値幅では30秒後にクローズするはずです。一瞬で閉じるとスプレッドを払うだけになってしまうので、損失に寄与している可能性が高いです。

仮に取引所側の問題であれば、スプレッドが一瞬だけ異常に拡がってStop Lossで成行がトリガーされているか、単に適当にクローズをしているという事が考えられます。が、さすがに金融商品を扱っているシステムでそんなことは無いと信じたいところです。

また、(最もあり得る)bot側のバグであれば、変なパラメーターで発注をしているか、クローズ時点で新たな発注をしているか、オーダー時のローカルの状態がおかしくなっていると思われます。更には表示がおかしいだけ……ということもあるので気は抜けません。

問題点はいくつかありますが、以下の2つをまず調べてみることにします。

  • 仮説2-1: 数秒でクローズしているのは、botが異常なオーダーを出しているためである
  • 仮説2-2: 数秒でクローズしているのは、タイムラグによって乖離した価格で約定していることが原因である

Motivating Example

原因を追求すべく、発注時点のログを漁ってみました。運良く最後の発注がおかしくなっていたので、これにフォーカスします。

2018-12-02 01:39:27, 0:00:02s, prof: 3.42, start: BUY, diff: 171.0, amount: 0.02,0.02, open:482126.0-close:482297.0

このオーダーのパラメーターは下記になっていました。この後こちらから新たな発注をしたログは確認できませんでした。

{"minute_to_expire":10000,"order_method":"IFDOCO","parameters":[{"condition_type":"MARKET","product_code":"FX_BTC_JPY","side":"BUY","size":"0.02"},{"condition_type":"LIMIT","price":477918.0,"product_code":"FX_BTC_JPY","side":"SELL","size":"0.02"},{"condition_type":"STOP","product_code":"FX_BTC_JPY","side":"SELL","size":"0.02","trigger_price":476234.0}],"time_in_force":"GTC"}

これを見ると、___TP: 477918.0、SL: 476234.0でオーダーしています。さて、実際の約定価格を見ると……。

open:482126.0, close:482297.0

全然ちゃうやんけ!発注時にはローカルの価格データを使っているので、これには以下のような原因が考えられます。

  • ローカルで持っている価格データが違う
    • 違う価格がやってきている
    • 価格データに大きなラグがある
  • ローカルで持っている価格データは合っている
    • 発注までの時間差で価格が大きく動いている
    • 成行注文が凄く滑ってる
      • 板がとんでもなくスカスカ
      • 発注時だけスプレッドが異常に拡がっている
    • 取引所が異次元価格で約定させている

起こりそうも無い原因もありますが、一応調べてみます。ログに情報を追加し、またしばらく動かしてみました。

調査ログ

ログを追加して動かし、おかしそうな2018-12-02 14:32:20のオーダーに対してログを観察してみます。これは4秒でクローズされているように見えます。

2018-12-02 14:32:20, 0:00:04s, prof: 5.8, start: BUY, diff: 580.0, amount: 0.01,0.01, open:466470.0-close:467050.0

直前の価格はこちら。2018-12-02 14:32:20.393550181Z

before order price: {"bid":466056.0,"ask":466150.0}
bid: 2018-12-02T14:32:19.071246200Z
ask: 2018-12-02T14:32:19.118118700Z

新規オーダー(2018-12-02 14:32:20.405687224 UTC)のパラメーターはこちら。

{"minute_to_expire":10000,"order_method":"IFDOCO","parameters":[{"condition_type":"MARKET","product_code":"FX_BTC_JPY","side":"BUY","size":"0.01"},{"condition_type":"LIMIT","price":467050.0,"product_code":"FX_BTC_JPY","side":"SELL","size":"0.01"},{"condition_type":"STOP","product_code":"FX_BTC_JPY","side":"SELL","size":"0.01","trigger_price":465456.0}],"time_in_force":"GTC"}

オープンのオーダー注文詳細

{
    "id": 735990320,
    "child_order_id": "JFX20181202-143224-489678F",
    "product_code": "FX_BTC_JPY",
    "side": "BUY",
    "child_order_type": "MARKET",
    "price": 0,
    "average_price": 466470,
    "size": 0.01,
    "child_order_state": "COMPLETED",
    "expire_date": "2018-12-09T13:12:20",
    "child_order_date": "2018-12-02T14:32:20",
    "child_order_acceptance_id": "JRF20181202-143220-015334",
    "outstanding_size": 0,
    "cancel_size": 0,
    "executed_size": 0.01,
    "total_commission": 0
}

オープンのオーダー詳細

{
    "id": 615318665,
    "side": "BUY",
    "price": 466470,
    "size": 0.01,
    "exec_date": "2018-12-02T14:32:24.32",
    "child_order_id": "JFX20181202-143224-489678F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181202-143220-015334"
}

クローズのオーダー注文詳細

{
    "id": 735991752,
    "child_order_id": "JFX20181202-143229-498110F",
    "product_code": "FX_BTC_JPY",
    "side": "SELL",
    "child_order_type": "LIMIT",
    "price": 467050,
    "average_price": 467050,
    "size": 0.01,
    "child_order_state": "COMPLETED",
    "expire_date": "2018-12-09T13:12:20",
    "child_order_date": "2018-12-02T14:32:24",
    "child_order_acceptance_id": "JRF20181202-143220-015343",
    "outstanding_size": 0,
    "cancel_size": 0,
    "executed_size": 0.01,
    "total_commission": 0
}

クローズのオーダー詳細

{
    "id": 615320061,
    "side": "SELL",
    "price": 467050,
    "size": 0.01,
    "exec_date": "2018-12-02T14:32:45.743",
    "child_order_id": "JFX20181202-143229-498110F",
    "commission": 0,
    "child_order_acceptance_id": "JRF20181202-143220-015343"
}

原因の考察

Websocketで取得していますが、1,200msほど遅れた価格データになっています。直近で取引が無かっただけかも知れませんが、遅延していると考えた方が良さそうです。ここは追加で検証します。

価格データのbid/askは466,056/466,150となっており、466,470で約定しています。300ほど滑っていたようですが、遅延があると考えると妥当に見えます。

注文を出してから受け付けられるまでは600ms以下、注文してから約定するまでなんと4秒、TPに引っかかってクローズするまでは21秒掛かっていました。

……4秒じゃない!

結論2-1

仮説2-1: 数秒でクローズしているのは、botが異常なオーダーを出しているためである

Pythonのツールで時間の差を出していたのは、child_order_date同士でした。If-Done-OCO注文でStop LossやTake Profitに引っかかった場合、クローズオーダーのchild_order_dateは親注文が約定した時間になるので、今回は4秒でクローズしたように見えていたというだけでした!

オーダー詳細まで見るようにツールを修正し(/v1/me/getexecutionsから取るようにした)、正常なログが得られるようになりましたとさ。めでたしめでたし。

結論2-1: ツールがおかしく、数秒でクローズされているように見えるものがあった。

結論2-2

仮説2-2: 数秒でクローズしているのは、タイムラグによって乖離した価格で約定していることが原因である

さて、2-1で解決された取引もありますが、Motivating Exampleに出したものは2-1に当てはまりません。 ここで考えられるのは、発注からタイムラグがあると約定価格が乖離し、すぐTP/SLに引っかかってしまう、という現象です。

これに関して、調査過程で気になる情報がいくつか出てきました。

  • WSからの情報が大きく遅延している?
  • 成行注文を出してから約定するまでが異常に遅い(今回は4秒も掛かっている)
    • 噂ではAPI経由での注文だけ遅れるという謎仕様があるとかなんとか

タイムラグの線が濃厚ですが、実際どうだったかはミリ秒単位の詳細な価格データが必要です。1分足データは簡単に手に入りますが、そうでないものは約定履歴から取らないといけません。用意するのに時間がかかるので、次回の記事に回します……。

次回の記事では、2-2の検証、ここの遅延が存在すること、損失に寄与しているという仮説を検証してゆきます。

結論2-2: 数秒のタイムラグはある。が、これが原因か判断するのは詳細な価格データが必要。次回までに用意して検証する。

今回のまとめ

どのようなプロダクトでもそうですが、リリース直後はバグ潰しに追われて本質的な改善の施策が取れないことがしばしばあります。今回はまさにそれですね。

次回は周辺の調査をしてデータを集めつつ、損失が減るような改善ができたら良いと思います。