Finance

업비트 맛보기 # 암호화폐 마켓메이킹

steloflute 2022. 3. 26. 23:47

[COIN X QUANT] 맛보기 # 암호화폐 마켓메이킹 : 네이버 블로그 (naver.com)

 

[COIN X QUANT] 맛보기 # 암호화폐 마켓메이킹

안녕하세요 WILLBE입니다. 블로그에서 오랜만에 인사드리네요 😁 취업이후 블로그에 많이 소홀했던...

blog.naver.com

 

안녕하세요 WILLBE입니다.

블로그에서 오랜만에 인사드리네요 😁

취업이후 블로그에 많이 소홀했던것같습니다.

이번에 블로그를 다시 시작하면서 카테고리를 개편했습니다.

"맛있는 퀀트"에서는 퀀트라는 분야안에서

최대한 다양한 내용을

누구나 알기 쉽게 설명하려고합니다.

"문과생의 생존코딩"에서는

그냥 저 코딩하고 이것저것 개발하는 내용들을 올릴겁니다.

아마 주요 내용은 리눅스나 웹개발 관련된 부분일 것 같네요 😅

앞으로 다시 재미난 글들로 찾아뵙겠습니다😚

이웃추가하시고 즐겨 방문해주세요!


미디어매체에서 외국인들이 프로그램을 사용한

HFT(High Frequency Trading)로 불법적인 거래를 했다는

내용이 종종 들리곤합니다.

하이 프리퀀시 트레이딩, 직역하면 고빈도 매매 정도가 되는데,

일반적으로

"단시간에 매우 많은 주문을 내는 것"

을 의미합니다.

이러한 HFT에는 다양한 전략들이 있습니다.

가장 쉽게 생각해 볼 수 있는것이

Arbitarge전략(차익거래)입니다.

차익거래의 가장 쉬운예가 코인시장에서의

김치프리미엄이나 코인거래소간의 가격에 갭이 발생하는 경우입니다.

김치프리미엄을 이용한 차익거래

다음으로 생각해 볼 만한 것이

Market-Making(시장조성) 전략입니다.

시장조성전략은 시장에 유동성, 즉 호가를 제공하고

호가를 제공하는데에 따르는 이득을 취하는 전략입니다.

주가는 단기적으로 랜덤워킹하는 속성을 가지고 있습니다.

이럴 때 매수호가와 매도호가에 동시에 주문을 제출하고,

동시에 체결이된다면 매수호가와 매도호가의 차이(Spread)를 수익으로 취하는 것입니다.

물론 단순히 매수호가와 매도하게 주문을 내는것으로는

수익을 낼 수 없습니다.

먼저 거래로인한 비용보다 Spread가 커야하고,

만약 가격이 Oscillate하지 않고 한쪽으로 움직인다면

매도주문은 체결되지않고 매수주문만 체결되며 손실이 누적될 수 있습니다.

즉 마켓메이킹 전략에서역시 중요한것은

시장에 대한 판단입니다.

현재 시장이 Oscillate할 것인지?

상승, 혹은 하락할 것인지에 따라

매수, 매도호가의 스프레드를 벌리거나 차이를 주거나

혹은 잠시 거래를 멈추는등의 전략을 적용할 수 있습니다.

또한 마켓메이킹에서 중요한것은

속도입니다.

만약 나의 알고리즘이 감지하지 못한사이

혹은 내가 주문을 내놓은 사이 갑자기 호가가 바뀐다면?

시장에 유동성을 제공하는 것이 아니라

오히려 유동성을 잡아먹으며 거래비용만을 지출하게됩니다.


마켓메이킹 전략으로 수익을 내기위해서는

빠른서버와 훌륭한 전략이 필요하지만

여러분도 간단히 API를 이용해 이를 맛보기 정도는 할 수있습니다.

(물론 수익은 나지 않습니다 😅)

먼저 준비물!

거래 가능한 업비트ID, 업비트API, 파이썬이 설치된 컴퓨터

업비트 API의 경우 아래 사이트에서 발급받을 수 있습니다

https://upbit.com/signin?pathname=%2Fmypage%2Fopen_api_management


import pyupbit
from multiprocessing import Process
import time

access_key = "업비트에서 발급받은 api access key"
secret_key = "업비트에서 발급받은 api secret key"

client = pyupbit.Upbit(access_key, secret_key)
먼저 필요한 라이브러리를 설치하고 api와 python을 연동합니다 :)



# Setting
bid_loc = 1                         
ask_loc = 1
which_coin = "[KRW+업비트코인티커]"
quantity= "주문 넣을 수량을 숫자로입력"
매수/매도호가를 몇번째 호가에 낼지 정합니다

1을 적으면 최우선 호가에 주문을 냅니다

# bid/ask 미체결 주문 현황
# 미체결주문 존재시 주문 id값, 미존재시 None 반환
def get_order_new(client, order_type):
    order = client.get_order(which_coin)
    if not order:
        return None

    tmp = [dict['side'] for dict in order]

    if order_type == 'ask':
        if 'ask' in tmp:
            return order[tmp.index('ask')]['uuid']
        else:
            return None
    if order_type == 'bid':
        if 'bid' in tmp:
            return order[tmp.index('bid')]['uuid']
        else:
            return None

def make_ask():
    # ask 주문
    global ask
    askorder = get_order_new(client = client,  order_type='ask')
    if askorder == None: # 접수중인 주문이 없으면
        pyupbit.get_orderbook(tickers = which_coin)
        ask = pyupbit.get_orderbook(tickers = which_coin)[0]['orderbook_units'][ask_loc-1]['ask_price']
        client.sell_limit_order(which_coin, ask, quantity)
        print('ask order executive', ask_loc)
    
    askorder = get_order_new(client = client,  order_type='ask')
    if askorder: # 접수중인 주문이 있으면
        bestask = pyupbit.get_orderbook(tickers = which_coin)[0]['orderbook_units'][ask_loc-1]['ask_price']
        if ask > bestask:
            askid = askorder
            client.cancel_order(askid)
            print('ask order cancle', ask_loc)


def make_bid():
    # bid 주문
    global bid
    bidorder = get_order_new(client = client,  order_type='bid')
    if bidorder == None: # 접수중인 주문이 없으면
        pyupbit.get_orderbook(tickers = which_coin)
        bid = pyupbit.get_orderbook(tickers = which_coin)[0]['orderbook_units'][bid_loc-1]['bid_price']
        client.buy_limit_order(which_coin, bid, quantity)
        print('bid order executive', bid_loc)

    bidorder = get_order_new(client = client,  order_type='bid')
    if bidorder: # 접수중인 주문이 있으면
        bestbid = pyupbit.get_orderbook(tickers = which_coin)[0]['orderbook_units'][bid_loc-1]['bid_price']
        if bid < bestbid:
            bidid = bidorder
            client.cancel_order(bidid)
            print('bid order cancle', bid_loc)


def loop_make_ask():
    while True:
        try:
            make_ask()
        except:
            time.sleep(0.001)
        time.sleep(0.01)

def loop_make_bid():
    while True:
        try:
            make_bid()
        except:
            time.sleep(0.001)
        time.sleep(0.001)
        
접수중인 주문이 있다면 호가가 변경되었는지 확인하고,

기존 주문을 취소 후 주문을 다시 접수합니다.



만약 접수중인 주문이없다면 지정한 호가에 주문을 접수합니다.



이를 무한히 반복하는 함수를 지정합니다.



if __name__ == '__main__':
    p1 = Process(target = loop_make_ask)
    p2 = Process(target = loop_make_bid)
    p1.start()
    p2.start()

이후 python의 multiprocess 라이브러리를 사용해

동시에 bid와 ask 알고리즘을 실행해주면 끝입니다.