読者です 読者をやめる 読者になる 読者になる

soy-curd's blog

The blog is written about maebashi or sake or beer or program. [https://twitter.com/soycurd1]

『入門ビットコインプログラミング〜Pythonによるビットコインの売買〜』をpdf販売します

第二十四回文学フリマ東京で頒布した『入門ビットコインプログラミング〜Pythonによるビットコインの売買〜』を、pdf形式で販売します。内容としては、直近で本ブログに上げた内容 + ブレイクアウト手法によるプログラミング法についての内容を追加しました。Pythonで記述されているので、Pythonを始めたばかりの方の練習になるかもしれません。興味が有る方は、購入してみてください。

(現状、ビットコイン支払いのみ可能です。日本円にして¥250円くらいになるように、システム側で調整されています。)

f:id:soy-curd:20170514105320p:plain

f:id:soy-curd:20170514105541p:plain

ビットコインで支払う

↑ここから購入可能です。

簡単安心!ビットコイン取引所 coincheck

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

ビットコインの入手は、ここ(coincheck)やzaif、bitflyerが有名です。

実践Pythonビットコイン売買プログラミング その2

第4章 ビットコインの売買をプログラムしてみよう

セットアップ

長い前準備でしたが、それではPythonを用いたプログラミングを始めましょう。

まずは、Python3.5の実行環境を用意してください。筆者はMac OSXにて実行しました。

coincheckは、api越しにビットコインの売買ができるようにapiを公開しています(https://coincheck.com/ja/documents/exchange/api)。 取引所APIは、認証の不要なPublic APIと、認証に必要なPrivate APIが用意されています。 Private APIを利用するには、APIキーページ(https://coincheck.com/ja/api_settings)にて、アクセスキーとシークレットキーを作成する必要があります。これらの情報を用いると決済等の機能が外部から可能になってしまうので、絶対に外部に漏らしてはいけません。また、誤動作を防いだり、外部にキーが漏れた場合に影響範囲を狭くしたりするため、編集リンクからAPIパーミッションを設定することができます。ここでは、自分が使う最低限の機能のみを有効にしておくべきです。

まずは、実行環境にPython用のcoincheck apiラッパーをインストールしましょう。

pip install coincheck

そして、Pythonスクリプトファイルを作成し、以下のように記述してください。

from coincheck import market

m = market.Market()
result = m.ticker()
print(result)

これを実行すると、

{'ask': 179809, 'volume': '25692.25624239',
'timestamp': 1493995535, 'bid': 179711,
'last': 179711, 'high': 186762, 'low': 163384}

というような出力が得られたかと思います。これはティッカー、つまり取引時間中のビットコインの値段を表しています。この得られた値について、coincheckのドキュメントでは以下のように説明されています。

last 最後の取引の価格

bid 現在の買い注文の最高価格

ask 現在の売り注文の最安価格

high 24時間での最高取引価格

low 24時間での最安取引価格

volume 24時間での取引量

timestamp 現在の時刻

例えば、askに注目してみましょう。この値は、179809でした。この単位は円なので、「1BTCを179809円で売りたい人がいて、その値段は全ての売りたい人の中で最安値である」ということです。つまり私たちが、179809円以上の値段で買い注文を入れたら、(売り注文の数量を超えない分は)179809円で決済させることができるということです。

常に市場のティッカーは変動しているため、定期的にこれを監視することで、その動きを知ることができます。例えばデイトレードなどで直近の値動きが知りたい場合は、bid(買い)とadk(売り)を知りたくなるでしょう。しかし、週に1、2度売買をするのみだったら、highとlowのみを知れれば良いかもしれません。暴落と暴騰のみ知りたいなら、volumeが急増したタイミングだけアラートするというやりかたも考えられます。

以下では単純に、「売値がある一定の値段になったら買い注文を入れる」というプログラムを書いてみます。

売買

coincheckにおいて、取引を行うAPIはPrivate APIなので、アクセスキーとシークレットキーを使用する必要があります。以下のプログラムにおいて、access_keyとsecret_keyの箇所は実行前にあらかじめ編集しておいてください。

from coincheck import market, order
import time

m = market.Market()
o = order.Order(
    access_key="your access key",
    secret_key="your secret key"
)

rate = 177466  # 買いたい額 ----(1)

while True:
    ticker = m.ticker()
    ask = ticker["ask"]

    # 売値が基準値を下回ったら買い
    print("ask: {}, rate: {}".format(ask, rate))
    
    # 売値が基準値を上回っている場合はスリープして待つ
    if ask >= rate:  ----(2)
        time.sleep(60)  # 60秒スリープ
        continue  # ループの最初に戻る

    result = o.buy_btc_jpy(rate=rate, amount=0.005)  # ----(3)
    if "error" in result.keys():
        print("注文が失敗しました: " + result["error"])
    else:
        print(str(rate) + "yen買い注文しました")

    break  # 注文終了

このプログラムでは、(1)において指定した額を、whileループの中の(2)でチェックしています。売値が(1)を上回っている場合、その値段では買えないのでループの最初に戻ります。売値が(1)を下回っている場合、その値段で買える可能性があるので注文を出します(4)。このようにして、売値がある一定の値段になったら買い注文をプログラムを記述することができます。

なお、(3)において、買値を指定する指値注文をしているため、実際には注文が成立しない場合があります。それが嫌な場合は、rateを指定しない成り行き注文にしてください。その時点での最低額の値段で買うことができます。ただし、rateを指定しないため予想とは異なる値で売買が成立することもあるので、注意してください。

おわりに

上のプログラムは単に指値注文をした場合とほとんど同じ挙動を示しますが、注文タイミングを制御しているため、大量に購入することをあまり他の参加者に知られたくない場合に有効かもしれません。また、制御を工夫すれば、チャートに応じて逆指値レートを上げ下げしたり、注文量を変更したりすることもできるでしょう。効率よくビットコインを売買するプログラムを作成すれば、自分の資産を増やすことも夢ではありません(もちろん、値動きによっては減ってしまうかもしれませんが)。

この記事が読者のビットコイン生活の糧となりましたら幸いです。

簡単安心!ビットコイン取引所 coincheck

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

実践Pythonビットコイン売買プログラミング その1

(以下、文学フリマで売る予定の実践Pythonビットコイン売買プログラミング(仮題)の原稿です。本記事はビットコイン初心者向けの記事になっており、記事を鵜呑みにするとビットコイン相場が崩壊した場合にfxで有り金全部溶かした顔の人状態になる可能性があります。実践する際は十分にお気をつけください。有り金全部溶かしても筆者は責任を取りかねます。)

目次

第1章 ビットコインとは

ビットコインは、Nakamoto Satoshiという人物によって考案されたとされる、暗号通貨のひとつです。 ビットコインには大きく次の3つの特徴があります。

  1. 物理的な貨幣の不在
  2. 匿名性
  3. 分散決済システム

まず、ビットコインには基本的に物理的な貨幣が存在しません。これが、仮想通貨と言われる所以です。 全ては単なる情報として存在します。ビットコインは紙に印刷することもできますが(ペーパーウォレット)、 それも秘密鍵とアドレス情報を示す文字列でしかありません。 これはコピーして他の紙に印刷すればいくらでも複製することができます。そして複製しても、ビットコイン自体が増えることはありません。つまりビットコインは、物理的実体に全く依存していないということです。

次に匿名性です。ビットコインはウォレットと呼ばれるビットコインの保管場所のアドレスさえわかれば送信することができますが、ビットコインのシステム上、アドレスと個人情報は紐付いていません。

最後に、分散決済システムです。上でビットコインのシステムと行っているものは、ブロックチェーンという技術によって実現されています。なぜこのようなものが必要なのかというと、ビットコインには全ての取引を処理する唯一のサーバ、というようなものが存在しないからです。そのかわり、ネットワークに存在する全てのユーザーの取引の履歴が、システム上に積み上がっていきます。これをブロックチェーンと言います。この取引については、数多く存在する有償のボランティアが取引の真正性を検証しています。ボランティアへの支払いはビットコインで行われ、これはビットコインのシステムから提供されます。これによって、ビットコインを取引するユーザーは、ほとんど手数料がかからなくて済みます。

それでは次の章では、実際にビットコインを入手してみましょう。

第2章 暗号通貨をマイニングしてみよう

ビットコインを入手するためのひとつの方法として、マイニング(採掘)があります。前章で有償のボランティアが取引の検証をしている、と記述しましたが、まさにその作業のことをマイニングと呼びます。しかし、ビットコイン自体のマイニングはすでに大規模な業者が大量のリソースを使って行うものとなっており、個人でマイニングすることは非常に困難です。ですので、ここでは簡単にできるビットコインに類似した他の暗号通貨をマイニングしてみましょう。

もしAndroid端末をお持ちでしたら、minergateというアプリで暗号通貨をマイニングすることができます。アプリをインストールしたら、まずはサインアップをしてください。マイニングにはネットワークの帯域を使うので、wifiでの接続が必要です。その後、好きな通過を選んで、startボタンを押すだけで、マイニングがはじまります。(下の画像では、Moneroという通貨をマイニングしています。)

f:id:soy-curd:20170505154309j:plain

マイニングをしていると、端末が熱を持つことがわかります。これはMoneroが取引の真正性を検証するために、大量の計算を行っているからです。

なお、筆者の環境ではPCで一晩マイニングしたら約0.01XMR(Moneroの単位)マイニングできました。2017/05/05現在1XMR = 3009.7 JPYなので、30円程マイニングできたことになります。

第3章 ビットコインを売買してみよう

ビットコインをもっとたくさん入手するためには、日本円で買ってしまうのが手っ取り早いです。ビットコインは、ビットコイン取引所で購入することができます。日本語が使えるサイトとしては、bitfyer, zaif, coincheck等があります。今回は取引apiが公開されているcoincheckを例として使ってみます。

coincheckでのアカウント作成

まずは、coincheckでアカウントを作ってみましょう(https://coincheck.com/?c=h1tKmxCORSY ※このリンクはアフィリエイトリンクになっていますので、こちらから登録していただけると、作者にいくらかのビットコインが還元されます。) coincheckでは、ビットコインの売買までに、本人確認書類の提出が必要になります。その後、住所確認用にハガキが自宅に送られていきます。それを受け取ると、coincheckの全ての機能が使えるようになります。金銭を扱うサイトですので、アカウント作成時は、二段階認証を設定しましょう。

ビットコインの購入

まず、日本円入金ページ(https://coincheck.com/ja/deposits)にアクセスしてください。そこに、振込先の口座が記載されていますので、それどおりに任意の額を入金してください。数千円もあれば、十分です。振込後、しばらく経つとサイトに金額が反映されます。

次に、ビットコイン購入ページ(https://coincheck.com/ja/buys)にアクセスしてください。レートという項目に、現在のビットコインの相場が書いてあります。2017/05/05時点では、182,700BTC/JPYという値でした。これは、ビットコインを1つ買うのに、182000円かかるということを意味しています。coincheckでは、0.005BTCから購入可能なので、執筆時点では最低912円で購入できました。この画面での購入は成行購入と行って、細かい値段の調整はできませんが、すぐビットコインを購入することができます。

ビットコインの使用

ビットコインは、他のビットコインのアドレスに送ることができます。coincheckでは、コインを送るページ(https://coincheck.com/ja/send)からビットコインを送金することができます。例えば筆者のビットコインウォレットのアドレスは1Mb6Vm7LxCmC3gX4yzP3qrVfiqwaMYhKySですが、これを先程のページの宛先欄に入力し、金額を指定するだけで、すぐ送金ができてしまいます。

ビットコインはこのように個人間で送る以外にも、ビットコインで品物が購入できるサイト(Bitcoinmall等)を使って、買い物もすることができます。また、ビットコインの値段は変動しますので、ビットコインの値段が上昇してからビットコインを売り、その差額を得ることもできます。(値段が下がったら損しますが。)

昨今、Line PayやBase等の決済アプリが流行の兆しを見せていますが、ビットコインを持つことでもそれに準じることができてしまいます。

第4章 ビットコインの売買をプログラムしてみよう

(続きはこちら)

soy-curd.hatenablog.com

簡単安心!ビットコイン取引所 coincheck

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

pythonのビットコイン取引ライブラリをasync/awaitで使えるようにした

coincheckというビットコイン取引所が存在していて、そこで公開されているアフィリエイトリンクを他人に踏ませることでビットコインを入手することができる。なので、coincheckが公開しているapiを使って記事を書き、ビットコインをアフィで稼ぐことにした。(coincheckに登録すると注文系のapiを使用することができるようになる)

何をしたか

最初はノンブロッキングが使いやすいnodeを選ぼうとしていたが、fxや株方面でのライブラリ、Pythonが充実しているっぽいので、Pythonを選んだ。

とりあえず先人がcoincheck apiPythonライブラリを公開していたので、それをasync/awaitを用いてノンブロッキングapiを叩けるように改造してみた。

github.com

環境

Python3.5

インストール手順

pip install aiohttp 
pip install git+https://github.com/soy-curd/aiocoincheck

サンプル

import asyncio
from coincheck import market

async def main():
    m1 = market.Market()
    result = await m1.ticker()  # await を使う場合はpython3.5以上必須
    print(result)

loop = asyncio.get_event_loop()
loop.run_until_complete(main())

{‘low’: 161305, ‘timestamp’: 1493830153, ‘volume’: ‘13704.78199805’, ‘bid’: 165964, ‘high’: 170000, ‘last’: 166024, ‘ask’: 166077}

例えばticker関数を用いると、最新のcoincheck取引所でのbid(買い)・ask(売り)等の情報を得ることができる。

補足

まだ試していないけれど、並列実行できるようになったので、売買戦略を複数並行で動かすときに、GILとかスレッドとか気にしなくてもよくなっているはず。async/awaitとaiohttpの組合せはまだ触り始めたばかりなので、今後ハマリどころがあったら追記する気がする。

他、使用方法は本家の

GitHub - kmn/coincheck: Coincheck API Library for Python

と、coincheckのapiドキュメントを眺めてください。

以下アフィリンク

簡単安心!ビットコイン取引所 coincheck

日本で一番簡単にビットコインが買える取引所 coincheck bitcoin

next.jsとnuxt.jsとAngular Universalを触ってみた

server side rendering(ssr)を試したかったので、ssrを比較的簡易に実行できると思われるUniversal Javascriptに対応しているライブラリを簡単に比較してみた。

実行環境

  • MacBook Air (13-inch, Mid 2012)
  • node v7.9.0
  • Typescript 2.2.0

next.js

React用のUniversal Javascriptライブラリ。ここでは、https://github.com/zeit/next.js/tree/master/examples/hello-world を試す。

git clone https://github.com/zeit/next.js.git 
cd next.js/examples/hello-world/ 
npm install
./node_modules/next/dist/bin/next build
./node_modules/next/dist/bin/next start

ファイル

index.js

import Link from 'next/link'
export default () => (
  <div>Hello World. <Link href='/about'><a>About</a></Link></div>
)

about.js

export default () => (
  <div>About us</div>
)

転送量

251KB

f:id:soy-curd:20170422155454p:plain

nuxt.js

Vue用のUniversal Javascriptライブラリ。ここでは、 https://github.com/nuxt/nuxt.js/tree/master/examples/hello-world を試す。

git clone https://github.com/nuxt/nuxt.js 
cd nuxt.js/examples/hello-world 
npm install 
node_modules/nuxt/bin/nuxt build 
node_modules/nuxt/bin/nuxt start

ファイル

index.vue

<template>
  <div>
    <h1>Welcome!</h1>
    <nuxt-link to="/about">About page</nuxt-link>
  </div>
</template>

about.vue

<template>
  <div>
    <p>Hi from {{ name }}</p>
    <nuxt-link to="/">Home page</nuxt-link>
  </div>
</template>

<script>
export default {
  asyncData ({ req }) {
    return {
      name: req ? 'server' : 'client'
    }
  }
}
</script>

転送量

56.1KB

f:id:soy-curd:20170422155605p:plain

Angular Universal

Angular用のUniversal Javascriptライブラリ。まだ公式にangular-cliとAngular Universalが対応していないようなので、ここでは、 universal-cliを用いてサンプルアプリを作成する。

npm install -g universal-cli rxjs
ung new angular-universal 
cd angular-universal
ung build --prod
ung serve --prod

ファイル

(ungコマンドによる自動生成ファイル。下記以外も多数生成される)

app.component.html

<h1>
  {{title}}
</h1>

app.component.ts

import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  title = 'app works!';
}

転送量

215KB (jsはgzip済)

f:id:soy-curd:20170423011622p:plain

印象

nuxt.jsのファイルサイズの小ささが素晴らしい(ただし、謎に読み込んでいるindex付きのbundleが何をしているか不明なので後で調べたい)。いずれのライブラリも、ssrを意識しなくても普通にレンダリングまで可能なのが凄い。例えばnuxt.jsはexpressに依存しているけれど、hello worldのみだと一行もサーバサイド専用のコードが存在しない。(nuxt-linkというvue-routerに類似したタグが使われているが、これでサーバ側でのルーティングとクライアント側でのルーティングを一元管理しているようだ)。

時間があったらredux or vuex周りとの連携も試したい。

ubuntu16.04(xenial)にelixirをインストール

公式ドキュメントを参照すれば良い。 http://elixir-lang.org/install.html

Erlang & Elixirをインストール

wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb && sudo dpkg -i erlang-solutions_1.0_all.deb
sudo apt-get update
sudo apt-get install esl-erlang
sudo apt-get install elixir

hello world

iex
>> IO.puts("hello world")

hello worldできた。

Typescriptでサーバサイドとフロントをどっちも書いてる時にいらいらする点

今、サーバ→node & Typescript, フロント→Angular & Typescriptみたいな構成でコードを書いているのだけれど、 Typescriptのコンパイル結果をサーバ側をES6, フロントをES5で吐かせているせいでその差でいらつくことが多い。 主にfind。 サーバ側ではhoge.find(y => y.id === 1)みたいなかんじで一意な値を取ってきてるのだけれど、findはES5では使えないので、hoge.map(y => y.id).indexOf(1)みたいにしてインデックス取るか、hoge.filter(y => y.id === 1)[0]みたいに書いている。インデックスアクセス歯がゆい。値がほしいだけなのにその過程で-1とか配列長さチェックとかするのも辛い。幸せをください。 (多段コンパイルでTypescript → Babelが正解なのか...?)