FinTechプログラミング入門

# はじめに
FinTech(Financial Technology)は、金融業界における技術革新を指します。FinTechには、様々な技術が組み合わされていますが、その中でも重要なのがプログラミング技術です。

FinTechにおいては、以下のようなプログラミング言語や技術が使われることが多いです。

1. Java：金融システムなどの大規模なシステム開発に使用されることが多い。
1. C#：Windowsシステムでの開発に使用されることが多い。
1. Python: 機械学習やデータ解析などのタスクに使用されることが多い。
1. JavaScript: フロントエンド開発に使用されることが多い。
1. Blockchain: 分散型のデータベース技術で、暗号通貨やスマートコントラクトなどに使用されることが多い。

また FinTechにおいては、APIの使用やデータ収集、分析などが重要な要素になります。プログラミング言語や技術を使って、これらの要素を実現することが重要になります。

![bitcoin-225080_640.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/22f61454-44dd-107c-3e93-4db3a0a82383.png)
IT技術の発達により、システムトレード（自動売買）や金融データの分析が容易に行えるようになっています。
Ruby言語を利用した、ビットコインのシステムトレードプログラムの作成方法と、株価データを取得・分析するプログラムの作成方法を紹介します。

ビットコインのシステムトレードプログラムの解説と仮想通貨取引所APIに対応する実践的なものを備忘録としてまとめます。また、仮想通貨の基盤技術であるブロックチェーンをやさしく解説する記事に頑張ってまとめます。

## 参考にした本
* [フィンテックエンジニア養成読本](https://amzn.to/2Lpkns2)
* [個人投資家のためのFinTechプログラミング](https://amzn.to/35t8mZJ)
* [60分でわかる！ FinTech フィンテック 最前線](https://amzn.to/38y9hd9)

## ブロックチェーンとは
ブロックチェーンは、ビットコインを支える技術として用いられています。
ビットコインとは、仮想通貨であり、世界中に知れ渡っている電子通貨です。

仮想通貨：インターネットを通じて不特定多数の間で物品やサービスの対価に使用でき、中央銀行などの公的な発行主体や管理者が存在せず専門の取引所を介して円やドル・ユーロ・人民元などの通貨と交換できます。

ビットコインは第三者の仲介業者を通さないで取引をしているため、手数料を安く抑えることができ、世界中の人にビットコインを送金することができます。また、ビットコインの発行数は２１００万ビットコインと上限が決められています。

## 参考サイト
* [ビットコイン（Bitcoin）とは？](https://bitflyer.com/ja-jp/bitcoindigitalcurrency)
* [ビットコイン（Bitcoin）用語集](https://bitflyer.com/ja-jp/glossary)
* bitFlyer Lightning API
  * [API Documentation](https://lightning.bitflyer.com/docs)

# 事前準備
**1. [bitFlyer](https://bitflyer.com/ja-jp/)のアカウントを作成**
![feature-ease-of-use-800w.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/5ddd58e6-d9a1-0ea8-cf4b-8c5da29d5f89.png)
**2. API キーを作成**
[bitFlyer Lightningの開発者ページ](https://lightning.bitflyer.com/developer) で API key と API secret を発行します。
API キーを作成する際には、キーごとにパーミッションを指定することができます。不要なパーミッションは外します。
![api-key-permissions.ja.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/229633/a4aade82-cf67-3be5-64e9-2c0c27ad3675.png)
※ API Secret を第三者に漏洩した場合は、第三者により資金の操作・取引等が行われ、損害が発生する危険があります。API Secret を平文のままプログラムに記入、テキスト、データベース等、または Git などのバージョン管理システムに絶対に保管しないでください。

# 実装
API Key と API Secret を使用して、「注文のイベントを受信」する権限を取得する必要があります。
各接続方法の auth メソッドにて認証要求が可能です。

API は、一律の制限を設けていませんが、以下に該当する場合は IP アドレスまたはアカウントごとに接続を制限することや、接続を禁止することがあります。

* API エラーを長時間大量に繰り返し発生させている場合
* 正常に接続確立しているにもかかわらず接続と切断を高頻度で繰り返している場合
* システムに負荷をかける動作や不正行為を繰り返していると当社が判断した場合

## 認証
ログイン後、開発者ページ において発行した API key と API secret を使用します。

以下の情報を HTTP リクエストヘッダに含めます。

* ACCESS-KEY: 開発者ページで発行した API key
* ACCESS-TIMESTAMP: リクエスト時の Unix Timestamp
* ACCESS-SIGN: 以下の方法でリクエストごとに生成した署名

ACCESS-SIGN は、ACCESS-TIMESTAMP, HTTP メソッド, リクエストのパス, リクエストボディ を文字列として連結したものを、 API secret で HMAC-SHA256 署名を行った結果です。

```
require "net/http"
require "uri"
require "openssl"

key = "{{ YOUR API KEY }}"
secret = "{{ YOUR API SECRET }}"

timestamp = Time.now.to_i.to_s
method = "POST"
uri = URI.parse("https://api.bitflyer.com")
uri.path = "/v1/me/sendchildorder"
body = ''

text = timestamp + method + uri.request_uri + body
sign = OpenSSL::HMAC.hexdigest(OpenSSL::Digest.new("sha256"), secret, text)

options = Net::HTTP::Post.new(uri.request_uri, initheader = {
  "ACCESS-KEY" => key,
  "ACCESS-TIMESTAMP" => timestamp,
  "ACCESS-SIGN" => sign,
  "Content-Type" => "application/json"
});
options.body = body

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
response = https.request(options)
puts response.body
```

# まとめ
認証完了またはエラーのレスポンスを必ず確認してから次の動作を実行してください。
認証する仕組みが作成出来たら、株価データを取得・分析するプログラムの作成して、注文イベントを行います。

今後、株価データを取得・分析するプログラムの作成についてもまとめます。