250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 연습
- 기초
- DeepLearning
- Regression
- 알고리즘
- 추천시스템
- 주식연습
- 코딩
- CLI
- tensorflow
- 머신러닝
- 템플릿
- 크롤링
- 주식
- 딥러닝
- 선형회귀
- 코딩테스트
- PyTorch
- 게임
- 회귀
- 흐름도
- 재귀함수
- 가격맞히기
- 주가예측
- 주식매매
- API
- 프로그래머스
- Linear
- 파이썬
- python
Archives
- Today
- Total
코딩걸음마
주식 매매시뮬레이션게임 (with 파이썬) 본문
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
'나만의 프로그램' 카테고리의 다른 글
공공데이터 API를 활용한 데이터 크롤링 방법 (ex.경주마 성적정보) (0) | 2022.07.10 |
---|---|
[딥러닝] 딥러닝 기본 흐름도 (0) | 2022.06.30 |
특정기간 상승률 순위 검색기 (0) | 2022.06.20 |
종목별 테마 크롤링 코드(with Naver 금융) (0) | 2022.06.19 |
주식 정보 불러와서 미래수익률 예측기 만들기 (with Pykrx) (0) | 2022.06.19 |
Comments