仮想通貨で遊ぶ日記

リスクは低く! 志も低く。そんな仮想通貨の遊び方

DashCoinにそよ風でも吹いてきたのか?

 DashCoinの出来高が伸びているんです。開発は進まないけど前回公開したプログラムをたまに走らせていたら偶々気づいたってレベルですが。
 仮想通貨のランキング集計サイトで何ページめくっても見つからないDashCoinにもついに追い風が吹き始めたのでしょうか。

 下降トレンドを通り越したまとめ売りによる下げからレンジを抜けて、また上昇を始めたから、というだけの気がします。少しでも周りに影響されていたらDASH(DashCoinとは全くの別物)やMoneroなどが上がったのと連動していたろうし。

 よく分からん高値でのまとめ買いと、その逆のまとめ売りがほぼ毎日横行するDashCoin市場。何が値段を決めているのかさっぱりわかりません。
 それでもオーダーブックに埋もれるくらいの額しか賭けられない現状では、適当に安く買って高値で捌くことができるので楽しいですよ。

 今のところ損切りはほとんどしていないですし。

HitBTCでBTUの取り扱いが始まってた

 高値で売り払い損ねたよ。失敗した。
 ハードフォークって単にアルトコインがひとつ増えるだけじゃね、とか適当な認識でいたら全く違っていたようで、同量のBTUが生み出された状態になるんですね。知らんかったわ。
 おかげで、自分もBTUを図らずも持っていたのに、

 めっちゃ下がってるわ、ざまぁ! とか高みの見物気分でいるうちに底まで落ちていっちゃいましたよ。もったいない。

 その後にHitBTCの自分の口座にもBTUが入っていることを確認してがっかりです。

 0.01弱のBTUも取引開始時に処分できていれば結構な額になったのに。もっともCoreの方が値下がりを続けているので、相対的にまた上がることもあるかなぁとすっごい高値のところで売り注文を出して放っておくことにしました。

 と、元のBTC価格がさがり続ける一方でドル換算では口座の残高がぼちぼち増え続けています。DashCoinが上昇トレンドに入った恩恵で買いが入りやすくなっているからでしょう。こういうときは回転率が上がるので張り付いていると結構な儲けになるのですよ。

 割合的には。

 何度も言うけど取引量自体も自分の資金もたいしたことはありません。そんなわけで、せいぜい半日で1ドル儲けたとかそんな感じですが、それでも口座のBTCが10%近く増えているので大勝には違いない。
 元手がMingerGateで掘った30DSH(当時15円くらい)くらいと0.02XMR(当時25円くらい)、後は途中で突っ込んだbitFlayerに放置されていた0.004BTC(当時500円くらい)。それが0.01BTC(現在1000円ちょい)を超えているのだから適当に売買しているだけでドル換算で倍になっている勘定になります。

 普段から乱高下するので適当なところに張っていればそう失敗はしないってのもあります。

 でも一日中張り付いていることができたら、もうちょっと身のある価格になっていたような気がしてならない。毎日1ドル稼いだらちょっとした酒代になりますから。
 とか考えて始めた売買プログラムの開発は進んでいません。月末は忙しいのです。

DashCoinの最近の取引情報を集計してみる

 めんどくせーとボヤきつつ、ちょろちょろとコードを書いています。件のHitBTCですが、PHP用のライブラリしか用意してくれていないんだもんなぁ。
 
 とりあえずはデータの整形やらエラー処理をすっ飛ばしてはいるものの、マーケット情報を取得するクラスは一応書きました。これでようやくデータを貯めこんであれこれ集計したり機械学習に使ってみたりとできるようになったわけです。
 が、肝心の機械学習の方の学習がちっとも進んでいないので、今回はちょろっと日足のようなデータを出力する程度になってしまいます。

 APIを叩くクラスはURLを組み立ててjsonをもらってくるだけなので割愛。

最近の取引情報を1000件もらってきてデータベースに保存

# coding: utf-8

import sqlite3
from hitbtcapi.restreader import RestReader

dbcon = sqlite3.connect('recent.db')
cursol = dbcon.cursor()
cursol.execute('''
create table if not exists recent(
    tid integer primary key,
    price float,
    amount integer,
    time long,
    side varchar(4));
''')
dbcon.commit()

reader = RestReader()
recents = reader.recent()
try:
    for line in recents:
        tid = int(line['tid'])
        price = float(line['price'])
        amount = int(line['amount'])
        date = int(line['date'])
        side = line['side']

        cursol.execute('''
            insert into recent(tid, price, amount, time, side)
                values(?, ?, ?, ?, ?);
        ''', (tid, price, amount, date, side))
except Exception as e:
    print(e.args)
finally:
    dbcon.commit()
    dbcon.close()

一番新しいものから一日毎に(始値終値、高値、安値、出来高)を集計

# coding: utf-8
import sqlite3

try:
    dbcon = sqlite3.connect('recent.db')
    dbcon.row_factory = sqlite3.Row
    cursol = dbcon.cursor()

    cursol.execute('select * from recent order by time desc limit 1;')
    line = cursol.fetchone()
    linetime = line['time']

    while True:
        cursol.execute(
            'select * from recent where time between ? and ? order by time desc;',
            (linetime - 3600 * 24 * 1000 + 1, linetime))
        lines = cursol.fetchall()
        
        if not len(lines):
            break

        first = None
        last = None
        high = None
        low = None
        amount = 0
        for line in lines:
            price = round(line['price'] * 100000000, 1)
            if last is None:
                last = price
                high = price
                low = price
            if high < price: high = price
            if low > price: low = price
            first = price
            amount += line['amount']
                
        print('first:{0} last:{1} high:{2} low:{3} amount:{4}'
            .format(first, last, high, low, amount))
        
        linetime -= 3600 * 24 * 1000
            

except Exception as e:
    print(e.args)
finally:
    dbcon.close()

 一つ目のプログラムはHitBTCから直近のDashCoin取引についての情報を1000件もらってきてデータベースに保存しとります。
 元となるデータはこのURLで参照できますよ。

http://api.hitbtc.com/api/1/public/DSHBTC/trades/recent?max_result=1000&side=true

 もっともらってくればいいのに、と思うでしょうけどこれが最大件数だから仕方がない。もっと遡る場合は微妙に使いづらい別のパスを何度も叩く必要がありますが、今回はこれでいいでしょう。

 集計用のプログラムは、一番新しい取引情報を引っ張ってきてからその時刻から一日遡ったデータを集計しては次の一日、と繰り返しているだけです。
 走らせてみた結果がこちら。

:~/test$ python3 test_candle.py
first:778.9 last:702.1 high:787.9 low:659.0 amount:51088
first:660.7 last:779.0 high:787.9 low:641.0 amount:22193
first:675.0 last:660.0 high:788.0 low:560.0 amount:27501
first:600.0 last:788.0 high:799.2 low:570.0 amount:17761
first:557.3 last:562.5 high:784.2 low:557.0 amount:3471

 一番下の行の出来高が妙に少ないのは単にデータ不足なだけです。始値などの値はそのまま表示すると指数になって鬱陶しかったのでSatoshi表記にしてみました。
 今回のデータの中での最高値は7.992μBTCだそうで。

 やっすいなぁ、DashCoin

 そのおかげで数ドルあれば遊べるわけでもありますけどね。
 次はもうちょいデータを貯めて何か別のことをしてみる予定。少しくらいおもしろいことができるといいんですけどねー。

DashCoinには疾風怒濤の季節はやってこない?

 高値に釣り上げられてからの売り浴びせでDashCoinを高掴みさせられて、しばらく塩漬けかと萎びていたところビットコインが暴落している模様。なんでもくすぶっていた分裂騒動に大きな動きがあったみたいで、先行き不安からのポジション解消や他のコインへの持ち替えがされているのでしょう。

 相対的にDashCoinの値が上がりまくるのか、と思いきやメジャーなアルトコインが急騰しているにもかかわらず通常営業中。さすがDashCoin。投機目的で売買されているものとはワケが違うぜ。似た名前のDASHは爆上がりなのにな!

 

 開発の方は機械学習用のライブラリ、scikit-learnでできることを調べているので進捗ナシです。

 なんとか日本語のサイトだけで済ませたいのですが、どうなるんでしょうね。英語のドキュメントを読むのは大変なのですが避けられないような気がします。

 それでも情報収集をするのは、自前で苦労して書いたものがすでに実装されていたりするのを防止するためなのでやらざるをえない。ガクっと力が抜けますからね、実際にそういったことになってしまうと。

 

 しかし、機械学習ではチャートは読めても外的要因はどうしようもないんだよなぁ。そういう事態を避けるために仮想通貨取引をプログラムにやらせようとしていたのに。

 それに計算コストが高くなってくると予定が狂ってきちゃうんですよね。

 最初、そこそこ動くようになったら年額15$くらいの超激安VPSにでも突っ込んで走らせようとしていたのですよ。月額2$稼げばペイしちゃうぜー、とか低レベルな皮算用をしていたわけです。

 ところが大量の計算を要するようになると明らかにスペックが足りなくなってくる。下手をすればかなりの高スペックなものが必要になってくるかもしれないんですよね。

 

 先のことなんて心配していても仕方がないのかなぁ。実際にどんな取引プログラムができるか、もしくは完成するかもまだ分からんのに。

 余計なことは考えても仕方がないのでせこせこと開発を進めます。

機械学習でポンコツくん(仮称)がおりこうになる可能性

 使うプログラム言語を選定している際に、Python機械学習やら科学計算がが云々という説明をちらほらと見かけたのです。
 機械学習なんて言われてもチャットボットくらいしか思いつかないので、ちょっと調べてみたところデータマイニング分野の最前線に位置する技術のようで。

 もしかして過去のマーケット情報を食わせたら値動きの予想とかしてくれるのではないか、と思いつくのも自然なことです。ぐぐれば同じことをやってみた人は大勢いて自分の思いつきが後押しされているようで心強い。
 更には取り扱うのが株式やら為替ではなく、余計な外的要因が絡みづらい仮想通貨だというのもプラスに働くのではないか、という目論見もあります。
 それに、元々はごちゃごちゃと条件式を書いていく予定だったことを考えたら楽ができそうですしね。プログラムの書き方を思い出すところから始めなくてはいけない私にとっては大変助かるのです。

 問題があるとすれば、

 機械学習について私が何も知らない

 ことなんですよね。色々読んでみても触りの部分しか分からんでやんの。
 でも、まぁそれでも一応機械学習をさせてみることはできました。
 まだHitBTCからのデータ取得が手付かずなので、何か別の、簡単にデータが用意できて学習効果が分かりやすいサンプルについて考えた結果、

 足し算を教えてみた!

 何言ってんだこのバカ、と思うかもしれません。ですが単純にans = a + b;とか書いて結果が出るものでも、経験則から答えを導き出すってすごいことじゃないですか。
 小学校に入っておはじきなんかで覚えたことが一瞬でできちゃうわけですよ。
 そんなわけで実践。

 まずは足し算に使うランダムな数字とその答えをCSVで10件程度用意します。整数2ケタと小数点1ケタの足し算です。これを学習器に食わせ、同じケタでは芸がないので学習用データよりも大きな数の計算をさせるわけですが、どうなるのでしょうね。

0.0〜99.9までの数字二つとその和

9.0,73.3,82.3
19.6,86.5,106.1
0.2,48.1,48.3
5.0,94.6,99.6
92.2,55.1,147.3
30.2,38.7,68.9
39.5,80.6,120.1
72.3,82.3,154.6
78.1,99.8,177.9
58.6,99.2,157.8

 
学習データよりも桁の多い計算をさせてみる

# coding:utf-8

import pandas;
import random;
from sklearn.linear_model import LinearRegression as scimodel

# [[a, b, ans], ...]
data = pandas.read_csv('b.csv');

# 計算対象と答えを分離
samples = [];
targets = [];
for line in data.get_values():
    samples.append(line[:-1]);
    targets.append(line[-1]);

# 学習器を教育
ponkotsu = scimodel().fit(samples, targets);

# 計算させてみる
random.seed();
for i in range(0, 10):
    a = random.randrange(0, 100000) / 100;
    b = random.randrange(0, 100000) / 100;
    c = round(a + b, 2);
    predict = ponkotsu.predict([[a, b]]);
    print(str(a)+' + '+str(b)+' = '+str(predict[0])+'('+str(c)+')');

 さて、これを走らせるとどうなるか。カッコの中は普通に計算した正答になります。

:~/test$ python3 b.py
978.09 + 999.21 = 1977.3(1977.3)
183.6 + 516.79 = 700.39(700.39)
149.92 + 528.56 = 678.48(678.48)
380.26 + 270.02 = 650.28(650.28)
39.48 + 985.59 = 1025.07(1025.07)
295.65 + 8.53 = 304.18(304.18)
367.84 + 745.36 = 1113.2(1113.2)
196.29 + 184.56 = 380.85(380.85)
189.76 + 864.25 = 1054.01(1054.01)
170.29 + 821.14 = 991.43(991.43)

 なんてお利口さん! あの少ないデータから完璧に足し算をマスターしているよ。

 自分で書いたプログラムの方が合っているか分からないけどすごい!

 足し算をマスターさせたくらいでいい気になっていますが本来処理したいデータはもっと複雑です。それに私が機械学習について全く分からないのが致命的なんですよね。
 色々と調べていきながらどのように使えるか考えていく必要があります。