코딩걸음마

주식 매매시뮬레이션게임 (with 파이썬) 본문

나만의 프로그램

주식 매매시뮬레이션게임 (with 파이썬)

코딩걸음마 2022. 6. 20. 16:34
728x90

 

플레이어가 주식 매매를 마치면 봇이 매수매도를 결정하고 주가가 변동됩니다.

 

 

실행시키면 호가장 처럼 생긴 DataFrame이 나오는데

 

 

실제 호가창
실행할때마다 주가와 물량은 매번 바뀝니다.

호가창이라고 생각하고 한번 해보시면 됩니다.

 

모든 매매는 시장가 매매로 처리됩니다.

 

 

import random
import time
import pandas as pd



def cur_Price_list(board_start):
    return Price_list[board_start:board_start + 10]

def cur_bid_ask_price(board_start):
    return bid_ask_price_list[board_start:board_start + 10]

def Ai_buy(a):  #매수 봇
    global status
    global cur_bid_ask_price
    global rest_order_ai_buy
    global rand_cursor_ai
    global board_start
    global active_value

    status = 0
    rand_cursor_ai+=1

    if a < bid_ask_price_list[board_start+4]:  # 주문수량을 검토한다. 주문수량이 물량보다 적다면,
        rest_order_ai_buy = a - bid_ask_price_list[board_start + 4]  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다. 당연히 0이됨
        bid_ask_price_list[board_start + 4] = bid_ask_price_list[board_start + 4] - a  # 물량 리스트에서 주문수량만큼 뺀 값을 업데이트한다.
        board_start += 0  # 주가변동은 없다.
        status = 0  # 매수우위 유지
        rand_cursor_ai += 1
        print("BOT■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
        print(f"봇이 매수주문을 체결하였습니다. {a}주, {a * Price_list[board_start + 4 + status]}원 주문단가 :{Price_list[board_start + 4 + status]}  ")
        # AI의 매수 매도방향 랜덤 결정
        active_value_list = [0, 1]
        active_value = random.choice(active_value_list)
        time.sleep(0.1)

    else:
        rest_order_ai_buy = a
        while rest_order_ai_buy != 0:
            success_order_ai = min(bid_ask_price_list[board_start + 4],rest_order_ai_buy)  # 주문수량을 검토한다. 주문수량이 물량보다 많다면, 현재물량 만큼만 체결된다.
            rest_order_ai_buy -= success_order_ai  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다.
            bid_ask_price_list[board_start + 4] = bid_ask_price_list[board_start + 4] - success_order_ai
            bid_ask_price_list[board_start + 5] = rand[50000 - rand_cursor_ai]  # 신규 주문 수량을 업데이트한다.
            board_start -= 1  # 주가변동이 있다. (증가)
            status = 0  # 매수우위 유지
            rand_cursor_ai += 1
            print("BOT■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
            print(f"봇이 매수주문을 체결하였습니다. {success_order_ai}주, {success_order_ai * Price_list[board_start + 4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,} ")
            active_value_list = [0, 1]
            active_value = random.choice(active_value_list)
            time.sleep(0.1)


def Ai_sell(a):
    global status
    global cur_bid_ask_price
    global rest_order_ai_sell
    global rand_cursor_ai
    global board_start
    global active_value

    status = 1
    rand_cursor_ai += 1

    if a < bid_ask_price_list[board_start+5]:  # 주문수량을 검토한다. 주문수량이 물량보다 적다면,
        rest_order_ai_sell = a - bid_ask_price_list[board_start + 5]  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다. 당연히 0이됨
        bid_ask_price_list[board_start + 5] = bid_ask_price_list[board_start + 5] - a  # 물량 리스트에서 주문수량만큼 뺀 값을 업데이트한다.
        board_start += 0  # 주가변동은 없다.
        status = 1  # 매도우위 유지
        rand_cursor_ai += 1
        print("BOT■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
        print(f"봇이 매도주문을 체결하였습니다. {a}주, {a * Price_list[board_start + 4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,} ")
        active_value_list = [0, 1]
        active_value = random.choice(active_value_list)
        time.sleep(0.1)

    else:
        rest_order_ai_sell = a
        while rest_order_ai_sell != 0:
            success_order_ai = min(bid_ask_price_list[board_start + 5],rest_order_ai_sell)  # 주문수량을 검토한다. 주문수량이 물량보다 많다면, 현재물량 만큼만 체결된다.
            rest_order_ai_sell -= success_order_ai  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다.
            bid_ask_price_list[board_start + 5] = bid_ask_price_list[board_start + 5] - success_order_ai
            bid_ask_price_list[board_start + 5] = rand[50000 - rand_cursor_ai]  # 신규 주문 수량을 업데이트한다.
            board_start += 1  # 주가변동이 있다. (감소)
            status = 1  # 매도우위 유지
            rand_cursor_ai += 1
            print("BOT■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
            print(f"봇이 매도주문을 체결하였습니다. {success_order_ai}주, {success_order_ai * Price_list[board_start + 4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,} ")
            active_value_list = [0, 1]
            active_value = random.choice(active_value_list)
            time.sleep(0.1)


#리스트 크기
list_max=int(2000)  #리스트 최대갯수
#물량 난수
board_start=random.randint(500,list_max-1200) #randint의 arg 1은 출발 최소점을 의미
#최소가격
start_price=0
#시작 돈
money=2000000
st_money=2000000
#시작 물량
st_amount=0
#라운드 체크
Round=0

#매수 총액
buy_sum=0
buy_sum_fin=0
#매도 총액
sell_sum=0

# 호가창 생성
Price_list=[]
i=0
while i<list_max:
    if start_price >= 500000:
        start_price += 1000
        Price_list.append(start_price)
        i += 1
    elif start_price >= 100000:
        start_price += 500
        Price_list.append(start_price)
        i += 1
    elif start_price >= 50000:
        start_price += 100
        Price_list.append(start_price)
        i += 1
    elif start_price >= 10000:
        start_price += 50
        Price_list.append(start_price)
        i += 1
    elif start_price >= 5000:
        start_price += 10
        Price_list.append(start_price)
        i += 1
    elif start_price >= 1000:
        start_price += 5
        Price_list.append(start_price)
        i += 1
    else:
        start_price += 1
        Price_list.append(start_price)
        i +=1
#상태 출력
status=0  # 0=매수우위, 1=매도우위
 #매물 리스트 생성
bid_ask_price_list = []
i=0
while i<list_max:
    order_amount= random.randint(50,200)
    bid_ask_price_list.append(order_amount)
    i+=1
#난수 테이블
rand=[random.randint(50,200) for i in range(120000)]
rand_cursor=0

#매수 AI
buy_ai_normal=[random.randint(300,1000) for i in range(120000)]
# buy_ai_hard=[random.randint(100,600) for i in range(120000)]

#매도 AI
sell_ai_normal=[random.randint(300,1000) for i in range(120000)]
# sell_ai_hard=[random.randint(100,600) for i in range(120000)]
rest_order_ai=0
rand_cursor_ai=0
#porfolio 수익률

Price_list.reverse() #원본 역순
bid_ask_price_list.reverse() #원본 역순

while True:  #무한 반복

    if money>0: #패배조건 돈이 0원

        random.seed(10)
        Round +=1  #라운드 처리
        # 1. 초기 호가창 보여주기
        data = {
            '매도': bid_ask_price_list[board_start:board_start+5]+[" " for i in range(5)],
            "": [" " for i in range(10)],
            '주가': cur_Price_list(board_start),
            "   ": [" " for i in range(10)],
            '매수': [" " for i in range(5)]+bid_ask_price_list[board_start+5:board_start+10],
            }
        df_nan = pd.DataFrame(data)
        df = df_nan.copy()

        # AI의 매수 매도방향 랜덤 결정
        active_value_list = [0, 1]
        active_value = random.choice(active_value_list)
        # AI의 거래 횟수 결정
        active_cnt_list = [i for i in range(8)]
        active_cnt = random.choice(active_cnt_list)




        try:
            buy_mean = buy_sum / st_amount
            port_yield =((int(Price_list[board_start - 5 + status]) * int(st_amount)) - (buy_mean * int(st_amount))) / (buy_mean * st_amount) * 100
            all_yield = ((sell_sum - buy_sum_fin) / st_money)
        except:
            buy_mean = 0
            port_yield = 0
            st_amount=0
            all_yield = ((sell_sum - buy_sum_fin) / st_money)
        while True:
            print(f"================={Round} 라운드=================")
            print(df)
            print()
            print(f"■ 현재 주가: {Price_list[board_start + 4 + status]:,}원")
            print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
            print(f"■ 보유 금액: {int(money):,}원            ■ 보유 주식수: {int(st_amount):,}주")
            print(f'■ 매수평균가:{(buy_mean):.1f}원            ■ 평가금액:{int((Price_list[board_start - 5 + status])) * int(st_amount):,}원')
            print(f'■ 포트수익률:{port_yield:.1f}%')
            print(f"■ 총 누적수익: {(sell_sum - buy_sum_fin):,.1f}원             ■ 총 수익률: {all_yield:.1f}%")
            print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
            print()
            buy_sell = int(input("매수(Buy) [ 1 ]입력 ■■■■■■■■■■■■  매도(Sell) [ 2 ]입력"))
            print()







            if buy_sell == 1:  # 매수
                while True:
                    orders = int(input(
                        f"몇 주를 주문하시겠습니까?    최대주문 가능: ■■■[{int(money / (Price_list[board_start - 5 + status]))}주]■■■  (시장가 보증율 적용) !!! 0주 주문 시(관망)  AI주문이 실행됩니다..)"))
                    if orders > int(money / (Price_list[board_start - 5 + status])):
                        print(f"USER■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                        print(f"{(orders * Price_list[board_start - 5 + status] - money):,}원이 부족하여, 매수할 수 없습니다.")
                        print(f"■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                    elif orders == 0:
                        time.sleep(0.1)
                        print("___________________________________")
                        time.sleep(0.2)
                        print("___________________________________")
                        time.sleep(0.3)
                        print("___________________________________")
                        time.sleep(0.4)
                        print("____________존버는_승리한다___________")
                        time.sleep(1)
                        break
                    elif orders < 0:
                        print(f"잘못된 주문입니다. 주문을 확인하세요.")
                        time.sleep(1)
                    elif orders > 0:
                        break




            elif buy_sell == 2:
                while True:
                    orders = int(
                        input(f"몇 주를 주문하시겠습니까? 현재 보유주식수:■■■[{int(st_amount)}주]■■■  0주 주문 시, 주문이 취소됩니다-관망)"))
                    if orders > st_amount:
                        print(f"현재보유 주식:{st_amount}주, 보유하신 주식보다 더 많은 주식을 매도할 수 없습니다.")
                    elif orders == 0:
                        time.sleep(0.1)
                        print("___________________________________")
                        time.sleep(0.2)
                        print("___________________________________")
                        time.sleep(0.3)
                        print("___________________________________")
                        time.sleep(0.4)
                        print("____________존버는_승리한다___________")
                        time.sleep(1)
                        break
                    elif orders < 0:
                        print(f"잘못된 주문입니다. 주문을 확인하세요.")
                        time.sleep(1)
                    elif orders > 0:
                        break


            else:
                print("USER■■■■■■■■■■■■■■■■     매수    ■■■■■■■■■■■■   매도    ■■■■■■■■■■■■■■■■■")
                print("잘못 입력되었습니다  ■■   [ 1 ] 입력 ■■■■■■■■■■■ [ 2 ] 입력 ■■■■■■■■■■■■■■■■■■■")
                print()
                time.sleep(1)
                print("다시 주문 해주세요....2")
                time.sleep(1)
                print("다시 주문 해주세요....1")
                time.sleep(1)
                continue
            break

        if buy_sell == 1:  # 매수
            status = 0
            st_amount += orders  # 주문수량만큼만 체결된다.보유주식수가 주문수량만큼 증가한다.
            if orders <= cur_bid_ask_price(board_start)[4]:  # 주문수량을 검토한다. 주문수량이 물량보다 적다면,
                bid_ask_price_list[board_start + 4] = bid_ask_price_list[
                                                          board_start + 4] - orders  # 물량 리스트에서 주문수량만큼 뺀 값을 업데이트한다.
                money -= orders * Price_list[board_start + 4 + status]  # 보유금액이 주문수량*현재가격 만큼 감소한다.
                buy_sum += orders * Price_list[board_start + 4 + status]  # 매수누적액이 주문수량*현재가격 만큼 증가한다.
                board_start += 0  # 주가변동은 없다.
                status = 0  # 매수우위 유지
                rand_cursor_ai += 1
                print()
                print()
                print("USER■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                print(f"매수주문이 체결되었습니다. {orders:,}주, {orders * Price_list[board_start + 4 + status]:,}원 주문단가 :{(Price_list[board_start + 4 + status]):,} ")
                print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")

                time.sleep(1)
                print("AI가 주문 준비중입니다......2")
                time.sleep(1)
                print("AI가 주문 준비중입니다......1")
                time.sleep(1)

                Ai_list = [Ai_buy(buy_ai_normal[rand_cursor_ai]),
                           Ai_sell(sell_ai_normal[rand_cursor_ai])]  # 주문 횟수와 주문 방향을 랜덤화 하자
                for i in range(active_cnt):
                    Ai_list[active_value]

                time.sleep(1)
                print("호가창으로 돌아갑니다......2")
                time.sleep(1)
                print("호가창으로 돌아갑니다......1")
                time.sleep(1)


            else:  # 호가 초과매수
                rest_order = orders
                # st_amount += orders  # 주문수량만큼만 체결된다.보유주식수가 주문수량만큼 증가한다.

                while rest_order != 0:
                    success_order = bid_ask_price_list[board_start + 4] if (bid_ask_price_list[board_start + 4] < rest_order) else rest_order  # 주문수량을 검토한다. 주문수량이 물량보다 많다면, 현재물량 만큼만 체결된다.
                    rest_order -= success_order  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다.
                    bid_ask_price_list[board_start + 4] = bid_ask_price_list[board_start + 4] - success_order
                    bid_ask_price_list[board_start + 4] = rand[100000 - rand_cursor_ai]
                    money -= success_order * Price_list[board_start + 4 + status]  # 보유금액이 주문수량*현재가격 만큼 감소한다.
                    buy_sum += success_order * Price_list[board_start + 4 + status]  # 매수누적액이 주문수량*현재가격 만큼 증가한다.
                    board_start -= 1  # 주가변동이 있다. (증가)
                    rand_cursor_ai += 1
                    status = 0  # 매수우위 유지

                    print()
                    print()
                    print("USER■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                    print(f"매수주문이 체결되었습니다. {success_order:,}주, {success_order * Price_list[board_start + 4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,} ")
                    print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                    time.sleep(0.2)

                time.sleep(1)
                print("AI가 주문 준비중입니다......2")
                time.sleep(1)
                print("AI가 주문 준비중입니다......1")
                time.sleep(1)

                Ai_list = [Ai_buy(buy_ai_normal[rand_cursor_ai]),
                           Ai_sell(sell_ai_normal[rand_cursor_ai])]  # 주문 횟수와 주문 방향을 랜덤화 하자
                for i in range(active_cnt):
                    Ai_list[active_value]

                time.sleep(1)
                print("호가창으로 돌아갑니다......2")
                time.sleep(1)
                print("호가창으로 돌아갑니다......1")
                time.sleep(1)
                continue





        # ----------------------------------------------매도--------------------------------------------------
        # ---------------------------------------------------------------------------------------------------

        else:
            status = 1
            st_amount -= orders  # 주문수량만큼만 체결된다.보유주식수가 주문수량만큼 감소한다..
            if orders <= cur_bid_ask_price(board_start)[5]:  # 주문수량을 검토한다. 주문수량이 물량보다 적다면,
                if st_amount ==0:
                    buy_sum_fin += buy_sum
                    buy_sum -= buy_sum
                else:
                    buy_sum_fin += (buy_sum / st_amount) * orders  # 매수확정액이 주문수량*평균단가 만큼 증가한다.

                    buy_sum -= (buy_sum / st_amount) * orders  # 매수누적액이 주문수량*현재가격 만큼 감소한다.

                sell_sum += orders * Price_list[board_start + 4 + status]
                bid_ask_price_list[board_start + 5] = bid_ask_price_list[
                                                          board_start + 5] - orders  # 물량 리스트에서 주문수량만큼 뺀 값을 업데이트한다.
                money += orders * Price_list[board_start + 4 + status]  # 보유금액이 주문수량*현재가격 만큼 증가한다.

                board_start += 0  # 주가변동은 없다.
                status = 1  # 매도우위 유지
                rand_cursor_ai += 1

                print()
                print("USER■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                print( f"매도주문이 체결되었습니다. {orders:,}주, {orders * Price_list[board_start + 4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,} ")
                print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                time.sleep(1)
                print("AI가 주문 준비중입니다......2")
                time.sleep(1)
                print("AI가 주문 준비중입니다......1")
                time.sleep(1)

                Ai_list = [Ai_buy(buy_ai_normal[rand_cursor_ai]),
                           Ai_sell(sell_ai_normal[rand_cursor_ai])]  # 주문 횟수와 주문 방향을 랜덤화 하자
                for i in range(active_cnt):
                    Ai_list[active_value]

                time.sleep(1)
                print("호가창으로 돌아갑니다......2")
                time.sleep(1)
                print("호가창으로 돌아갑니다......1")
                time.sleep(1)
                continue

            else:
                rest_order = orders

                while rest_order != 0:  # 잔여주문이 0일때 까지

                    if st_amount == 0:
                        buy_sum_fin += buy_sum
                        buy_sum -= buy_sum
                    else:
                        st_amount -= success_order # 주문수량만큼만 체결된다.보유주식수가 주문수량만큼 감소한다..
                        buy_sum_fin += (buy_sum / st_amount) * success_order  # 매수확정액이 주문수량*평균단가 만큼 증가한다.
                        buy_sum -= (buy_sum / st_amount) * success_order  # 매수누적액이 주문수량*현재가격 만큼 감소한다.
                    success_order = bid_ask_price_list[board_start + 5] if (bid_ask_price_list[board_start + 5] < rest_order) else rest_order  # 주문수량을 검토한다. 주문수량이 물량보다 많다면, 현재물량 만큼만 체결된다.
                    st_amount -= rest_order

                    sell_sum += success_order * Price_list[board_start + 4 + status]
                    rest_order -= success_order  # 주문수량에서 현재물량을 뺀 후 잔여주문수량을 구한다.
                    money += success_order * Price_list[board_start + 4 + status]  # 보유금액이 주문수량*현재가격 만큼 감소한다.
                    bid_ask_price_list[board_start + 5] = bid_ask_price_list[board_start + 5] - success_order  # 주문수량을 반영하여 값을 업데이트 한다.
                    bid_ask_price_list[board_start + 5] = rand[50000 - rand_cursor_ai]  # 신규 주문 수량을 업데이트한다.

                    board_start += 1  # 주가변동이 있다. (증가)
                    status = 1  # 매도우위 유지
                    rand_cursor_ai += 1

                    print()
                    print("USER■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")

                    print(f"매도주문이 체결되었습니다. {success_order:,}주, {success_order * Price_list[4 + status]:,}원 주문단가 :{Price_list[board_start + 4 + status]:,}")
                    print("■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■")
                    time.sleep(0.2)

                time.sleep(1)
                print("AI가 주문 준비중입니다......2")
                time.sleep(1)
                print("AI가 주문 준비중입니다......1")
                time.sleep(1)

                Ai_list = [Ai_buy(buy_ai_normal[rand_cursor_ai]),
                           Ai_sell(sell_ai_normal[rand_cursor_ai])]  # 주문 횟수와 주문 방향을 랜덤화 하자
                for i in range(active_cnt):
                    Ai_list[active_value]

                time.sleep(1)

                print("호가창으로 돌아갑니다......2")
                time.sleep(1)
                print("호가창으로 돌아갑니다......1")
                time.sleep(1)
                continue




오류가 있을 수 있어요, 언제든지 수정요청 환영!

728x90
Comments