본문 바로가기
IT - 코딩/트레이딩 관련

트위터 api를 통한 긍부정 판단(NLP)모델을 추가한 추적 손절매 응용 방식

by 조기정 2023. 2. 23.

해당 모델은 과거에 일론머스크가 "DOGE"나 "Bitcoin(BTC)" 를 트위터에 언급하면  14% 가량 오르는 일이 있었다.

해당 방식을 바이낸스 자동 모델인 추적 손절매(내가 진입한 시점부터의 고점을 계속 갱신하여 고점 대비 n%가 하락하면 매도를 하는 방식)의 방법을 알게 되고 이것을 코드화 하였다. 

 

그때 당시  차트를 구하고 싶은데 좀 오래되서 구하기 힘들다.. 아마 그때가 2021년도 일것이다 해당 코드가 2021년 6월에 작성되어 있었었다.

(바이낸스 선물을 이용)

 

주요 코드는

while True:
    while True:

        account = "@elonmusk"
        statuses = twitter_api.GetUserTimeline(screen_name=account, count=10, include_rts=False, exclude_replies=True)

        #30초이내에 트위터를 올렸고 , 도지란 단어를 포함하면 if 문 실행
        if (len(statuses)!=0):
            ##상태 한번만 보여주는것.
            clear_output(wait=True)
            display(statuses)
            ##
    #         print(statuses[0].text)
            if(statuses[0].text.lower().find("doge") != -1) and ((int(time.mktime(datetime.now().timetuple())) - statuses[0].created_at_in_seconds) < 30):
                break
        time.sleep(1)
    ######심볼명 교집합#####
    # sim_name = list(set(bin_sym) & set(up_sym))  # @
    sim_name = "DOGE"

    #추적 손절매 %
    Per = 4

    ##구매 시점
    up_pre = pyupbit.get_current_price('KRW-' + sim_name)  # 업비트 현재가 조회#리플이든 비트코인이든
    print(up_asset, "업비트 자본(조정 후)")#업비트 유동자본

    up_can_order_amout = up_asset
    Decimal_rounding = UP_Minimum_Order_cash_Size(sim_name)
    up_can_order_amout = (up_can_order_amout // Decimal_rounding) * Decimal_rounding

    print(up_asset,up_can_order_amout)

    #구매주문
    ret = upbit.buy_market_order("KRW-" + sim_name, up_can_order_amout)  # 있는현금만큼 구매#갯수로 구매가능하면..
    pprint.pprint(ret)  # 구매주문확인

    point_buy_pre = up_pre #구매시점 가격@@이부분 바꾸기?

    max_pre = 0
    while True:
        up_pre = pyupbit.get_current_price('KRW-' + sim_name)  # 업비트 현재가 조회
        print(up_pre,"현재가")
        if (up_pre > max_pre):

            max_pre = up_pre
            print(max_pre,'max_pre',point_buy_pre,"구매가")

        print(((1-(up_pre/max_pre))*100),"고점대비 얼마(%) 손해중인지 확인")#@나중에 시간되면 음수로 고쳐두 됨
        if (((1-(up_pre/max_pre))*100)>Per):#손해보는 % 대비 고점
            print(((1-(up_pre/max_pre))*100),"팔시점 나옴")
            break
        time.sleep(1)



    #판매주문
    up_simbol_balance = upbit.get_balance("KRW-" + sim_name)
    res = upbit.sell_market_order("KRW-" + sim_name, up_simbol_balance)
    pprint.pprint(res)#판매주문확인
#무한루프임.

 

매우 오래전에 작성한 코드라서 좀 바꿀 것이 많다 

현재는 파이썬에서 twitter 패키지가 아니라 tweepy라는 패키지를 사용하는 모양이다.. 

그 때 당시에는 잘 적용 되었었어다. 

해당 모델은 일론머스크의 트위터를 1초마다 확인하여 글을 올린지 30초 이내일 경우에만 실행하고 중복매수를 방지하기 위해 시간을 확인하였다.

 

그리고  추적 손절매가 포지션을 나오는것이 중간에 고점대비 n%이상 아래로 흔들고 다시 올라가버려서 

한번 좀 일찍 익절이 나버렸었다. 

그래서 모델을 조금 바꾸었다 2번 n%이상 아래로 흔드는것을 보고 나서 포지션을 청산하게 바꾸었다.

 

etc) per 을 조정하면 n%의 n을 조정할  수 있다

 

그 떄 당시 내 기억으로 BTC나 DOGE언급만 하면 급등하였는데 (14%이상) 두번 정도 부정적인 말을 한적이 있다.

비트코인을 채굴하면서 쓰는 전력들이 커서 환경에 악영향을 준다나 뭐라나,.. 주가 조작하려고 한것 같지만..

이 떄는 이런식으로 사용하면 큰 리스크가 있을 수 있다.

 

그래서 여기에 자연어 처리 모델로 긍/부정을 판단하여 긍정문이면 진입하게 바꾸어 보았다.

해당 코드는 만든지 얼마 안되어 슈도 코드로 작성하는점.. 양해 바랍니다

 

while True:
    while True:

        account = "@elonmusk"
        statuses = twitter_api.GetUserTimeline(screen_name=account, count=10, include_rts=False, exclude_replies=True)

        #30초이내에 트위터를 올렸고 , 도지란 단어를 포함하면 if 문 실행
        if (len(statuses)!=0):
            ##상태 한번만 보여주는것.
            clear_output(wait=True)
            display(statuses)
            ##
    #         print(statuses[0].text)
            if(statuses[0].text.lower().find("doge") != -1) and ((int(time.mktime(datetime.now().timetuple())) - statuses[0].created_at_in_seconds) < 30):
                predictions = Sentiment_Analysis(statuses[0].text.lower(),tokenizer)
                if predictions == 1 :
                    break
                else:
                    time.sleep(30)

        time.sleep(1)
    ######심볼명 교집합#####
    # sim_name = list(set(bin_sym) & set(up_sym))  # @
    sim_name = "DOGE"

    #추적 손절매 %
    Per = 4

    ##구매 시점
    up_pre = pyupbit.get_current_price('KRW-' + sim_name)  # 업비트 현재가 조회#리플이든 비트코인이든
    print(up_asset, "업비트 자본(조정 후)")#업비트 유동자본

    up_can_order_amout = up_asset
    Decimal_rounding = UP_Minimum_Order_cash_Size(sim_name)
    up_can_order_amout = (up_can_order_amout // Decimal_rounding) * Decimal_rounding

    print(up_asset,up_can_order_amout)

    #구매주문
    ret = upbit.buy_market_order("KRW-" + sim_name, up_can_order_amout)  # 있는현금만큼 구매#갯수로 구매가능하면..
    pprint.pprint(ret)  # 구매주문확인

    point_buy_pre = up_pre #구매시점 가격@@이부분 바꾸기?

    max_pre = 0
    while True:
        up_pre = pyupbit.get_current_price('KRW-' + sim_name)  # 업비트 현재가 조회
        print(up_pre,"현재가")
        if (up_pre > max_pre):

            max_pre = up_pre
            print(max_pre,'max_pre',point_buy_pre,"구매가")

        print(((1-(up_pre/max_pre))*100),"고점대비 얼마(%) 손해중인지 확인")#@나중에 시간되면 음수로 고쳐두 됨
        if (((1-(up_pre/max_pre))*100)>Per):#손해보는 % 대비 고점
            print(((1-(up_pre/max_pre))*100),"팔시점 나옴")
            break
        time.sleep(1)



    #판매주문
    up_simbol_balance = upbit.get_balance("KRW-" + sim_name)
    res = upbit.sell_market_order("KRW-" + sim_name, up_simbol_balance)
    pprint.pprint(res)#판매주문확인
#무한루프임.

이런식으로 구성하면 될것입니다. 

사전학습된 긍부정 모델을 가져와 해당 모델이 사용한 토크나이저를 이용하여 긍부정을 판단한 후에 긍정문이면 

무한루프에서 매수 주문을 들어가게 해두었습니다.

 

해당 깃허브 주소는 ~~~

이며 해당 코드는 슈도 코드로 작성되었습니다. (과거에는 사용 가능했지만 트위터 개발자 api유료화된 부분부터 .. 너무 할게 많아짐.)