THEOやめます

 THEOの情報が朝イチの段階で2営業日遅れなのが我慢できなくなりました。

WealthNaviも他の自分で買ってる投信も前日の状態にはなってるというのに、毎日イライライライラ……。

ということで、THEOをやめることにしました。

とりあえず完全にやめるのではなく、情報を拾えるよう10万を残し290万を引き上げることにしました。ちなみにこの出金金額も10万単位でしかできません。WealthNaviは円単位で出来るってのにまったく……。

と、こんなメールが来ました。

f:id:zhihong:20170916233517p:plain

最短で7営業日……。このスピード感ですよ。全ての不満の原因は。

人の金を7営業日も何に使ってるんですか?

その間にこちらは運用機会を失ってるんですけど。
これを見てもう残りの10万円も残さずに全て引き上げることにしました。

しかし……、

f:id:zhihong:20170916234921p:plain

出金中は解約作業(追加出金)に進めないではないですか!

本当になんなんですかね?

 

しばらくイライラが続きそうです……。

広告を非表示にする

WealthNaviとTHEOの比較(一ヶ月目)

WealthNaviとTHEOを始めて一ヶ月が経ちました。

 

まずは市場の状況ですが、円安株高傾向にあります。

 為替:ドル円110円台

 日経平均:19,807.44 円

 NYダウ:22,203.48ドル

 

WealthNavi

円換算で+70,592円の利益が出ています。

ドル建てでも円建てでもかなり良い結果になっています。

f:id:zhihong:20170916230528p:plain

資産内訳ではAGG以外はプラスです。

AGGのマイナスも大したことありません。

f:id:zhihong:20170916230552p:plain

THEO

円換算で+3,965円。WealthNaviと比べるとパフォーマンスはでていませんが、為替の影響をモロに受けている印象です。ていうか、ほぼ為替ですねこれは。

そして相変わらず2営業日前の内容です。

f:id:zhihong:20170916230624p:plain

グロースは米国株が戻っています。

f:id:zhihong:20170916230647p:plain

インカムはほぼ全滅です。

f:id:zhihong:20170916230756p:plain

インフレヘッジは金が高いですね。

北朝鮮のミサイルが影響していると思います。

f:id:zhihong:20170916230815p:plain

総評

WealthNaviがいい感じです。銘柄数が少ないのはわかりやすいし、これで利益が出ているなら、分散投資としては必要十分だと思います。

THEOは今のところいいところがありません。銘柄数が多すぎるのはわかりにくいし、とにかくスピード感が無さすぎます。月曜朝に木曜の終値ベースの情報が表示されているなどありえません。それでもパフォーマンスが出ているなら我慢できますが、WealthNaviの方が成績がいいですからね。もちろんTHEOの方が良い結果となる局面はあるとは思いますが。

そして、ドル建てETFはやはり為替の影響大です。

円安のときに一度資産を非難して、円高になったらまた買いなおすとよいのかもしれません。できればそこまで自動でやってほしいのですが、現状ではそこまではやってくれないようです。でも、そこまでやりたいなら、自分でETFを買った方がよいでしょうね。

 

 

ラズパイのC#でbitFlyerの板を取得(Json.NETでデシリアライズ)~ビットコイン自動売買の準備~

「ラズパイのC#でbitFlyerの板を取得」の続きです。
今回はJson.NETを使ってbitFlyerの板データをC#のオブジェクトに変換してみます。
標準ライブラリでもJSON形式のデータを扱えますが、どうやら性能的にはJson.NETが優れているようなので、これを使うことにします。

Json.NETはこちらからダウンロードします。
www.newtonsoft.com


とりあえずDownloadボタンをクリックするとこちらのポップアップが開きます。
ダイレクトダウンロードを選択します。
f:id:zhihong:20170910222124p:plain
解凍して得られる"Bin/net45/Newtonsoft.Json.dll"が必要なdllです。
適当なディレクトリに置いておきます。


板のユーザモデルはこんな感じです。
仲値,買い気配配列,売り気配配列がメンバ変数になっています。
気配は価格とサイズをメンバ変数に持ったクラスです。

[JsonObject]
public class Board
{
    [JsonProperty("mid_price")]
    public string MidPrice { get; set; }

    [JsonProperty("bids")]
    public Quote[] Bids { get; set; }

    [JsonProperty("asks")]
    public Quote[] Asks { get; set; }

    [JsonObject]
    public class Quote
    {
        [JsonProperty("price")]
        public string Price { get; set; }

        [JsonProperty("size")]
        public string Size { get; set; }
    }
}


シリアライズ部分です。
responseがJSON形式の文字列です。

Board board = JsonConvert.DeserializeObject<Board>(response);


ソースコード全体はこんな感じになります。
最良気配から5本だけ表示するようにしてみます。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;

[JsonObject]
public class Board
{
    [JsonProperty("mid_price")]
    public string MidPrice { get; set; }

    [JsonProperty("bids")]
    public Quote[] Bids { get; set; }

    [JsonProperty("asks")]
    public Quote[] Asks { get; set; }

    [JsonObject]
    public class Quote
    {
        [JsonProperty("price")]
        public string Price { get; set; }

        [JsonProperty("size")]
        public string Size { get; set; }
    }
}

class Sample
{
    static readonly Uri endpointUri = new Uri("https://api.bitflyer.jp");

    public static async Task GetBoard()
    {
        var method = "GET";
        var path = "/v1/getboard";
        var query = "";

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
        {
            client.BaseAddress = endpointUri;
            var message = await client.SendAsync(request);
            var response = await message.Content.ReadAsStringAsync();

            Board board = JsonConvert.DeserializeObject<Board>(response);

            Console.WriteLine("mid_price: {0}", board.MidPrice);
            Console.WriteLine("asks");
            for(int i=0; i < board.Asks.Length; ++i)
            {
                Board.Quote quote = board.Asks[i];
                Console.WriteLine("    price: {0}, size: {1}", quote.Price, quote.Size);
                if (5 == i) break;
            }
            Console.WriteLine("bids");
            for(int i=0; i < board.Asks.Length; ++i)
            {
                Board.Quote quote = board.Bids[i];
                Console.WriteLine("    price: {0}, size: {1}", quote.Price, quote.Size);
                if (5 == i) break;
            }
        }
    }

    static void Main(string[] args)
    {
        GetBoard().Wait();
    }
}


コンパイル
リソースにNewtonsoft.Json.dllを追加指定します。

$ mcs getboard_json.cs -r:/usr/lib/mono/4.6.2-api/System.Net.Http.dll,/usr/lib/mono/4.6.2-api/Facades/System.Threading.Tasks.dll,./Newtonsoft.Json.dll


実行

$ ./getboard_json.exe
mid_price: 443180.0
asks
    price: 443299.0, size: 0.14522859
    price: 443399.0, size: 0.41834898
    price: 443400.0, size: 0.5607
    price: 443445.0, size: 0.00319999
    price: 443460.0, size: 0.083
    price: 443505.0, size: 0.8059
bids
    price: 443061.0, size: 0.1562
    price: 443002.0, size: 12.0
    price: 443001.0, size: 0.33477141
    price: 443000.0, size: 0.50839729
    price: 442603.0, size: 1.96
    price: 442510.0, size: 27.4
$

よさそうですね。

ラズパイのC#でbitFlyerの板を取得~ビットコイン自動売買の準備~

前回はラズパイで最新のC#(Mono)を実行できるよ整え、bitFlyerからmaket一覧を取得しました。 
zhihong.hatenablog.com

今回は板を取得してみたいと思います。

前回のコードを少し修正するだけです。


エディタを開いて

$ vi getboard.cs


こんな感じに書きます。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Sample
{
    static readonly Uri endpointUri = new Uri("https://api.bitflyer.jp");

    public static async Task GetBoard()
    {
        var method = "GET";
        var path = "/v1/getboard";
        var query = "";

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
        {
            client.BaseAddress = endpointUri;
            var message = await client.SendAsync(request);
            var response = await message.Content.ReadAsStringAsync();

            Console.WriteLine(response);
        }
    }

    static void Main(string[] args)
    {
        GetBoard().Wait();
    }
}


コンパイルします。

$ mcs getboard.cs -r:/usr/lib/mono/4.6.1-api/System.Net.Http.dll,/usr/lib/mono/4.6.1-api/Facades/System.Threading.Tasks.dll


実行です。

$ ./getmakets.exe


API PlaygroundでSubmitした時とは異なり、実際はダーッと出ますね。
BIDの先頭
f:id:zhihong:20170906232752p:plain

ASKの先頭
f:id:zhihong:20170906232833p:plain

末端
f:id:zhihong:20170906232904p:plain

正直ここまでは要らないですね。
最良気配から10本くらいで十分です。

ラズパイでC#からbitFlyerのAPIを呼び出す~ビットコイン自動売買の準備~

ラズパイでビットコインの自動トレードができたら楽しそうなので、ちょっと試してみました。

記事の概要:ラズパイ3に最新のC#(Mono)をインストールしてbitFlyerのAPIサンプルを実行
ビットコイン取引所:bitFlyer
OS:Raspbian GNU/Linux 8.0 (jessie)
言語:C#

取引所は僕が今口座を持っているbitFlyerです。
最近はほとんどの取引所がAPIを公開していますね。
プログラマには楽しい時代になりました。

※自分の備忘録を兼ねて実施した順番通りに書いていますが、1~4は失敗手順です。時間の無い方は5以降を参考にしてください。

1.Monoのインストール

まずは一般的な手順通りに最新のMonoをインストールします。

$ sudo apt-get update
$ sudo apt-get install mono-complete

2.バージョン確認

3.2.8になりました。

$ mono -V
Mono JIT compiler version 3.2.8 (Debian 3.2.8+dfsg-10)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: normal
Notifications: epoll
Architecture: armel,vfp+hard
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen

3.HelloWorld

とりあえずHelloWorld.csを書いて実行してみます。

$ cat HelloWorld.cs
using System;
public class HelloWorld
{
    public static void Main()
    {
        Console.WriteLine("Hello World!");
    }
}
$ gmcs HelloWorld.cs
$ mono HelloWorld.exe
Hello World!

とりあえず動きました。

4.APIのサンプルを実行

ビットコイン取引所【bitFlyer Lightning】
から、一番上にあるgetmarketsのサンプルを実行してみます。

オリジナルのサンプルコード

こちらはサンプルそのままです。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Sample
{
    static readonly Uri endpointUri = new Uri("https://api.bitflyer.jp");

    public static async Task Main()
    {
        var method = "GET";
        var path = "/v1/getmarkets";
        var query = "";

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
        {
            client.BaseAddress = endpointUri;
            var message = await client.SendAsync(request);
            var response = await message.Content.ReadAsStringAsync();

            Console.WriteLine(response);
        }
    }
}

修正したサンプルコード

"public static async Task Main()"の"Main"を"GetMarkets"に変更し、
"static void Main(string[] args)"から呼び出すように変更しています。

using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Sample
{
    static readonly Uri endpointUri = new Uri("https://api.bitflyer.jp");

    public static async Task GetMarkets()
    {
        var method = "GET";
        var path = "/v1/getmarkets";
        var query = "";

        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage(new HttpMethod(method), path + query))
        {
            client.BaseAddress = endpointUri;
            var message = await client.SendAsync(request);
            var response = await message.Content.ReadAsStringAsync();

            Console.WriteLine(response);
        }
    }

    static void Main(string[] args)
    {
        GetMarkets().Wait();
    }
}

これをgetmarkets.csに保存してコンパイルしてみると……。

$ gmcs getmakets.cs -r:/usr/lib/mono/4.5/System.Net.Http.dll,/usr/lib/mono/4.5/Facades/System.Threading.Tasks.dll
getmakets.cs(10,25): error CS0731: The type forwarder for type `System.Threading.Tasks.Task' in assembly `mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' has circular dependency
getmakets.cs(10,30): error CS1983: The return type of an async method must be void, Task, or Task<T>
getmakets.cs(10,30): warning CS0028: `Sample.Main()' has the wrong signature to be an entry point
Compilation failed: 2 error(s), 1 warnings
pi@raspberrypi:~/bf $

ということで、全然動かないですね。
サンプルで使っているSystem.Threading.Tasksのasync/awaitはC#5.0系から使えるとのことで、先ほど最新化したMonoではバージョンが低いんですね。

5.Monoを公式よりアップデート

ということで、Mono Project公式からラズパイ用の最新版Monoを取得することにします。

まずは公式ページを参照してください。
http://www.mono-project.com/download/#download-lin-raspbian
5.2.0の安定板をダウンロードできますね。(2017/09/02現在)

ダウンロードページにあるこちらのコマンドを順番に実行します。

$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb http://download.mono-project.com/repo/debian raspbianjessie main" | sudo tee /etc/apt/sources.list.d/mono-official.list
$ sudo apt-get update

6.インストールされるバージョンの確認

こんどはインストール前にちゃんと確認します。

$ apt-cache policy mono-complete
mono-complete:
インストールされているバージョン: 3.2.8+dfsg-10
候補: 5.2.0.215-0xamarin10+raspbian8b1
バージョンテーブル:
5.2.0.215-0xamarin10+raspbian8b1 0
500 http://download.mono-project.com/repo/debian/ raspbianjessie/main armhf Packages
*** 3.2.8+dfsg-10 0
500 http://mirrordirector.raspbian.org/raspbian/ jessie/main armhf Packages
100 /var/lib/dpkg/status

5.2.0が入りそうですね。

7.Mono5.2のインストール

そして再びapt-getです。

$ sudo apt-get install mono-complete

僕の場合は先に3系をインストールしていたので、途中で警告が出てインストールが止まってしまいましたが、そのときにメッセージに出たコマンドを実行したところ、問題なくインストールできました。
3系を入れなかった人はすんなりインストールできると思います。

8.改めてバージョン確認

5.2.0が入りました!

$ mono -V
Mono JIT compiler version 5.2.0.215 (tarball Mon Aug 14 16:59:51 UTC 2017)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
TLS: __thread
SIGSEGV: normal
Notifications: epoll
Architecture: armel,vfp+hard
Disabled: none
Misc: softdebug
LLVM: supported, not enabled.
GC: sgen (concurrent by default)

9.コンパイル

コンパイラが変わっています。
gmcsでもdmcsでもなくmcsなんですね。
再度サンプルコードをコンパイルしてみます。

$ mcs getmakets.cs -r:/usr/lib/mono/4.6.1-api/System.Net.Http.dll,/usr/lib/mono/4.6.1-api/Facades/System.Threading.Tasks.dll

エラーが出なくなりました!

10.実行

いよいよ実行です!

$ ./getmakets.exe
[{"product_code":"BTC_JPY"},{"product_code":"FX_BTC_JPY"},{"product_code":"ETH_BTC"},{"product_code":"BCH_BTC"},{"product_code":"BTCJPY08SEP2017","alias":"BTCJPY_MAT1WK"},{"product_code":"BTCJPY15SEP2017","alias":"BTCJPY_MAT2WK"}]

取れました!
ただの市場マスタなのでちょっと面白くはないですが、とりあえずAPIを叩いて結果を取得できました!

これで遊ぶための準備が整ったので、これからいろいろ試してみようと思います。

WealthNaviとTHEOの比較(17日目)

WealthNaviとTHEOの運用を始めて17日が経ちました。

この間北朝鮮のミサイルが日本を跨いで太平洋に落ち、一時期ドル円が108円台をつけましたが、現在は戻るどころか行き過ぎて110円台をつけています。

日本を跨いだからといって日本が危ない→円安ってわけではないんですね。あくまでも挑発を受けてるのは米国だということのようです。

そしてビットコイン他暗号通貨も爆上げしています。有事の際の金から有事の際の暗号通貨になりつつあるのでしょうか?実は僕も少しだけ売買してみましたが、ポジションが無いときにいきなり上がったのでついていけず、悔しい思いをしています。

ということで、WealthNaviとTHEOの17日目の比較です。

WealthNavi

入金は1回だったのですが、買い付けは2回に分けて行っています。

下がって上がって順調に推移しています。

ドル建てでなかなかの好成績を上げています。

f:id:zhihong:20170902005302p:plain

全資産クラスがプラスです。 

新興国と金が上がってますね。

f:id:zhihong:20170902005331p:plain

 

THEO

こちらも下がって上がって、なんとかプラス浮上しています。

こちらはドル建ての方が成績が悪いという結果に。

f:id:zhihong:20170902005400p:plain

グロースは米国株がダメです。 

THEOの米国株の割合ってちょっと大きすぎやしませんかね?

せっかく多くの銘柄に分散していても、結局は米国株次第になってしまっています。

f:id:zhihong:20170902005432p:plain

株がダメな分 債券がまあまあ

f:id:zhihong:20170902005456p:plain

 インフレヘッジは有事の際の金ということでしょうか?

f:id:zhihong:20170902005520p:plain

感想

 相変わらずTHEOのレスポンスの悪さにはイライラしていますが、プラスに転じているのでまあもう少し様子見してみます。

これわかりますかね?上のグラフの画像で、WealthNaviは9/1(金)時点になっているのですが、THEOは8/31(木)時点の情報なんですよ。

出勤する際にWealthNaviは前日断面の情報に更新されているのですが、THEOは一昨日の情報のままなんです。9時以降に昨日断面に更新されているようですが、できれば同じ断面で比較したいですよね。

そしてこれを書いているのは土曜日の午後なのですが、未だに8/31(木)のままです。日本の営業日・営業時間ベースで更新されるので、次に更新されるのは9/4(月)の午前中です。

なんなんでしょう?誰か出社していないと更新できないのでしょうか?

運用会社にはもう少し頑張っていただきたいものです。

まだ見限りません。頑張ってください!

THEO初回買い付け

長かった……。

THEOに振り込んだのは8/14深夜です。本日8/18朝に買い付け結果が反映されました。

では、見てみましょう。

f:id:zhihong:20170818212742p:plain

f:id:zhihong:20170818212808p:plain

f:id:zhihong:20170818212848p:plain

買い付けて最初のレポートでいきなり全滅なんですけど……。

プラスは金と銀だけですね。

マイナスはいいんです。トランプと北朝鮮がアホなことやってるのだからこうなります。

問題はどうして買い付けたばかりなのに損益が出てるのかと。

WealthNaviは買い付けた日はプラマイ0スタートでした。

損益が出てるってことは、これは昨日の買い付けですよね?

丸1日報告しなかったってことですか?

THEOはこの辺りのスピード感が不満です。

 

それにしても銘柄数が多いですね。

ある程度まとめて入金しておくと、思い切り分散投資するんですね。

ちょっと分散しすぎな気もします。

正直銀とか韓国株は要らないですよ。

基本おまかせで、細かいカスタマイズができるようになるといいですね。

 

広告を非表示にする