선수로 산다, 때론 좋은 코치로

[REST API] 비트코인 시세분석으로 API 배우기 본문

개발 관련/개발 교육

[REST API] 비트코인 시세분석으로 API 배우기

godsman 2018. 2. 12. 07:00

[REST API] 비트코인 시세분석으로 API 배우기


개발자가 아닌 사람들에게 REST API가 유용하다는 것을 어떻게 알려줄까요?

REST API 덕분에 개발자는 장비와 서비스 연동이 쉬워졌습니다.

REST API 개념을 이해하면 API를 배울 때 도움이 될 겁니다. 개념을 배우는 건 재미없을 가능성이 많습니다. 자주 사용하지 않는 분야이면 관심을 갖기 어렵습니다.


최근 관심이 잦아들었지만, 여전히 관심을 가지고 있는 암호화폐 시세를 API를 이용해서 분석해 보려고 합니다.

1. 국내 암호화폐 시세 가져오기 - 빗썸 API/코인원 API

2. 글로벌 암호화폐 시세 가져오기 - 

3. elasticsearch 를 이용하여 분석하기

4. 머신러닝을 이용하여 예측하기, 또는 시세에 영향을 주는 요소 찾아내기


국내 암호화폐 시세 가져오기 - 빗썸 API

검색 - "빗썸 API"

API - 빗썸 - 대한민국 대표 암호화폐 거래소 - https://www.bithumb.com/u1/US127

https://api.bithumb.com/public/ticker/{currency} - bithumb 거래소 마지막 거래 정보

https://api.bithumb.com/public/orderbook/{currency} - bithumb 거래소 판/구매 등록 대기 또는 거래 중 내역 정보

https://api.bithumb.com/public/recent_transactions/{currency} - bithumb 거래소 거래 체결 완료 내역

* {currency} = BTC, ETH, DASH, LTC, ETC, XRP, BCH, XMR, ZEC, QTUM, BTG, EOS (기본값: BTC)

9개 언어의 Sample Code를 제공합니다.

Sample Code를 실행하면 '/public/ticker'에서 데이터를 가져와서 출력합니다.

Go 언어 샘플을 실행시키면 아래와 같이 출력됩니다.

C:\go\src\bithumb>bithumb.exe

Bithumb Public API URI('/public/ticker') Request...

{"status":"0000","data":{"opening_price":"10517000","closing_price":"9134000","min_price":"9037000","max_price":"10580000","average_price":"9679246.1719","units_traded":"14757.96305805","volume_1day":"14757.96305805","volume_7day":"116244.63609773","buy_price":"9126000","sell_price":"9128000","date":"1518336676103"}}

- Status Code: 0000

- Opening Price: 10517000.00000000

- Closing Price: 9134000.00000000

- Sell Price: 9128000.00000000

- Buy Price: 9126000.00000000

평소 사용하는 브라우저에서 테스트합니다. https://api.bithumb.com/public/ticker/{currency}를 입력하면 bithumb 거래소 마지막 거래 정보을 알 수 있습니다. {currency} 대신 BTC를 입력하면 비트코인 거래 정보를 가져옵니다.

https://api.bithumb.com/public/ticker/BTC

{"status":"0000","data":{"opening_price":"10430000","closing_price":"9137000","min_price":"9037000","max_price":"10430000","average_price":"9654658.0608","units_traded":"14509.84914804","volume_1day":"14509.84914804","volume_7day":"116260.81880146","buy_price":"9126000","sell_price":"9150000","date":"1518337733044"}}

Postman을 이용하면(또는 JSON 형식으로 보면) 좀더 이해하기 쉽게 볼 수 있습니다.

{

    "status": "0000",

    "data": {

        "opening_price": "10612000",

        "closing_price": "9148000",

        "min_price": "9037000",

        "max_price": "10649000",

        "average_price": "9712252.2422",

        "units_traded": "15086.59136455",

        "volume_1day": "15086.59136455",

        "volume_7day": "116233.31453638",

        "buy_price": "9141000",

        "sell_price": "9148000",

        "date": "1518335129315"

    }

}


글로벌 암호화폐 시세 가져오기(예정)

거래소 간의 가격비교와 국가간의 가격(김치프리미엄) 비교

글로벌 시세가 국내 시세에 미치는 영향 확인 

POLONIEX - https://poloniex.com/public?command=returnTicker


elasticsearch 를 이용하여 분석하기

coding이 주목적이 아니므로 개발없이 elasticsearch에 입력하려고 합니다. 국내정보와 해외정보를 상관분석하거나 코인간의 분석을 위해서는 약간의 coding이 필요합니다. 우선, 코딩없이 빗썸의 데이터를 elasticsearch에 입력합니다.

logstash에는 REST API의 응답받아 엘라스틱서치에 입력할 수 있는 방법이 있습니다. http_poller 라는 input plugin 입니다.

https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http_poller.html

logstash의 conf 파일을 작성하여 테스트합니다. (http_poller.conf)

input {

  http_poller {

    urls => {

      bithumb => "https://api.bithumb.com/public/ticker/BTC"

    }

    request_timeout => 60

    # Supports "cron", "every", "at" and "in" schedules by rufus scheduler

    schedule => { cron => "* * * * * UTC"}

    codec => "json"

    # A hash of request metadata info (timing, response headers, etc.) will be sent here

    metadata_target => "http_poller_metadata"

  }

}


output {

  stdout { codec => rubydebug }

}

로그스태시를 실행하면 결과를 볼 수 있습니다.

>bin\logstash -f http_poller.conf

{

                  "status" => "0000",

                "@version" => "1",

              "@timestamp" => 2018-02-11T09:11:00.259Z,

                    "data" => {

        "average_price" => "9608661.9750",

                 "date" => "1518340259432",

            "min_price" => "9037000",

        "opening_price" => "9858000",

            "max_price" => "10179000",

          "volume_1day" => "13335.19548918",

           "sell_price" => "9139000",

          "volume_7day" => "116267.44903765",

         "units_traded" => "13335.19548918",

        "closing_price" => "9134000",

            "buy_price" => "9135000"

    },

    "http_poller_metadata" => {

                 "request" => {

               "url" => "https://api.bithumb.com/public/ticker/BTC",

            "method" => "get"

        },

                    "name" => "bithumb",

         "runtime_seconds" => 0.068,

        "response_headers" => {

                                    "date" => "Sun, 11 Feb 2018 09:11:00 GMT",

                                  "cf-ray" => "3eb62da25e93a233-ICN",

                               "expect-ct" => "max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\"",

                       "transfer-encoding" => "chunked",

                                  "server" => "cloudflare",

                            "content-type" => "application/json",

            "access-control-allow-methods" => "*",

            "access-control-allow-headers" => "*",

                              "connection" => "keep-alive",

             "access-control-allow-origin" => "*"

        },

                    "host" => "DESKTOP-UHH968A",

        "response_message" => "OK",

                    "code" => 200,

           "times_retried" => 0

    }

}


elasticsearch를 실행합니다. logstash의 output를 변경해서 엘라스틱서치로 입력하도록 변경합니다. JSON 출력이므로 filter나 template를 사용하지 않고 입력해 봅니다.

output {

    stdout { codec => rubydebug }

    elasticsearch { # elasticsearch에 저장한다

        hosts => ["localhost:9200"] # elasticsearch의 호스트와 포트를 정의

        id => "coin-price"

        index => "coin-price-%{+YYYY}"

    }

}

인덱스에 매핑(logstash template)을 하지 않고 입력하면 price가 숫자가 아닌 "text"로 인식되어 숫자를 파악할 수 없습니다. 간단하게 template를 만들어 매핑합니다.

{
"template": "coin-price-*",
"mappings": {
"doc": {
"properties": {
"@timestamp": { "type": "date" },
"data.opening_price": { "type": "long" },
"data.closing_price": { "type": "long" },
"data.min_price": { "type": "long" },
"data.max_price": { "type": "long" },
"data.average_price": { "type": "long" },
"data.units_traded": { "type": "long" },
"data.volume_1day": { "type": "long" },
"data.volume_7day": { "type": "long" },
"data.buy_price": { "type": "long" },
"data.sell_price": { "type": "long" },
"data.date": { "type": "long" }
}
}
}
}


kibana에서 visualize를 만들어서, dashboard로 확인합니다. 오늘은 가격이 안정되어 있네요. 30분간이기는 하지만.


머신러닝을 이용하여 예측하기, 또는 시세에 영향을 주는 요소 찾아내기(예정)

첫번째는 코인간의 가격을 기반으로 영향력을 분석하고, 두번째는 코인의 가격에 영향을 미치는 요소를 분석해 보겠습니다.

예측에서 벗어나면 이상징후로 알려줄 수 있도록. 

elasticsearch의 prelert 이용하기


참고에 도움이 될만한 자료를 찾아서 업데이트  

연동의 역사

library - 라이브러리

RPC - Remote Procedure Call

CORBA

RMI - Java RPC

SOAP - XML + HTTP

REST API란

REST - Representational State Transfer

REST API 테스트

browser에 직접 입력

curl - https://www.lesstif.com/pages/viewpage.action?pageId=14745703

Postman - http://meetup.toast.com/posts/107

logstash의 http_poller - https://www.elastic.co/guide/en/logstash/current/plugins-inputs-http_poller.html


'개발 관련 > 개발 교육' 카테고리의 다른 글

[에디터추천] Visual Studio Code  (0) 2018.02.21
개발교육 - 2차  (0) 2017.07.25
Comments