Project_9. Python 주식 미니게임 (Google Colab)

소고기는레어·2021년 3월 17일
1
post-thumbnail

2021. 03. 17 수요일

Python을 활용한 주식 미니게임 제작 (Google Colab)

  • 데이터캠프에서 학습 중인 파이썬의 진도가 random 까지 도달했다. 이제 시작하는 단계이지만 if else, while, for, random 을 포함하여 지금까지 배운 내용들을 응용하여 재밌는 무언가를 만들 수 있을 것 같았다. 뭘 만들지 고민하던 중 요즘 주식이 꽤 핫한 주제인 것 같아서 주식과 관련된 미니 게임을 제작 해보기로 했다.

1. 임의의 주식 만들기

  • 먼저, 랜덤한 값으로 등락하는 임의의 주식을 만들기로 했다.

  • 여러 종목을 만들 수는 있지만 아직 내 파이썬 실력이 높지 못해 노가다 수준의 작업이 될 것 같아서 우선은 한 종목만 놓고 매수/매도하는 방식으로 만들기로 했다.

  • 주식을 잘 알지 못하고 파이썬 실력도 아직 많이 부족하여 정교하고 복잡한 메커니즘을 갖고 있지는 않지만 적당히 랜덤하게 등락하는 주식을 만들도록 해보았다.

1) 전체 코드

import numpy as np
import matplotlib.pyplot as plt

stock_record = []              
턴수 = int(input('턴 수 : '))    
turn = 0                          
시작주가 = int(input('시작 주가 : ')) 
stock = 시작주가				

for a in range(턴수) :         
  turn = turn + 1              
  up_down_range = np.random.rand()
  if up_down_range < 0.2 :
    stock_up_down = np.random.randint(-30000, -6999)
  elif up_down_range >= 0.2 and up_down_range <= 0.78 :
    stock_up_down = np.random.randint(-7000, 7001)
  elif up_down_range > 0.78 and up_down_range <= 0.79 :
    stock_up_down = np.random.randint(stock * 0.2, stock * 0.4)
  elif up_down_range > 0.79 and up_down_range <= 0.8 and stock >= 120000 :
    stock_up_down = np.random.randint(-stock * 0.4 , -stock * 0.1)
  else :
    stock_up_down = np.random.randint(7001, 30001)
  if stock + stock_up_down <= 0 :
    stock_up_down = abs(stock_up_down)
    stock = stock + stock_up_down
  else :
    stock = max(1, stock + stock_up_down)
  stock_record.append(stock)

  plt.plot(stock_record)
  plt.xlabel('turn')
  plt.ylabel('stock')
  plt.grid(True)
  print('')
  print('턴 ' + str(turn))
  plt.show()
  print('주가 변동 : ' + str(stock_up_down) + '원')
  print('현재 주가 : ' + str(stock) + '원')
  print('')
  print('-------------------------------')

2) 코드 설명

import numpy as np
import matplotlib.pyplot as plt
  • numpy의 random 과 matplotlib 의 시각화를 사용하였다.
stock_record = []              
턴수 = int(input('턴 수 : '))    
turn = 0                          
시작주가 = int(input('시작 주가 : ')) 
stock = 시작주가	
  • stock_record = [] 은 주가 변동을 기록할 list이다.

  • 턴수 = int(input('턴 수 : ')) 은 턴 수 입력이다.

  • turn = 0 은 현재 턴 수 출력을 위한 변수 선언이다.

  • 시작주가 = int(input('시작 주가 : ')) 은 시작 주가 입력이다.

  • stock = 시작주가 은 입력값으로 시작 주가를 설정한다.

for a in range(턴수) :         
  turn = turn + 1              
  up_down_range = np.random.rand()
  if up_down_range < 0.2 :
    stock_up_down = np.random.randint(-30000, -6999)
  elif up_down_range >= 0.2 and up_down_range <= 0.78 :
    stock_up_down = np.random.randint(-7000, 7001)
  elif up_down_range > 0.78 and up_down_range <= 0.79 :
    stock_up_down = np.random.randint(stock * 0.2, stock * 0.4)
  elif up_down_range > 0.79 and up_down_range <= 0.8 and stock >= 120000 :
    stock_up_down = np.random.randint(-stock * 0.4 , -stock * 0.1)
  else :
    stock_up_down = np.random.randint(7001, 30001)
  • range()턴수 로 지정하여 입력한 턴 수 만큼 for 문이 반복되도록 하였다.

  • turn = turn + 1 은 아래에서 현재 턴 수를 출력하기 위한 계산이다.

  • up_down_range = np.random.rand() 를 통해 0~1 사이의 소수를 생성하고, 이 소수에 맞춰 다시 한 번 stock_up_down = np.random.randint(a, b) 를 통해 주가 등락폭을 결정한다.

  if stock + stock_up_down <= 0 :
    stock_up_down = abs(stock_up_down)
    stock = stock + stock_up_down
  else :
    stock = max(1, stock + stock_up_down)
  stock_record.append(stock)
  • if stock + stock_up_down <= 0 : 을 통해 주가가 하락할 때 0 밑으로 내려가는 경우에는 하락폭의 절대값만큼 주가가 상승하도록 하였다. (주가 마이너스 방지)

    • 예를 들어 주가가 10,000원일 때 주가 등락폭이 -15,000원이라면 -15,000의 절댓값인 15,000 만큼 주가를 하락이 아닌 상승시킨다. (어차피 랜덤으로 결정하는 주가여서 상관 없다. 개발자 마음이다.)
  • 위 코드를 빼고 max() 를 사용해도 되지만, 그럴 경우 주가 변동은 원래 수치대로 기록되나 실제 하락한 주가는 거기에 못미치는 상황이 발생한다. (기록과 실제 불일치)

    • 예를 들어 주가가 10,000원이고 15,000원이 하락해야 하는 상황에서 기록은 -15,000원인데 실제로는 9,999원만 하락하여 주가가 1원이 되는 상황이 발생한다.

    • 그래도 최소한의 안전장치로 max() 또한 추가하였다.

  • stock_record.append(stock) 를 통해 변동이 적용된 주가를 기록한다.

  plt.plot(stock_record)
  plt.xlabel('turn')
  plt.ylabel('stock')
  plt.grid(True)
  print('')
  print('턴 ' + str(turn))
  plt.show()
  print('주가 변동 : ' + str(stock_up_down) + '원')
  print('현재 주가 : ' + str(stock) + '원')
  print('')
  print('-------------------------------')
  • matplotlib의 플롯차트를 사용하여 주가 변동을 시각화하였다.
  • 또한 주가 변동(이전 주가와 현재 주가의 차이)과 현재 주가를 출력한다.

3) 결과물

  • 실행 후 턴 수를 입력하고
  • 시작 주가를 입력하게 되면
  • 잘려서 안보이지만 위와 같이 턴이 진행되며 각 턴에 맞는 차트와 텍스트가 출력된다.

2. 봇 만들기 (+ 최종 결과 집계)

  • 게임의 승패를 결정할 기준점을 위해 봇을 만들어서 플레이어와 경쟁할 수 있도록 하였다.

  • 높은 수준의 ai를 갖고 있는 봇은 아니지만 테스트 해본 결과 그럭저럭 괜찮은 성적을 내는 것 같았다.

1) 전체 코드

  • 위의 '임의의 주식 만들기'가 선행되므로 겹치는 부분이 많다.
import numpy as np
import matplotlib.pyplot as plt

stock_record = []
bot_record = []
turn = 0
턴수 = int(input('턴 수 : '))
시작주가 = int(input('시작 주가 : '))
시드머니 = int(input('봇 시드머니 : '))
stock = 시작주가
bot_money = 시드머니
bot_stock = 0
bot_buy = 0
bot_short = 0

for a in range(턴수) : 
  print('')
  print('---------------------------')
  turn = turn + 1
  up_down_range = np.random.rand()
  if up_down_range < 0.2 :
    stock_up_down = np.random.randint(-30000, -6999)
  elif up_down_range >= 0.2 and up_down_range <= 0.78 :
    stock_up_down = np.random.randint(-7000, 7001)
  elif up_down_range > 0.78 and up_down_range <= 0.79 :
    stock_up_down = np.random.randint(stock * 0.2, stock * 0.4)
  elif up_down_range > 0.79 and up_down_range <= 0.8 and stock >= 120000 :
    stock_up_down = np.random.randint(-stock * 0.4 , -stock * 0.1)
  else :
    stock_up_down = np.random.randint(7001, 30001)
  
  if stock + stock_up_down <= 0 :
    stock_up_down = abs(stock_up_down)
    stock = stock + stock_up_down
  else :
    stock = max(1, stock + stock_up_down)
  stock_record.append(stock)

  plt.plot(stock_record)
  plt.xlabel('turn')
  plt.ylabel('stock')
  print('')
  print('턴 ' + str(turn))
  plt.show()
  print('주가 변동 : ' + str(stock_up_down) + '원')
  print('현재 주가 : ' + str(stock) + '원')
  print('봇 보유 금액 : ' + str(bot_money) + '원')
  print('봇 보유 주식 : ' + str(bot_stock) + '주')
  print('')

  if bot_stock > 0 and bot_buy < stock and np.random.rand() > 0.3 :
    bot_amount = np.random.randint(1, bot_stock+1)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매도하였습니다.')
  elif stock > 70000 and bot_buy < stock and np.random.rand() > 0.7:
    bot_amount = np.random.randint(1, 21 + bot_stock)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    bot_short = stock
    print('')
    print('봇이 ' + str(bot_amount) + '주 공매도하였습니다.')
  elif bot_short > stock and bot_stock < 0:
    bot_amount = np.random.randint(abs(bot_stock), abs(bot_stock) + 5)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_short = 0
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif bot_buy * 0.5 < stock and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif np.random.rand() > 0.5 and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  else :
    bot_record.append(0)



final_stock = max(1, stock_record[-1] + np.random.randint(-50000, 50001))
stock_record.append(final_stock)
bot_result = bot_money + bot_stock * final_stock

if bot_stock != 0 :
  bot_record.append(-bot_stock)
else :
  bot_record.append(0)

print('---------------------------------')
print('주가 변동 내역 : ' + str(stock_record))
print('시작 주가 : ' + str(시작주가) + '원')
print('최종 주가 : ' + str(stock_record[-1]) + '원')
print('')
print('봇 시드머니 : ' + str(시드머니) + '원')
print('봇 최종 보유 금액 : ' + str(bot_result) + '원')
print('봇 거래 내역 : ' + str(bot_record))
print('수익률 : ' + str(round((bot_result - 시드머니) / 시드머니 * 100.0, 2)) + '%')

2) 코드 설명

  • 위에서 작성한 '임의의 주식 만들기' 와 겹치는 부분은 생략하고 설명하였다.
bot_record = []
시드머니 = int(input('봇 시드머니 : '))
bot_money = 시드머니
bot_stock = 0
bot_buy = 0
bot_short = 0
  • bot_record = [] 는 봇의 매매를 기록하는 list이다.

  • 시드머니 = int(input('봇 시드머니 : ')) 는 봇의 시작금액을 입력이다.

  • bot_money = 시드머니 는 봇의 시작금액을 입력값으로 설정한다.

  • bot_stock = 0 은 봇의 보유 주식 수를 집계하기 위한 변수 선언이다.

  • bot_buy = 0 은 봇이 매수할 당시의 매수가를 저장하기 위한 변수 선언이다.

  • bot_short = 0 은 봇이 공매도를 할 당시의 매도가를 저장하기 위한 변수 선언이다.

print('주가 변동 : ' + str(stock_up_down) + '원')
print('현재 주가 : ' + str(stock) + '원')
print('봇 보유 금액 : ' + str(bot_money) + '원')
print('봇 보유 주식 : ' + str(bot_stock) + '주')
  • print('봇 보유 금액 : ' + str(bot_money) + '원') 은 봇의 현재 보유 금액을 보여준다.
  • print('봇 보유 주식 : ' + str(bot_stock) + '주') 은 봇의 현재 보유 주식 수를 보여준다.
if bot_stock > 0 and bot_buy < stock and np.random.rand() > 0.3 :
    bot_amount = np.random.randint(1, bot_stock+1)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매도하였습니다.')
elif stock > 70000 and bot_buy < stock and np.random.rand() > 0.7:
    bot_amount = np.random.randint(1, 21 + bot_stock)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    bot_short = stock
    print('')
    print('봇이 ' + str(bot_amount) + '주 공매도하였습니다.')
  • if 부분 (매도)

    • 봇의 보유 주식이 0보다 많고 매수가보다 현재 주가가 높고 랜덤값이 0.3보다 클 때,
      (봇의 매도에 랜덤성 부여)

      • 매도량을 보유 주식 이내에서 결정한다. (bot_amount)

      • (매도량 * 현재 주가) 만큼 봇의 보유 금액에 더한다. (bot_money)

      • 매도량 만큼 봇의 보유 주식을 뺀다. (bot_stock)

      • 봇의 매매 기록에 매도량을 기록한다. (bot_record)

      • 봇의 매도량을 텍스트로 출력한다.

  • elif 부분 (공매도)

    • 주가가 70000 이상이고 매수가보다 현재 주가가 높고 랜덤값이 0.7보다 클 때,

      • 매도량을 1 ~ (20 + 보유 주식) 이내에서 결정한다. (bot_amount)

      • (매도량 * 현재 주가) 만큼 봇의 보유 금액에 더한다. (bot_money)

      • 매도량 만큼 봇의 보유 주식을 뺀다. (bot_stock)

      • 봇의 공매도 매도가를 기록한다. (bot_short)

      • 봇의 매매 기록에 매도량을 기록한다. (bot_record)

      • 봇의 공매도량을 텍스트로 출력한다.

elif bot_short > stock and bot_stock < 0:
    bot_amount = np.random.randint(abs(bot_stock), abs(bot_stock) + 5)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_short = 0
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif bot_buy * 0.5 < stock and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif np.random.rand() > 0.5 and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  else :
    bot_record.append(0)
  • 첫번째 elif 부분

    • 봇의 공매도가보다 현재 주가가 낮고 봇의 보유 주식이 0보다 낮을 경우,

      • 보유 주식의 절대값 ~ (보유 주식의 절대값 + 5) 이내에서 매수량을 결정한다. (bot_amount)

      • (매도량 * 현재 주가) 만큼 봇의 보유 금액에서 뺀다. (bot_money)

      • 매도량 만큼 봇의 보유 주식에 더한다.. (bot_stock)

      • 봇의 최근 매수액을 저장한다. (bot_buy)

      • 봇의 공매도액을 0으로 초기화한다. (bot_short)

      • 봇의 매매 기록에 매수량을 기록한다. (bot_record)

      • 봇의 매수량을 텍스트로 출력한다.

  • 두번째 elif 부분

    • 현재 주가 > (최근 매수액 / 2) 이고 보유 금액으로 1주 이상 구매 가능할 때,

      • 1 ~ (최대 구매 가능 수량) 이내에서 매수량을 결정한다. (bot_amount)

      • (매도량 * 현재 주가) 만큼 봇의 보유 금액에서 뺀다. (bot_money)

      • 매도량 만큼 봇의 보유 주식에 더한다.. (bot_stock)

      • 봇의 최근 매수액을 저장한다. (bot_buy)

      • 봇의 매매 기록에 매수량을 기록한다. (bot_record)

      • 봇의 매수량을 텍스트로 출력한다.

  • 세번째 elif 부분

    • 랜덤값이 0.5보다 크고 보유 금액으로 1주 이상 구매 가능할 때,
      (봇의 매수에 랜덤성 부여)

      • 두번째 elif 와 동일
final_stock = max(1, stock_record[-1] + np.random.randint(-50000, 50001))
stock_record.append(final_stock)
bot_result = bot_money + bot_stock * final_stock

if bot_stock != 0 :
  bot_record.append(-bot_stock)
else :
  bot_record.append(0)

print('---------------------------------')
print('주가 변동 내역 : ' + str(stock_record))
print('시작 주가 : ' + str(시작주가) + '원')
print('최종 주가 : ' + str(stock_record[-1]) + '원')
print('')
print('봇 시드머니 : ' + str(시드머니) + '원')
print('봇 최종 보유 금액 : ' + str(bot_result) + '원')
print('봇 거래 내역 : ' + str(bot_record))
print('수익률 : ' + str(round((bot_result - 시드머니) / 시드머니 * 100.0, 2)) + '%')
  • 최종 턴이 끝날 때 까지 보유 주식을 매도하거나 공매주를 갚지 않을 경우, 게임 종료시 최종 주가 변동을 거친 후 자동으로 매도/매수 되도록 하였다.

    • 최종 주가 변동을 결정한다. (final_stock)

    • 최종 주가를 기록한다. (stock_record)

    • 봇의 보유 금액에 (봇의 보유 주식 수 * 최종 주가) 만큼을 더한다. (bot_result)

    • 봇의 보유 주식이 0이 아닐 경우 매수/매도 내역을 기록하고, 0일 경우 0을 기록한다.
      (if bot_stock ... else ...)

  • 최종 결과를 출력한다. (print(...) ...)

3) 결과물

  • 턴 수, 시작 주가, 시드머니를 입력하면
  • 턴이 진행됨에 따라 주식이 등락하고 봇이 매매를 시작한다.
  • 턴이 모두 종료되면 최종 결과가 출력된다.

3. 플레이어

  • 랜덤값으로 등락하는 주식, 자동으로 매수/매도하는 봇까지 만들었으니 마지막은 플레이어가 직접 플레이 가능하도록 선택권을 부여하는 것이다.

  • 기본적인 틀은 봇과 동일하지만, 플레이어의 경우 상황 판단은 스스로 하게 된다.

    • 따라서 봇의 상황판단에 해당하는 부분을 input() 으로 대체하여 플레이어에게 결정권을 부여한다.
  • 플레이어와 관련된 변수들을 추가한다.

  • 플레이어의 최종 결과 출력을 추가한다.

  • 그 외 자잘한 부분

1) 전체 코드

  • 마찬가지로 위의 코드들이 선행되므로 중복되는 코드가 대부분이다. 아래의 코드 설명에서 중복되는 부분은 설명하지 않는다.
#플레이어 vs 봇
import numpy as np
import matplotlib.pyplot as plt

stock_record = []
my_record = []
bot_record = []
turn = 0
턴수 = int(input('턴 수 : '))
시작주가 = int(input('시작 주가 : '))
내시드 = int(input('내 시드머니 : '))
봇시드 = int(input('봇 시드머니 : '))
stock = 시작주가
my_money = 내시드
bot_money = 봇시드
my_stock = 0
bot_stock = 0
bot_buy = 0
my_buy = 0
bot_short = 0

for a in range(턴수) :
  print('')
  print('---------------------------')
  turn = turn + 1
  up_down_range = np.random.rand()
  if up_down_range < 0.2 :
    stock_up_down = np.random.randint(-30000, -6999)
  elif up_down_range >= 0.2 and up_down_range <= 0.78 :
    stock_up_down = np.random.randint(-7000, 7001)
  elif up_down_range > 0.78 and up_down_range <= 0.79 :
    stock_up_down = np.random.randint(stock * 0.2, stock * 0.4)
  elif up_down_range > 0.79 and up_down_range <= 0.8 and stock >= 120000 :
    stock_up_down = np.random.randint(-stock * 0.4 , -stock * 0.1)
  else :
    stock_up_down = np.random.randint(7001, 30001)
  
  if stock + stock_up_down <= 0 :
    stock_up_down = abs(stock_up_down)
    stock = stock + stock_up_down
  else :
    stock = max(1, stock + stock_up_down)
  stock_record.append(stock)


  plt.plot(stock_record)
  plt.xlabel('turn')
  plt.ylabel('stock')
  print('')
  print('턴 ' + str(turn))
  print('')
  plt.show()
  print('주가 변동 : ' + str(stock_up_down) + '원')
  print('현재 주가 : ' + str(stock) + '원')
  print('최근 구매 주가 : ' + str(my_buy) + '원')
  print('보유 금액 : ' + str(my_money) + '원')
  print('매수 가능 : ' + str(my_money // stock) + '주')
  print('보유 주식 : ' + str(my_stock) + '주')
  print('봇 보유 금액 : ' + str(bot_money) + '원')
  print('봇 보유 주식 : ' + str(bot_stock) + '주')
  print('')
  amount = int(input('매수→양수 / 매도→음수 / 스킵→0 : '))

  if amount > 0 :
    if my_money - amount * stock < 0 :
      my_record.append(0)
      print('')
      print('잔액 부족')
    else :
      my_money = my_money - amount * stock
      my_stock = my_stock + amount
      my_buy = stock
      my_record.append(amount)
      print('매수가 : ' + str(stock) + '원')
      print('매수액 : ' + str(stock * amount) + '원')
      print('매수 완료')
  elif amount < 0 :
    if my_stock + amount < -20 :
      y_record.append(0)
      print('')
      print('공매주는 -20주 까지 보유 가능')
    else :
      my_money = my_money - amount * stock
      my_stock = my_stock + amount
      my_record.append(amount)
      print('매도가 : ' + str(stock) + '원')
      print('매도액 : ' + str(stock * -amount) + '원')
      print('매도 완료')
  elif amount == 0 :
    my_record.append(0)
    print('')
    print('턴 스킵')
  else :
    my_record.append(0)
    print('잘못된 입력')

  if bot_stock > 0 and bot_buy < stock and np.random.rand() > 0.3 :
    bot_amount = np.random.randint(1, bot_stock+1)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매도하였습니다.')
  elif stock > 70000 and bot_buy < stock and np.random.rand() > 0.7:
    bot_amount = np.random.randint(1, 21 + bot_stock)
    bot_money = bot_money + bot_amount * stock
    bot_stock = bot_stock - bot_amount
    bot_record.append(-bot_amount)
    bot_short = stock
    print('')
    print('봇이 ' + str(bot_amount) + '주 공매도하였습니다.')
  elif bot_short > stock and bot_stock < 0:
    bot_amount = np.random.randint(abs(bot_stock), abs(bot_stock) + 5)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_short = 0
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif bot_buy * 0.5 < stock and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  elif np.random.rand() > 0.5 and bot_money // stock > 1 :
    bot_amount = np.random.randint(1, (bot_money // stock) + 1)
    bot_money = bot_money - bot_amount * stock
    bot_stock = bot_stock + bot_amount
    bot_buy = stock
    bot_record.append(bot_amount)
    print('')
    print('봇이 ' + str(bot_amount) + '주 매수하였습니다.')
  else :
    bot_record.append(0)



final_stock = max(1, stock_record[-1] + np.random.randint(-50000, 50001)) #6
stock_record.append(final_stock)
my_result = my_money + my_stock * final_stock
bot_result = bot_money + bot_stock * final_stock

if my_stock > 0 :
  my_record.append(-my_stock)
elif my_stock < 0 :
  my_record.append(-my_stock)
else :
  my_record.append(0)

if bot_stock > 0 :
  bot_record.append(-bot_stock)
elif bot_stock < 0 :
  bot_record.append(-bot_stock)
else :
  bot_record.append(0)

if my_result > bot_result :
  print('')
  print('Win!')
  print('')
elif my_result < bot_result :
  print('')
  print('Lose!')
  print('')
else :
  print('')
  print('Draw!')
  print('')

print('주가 변동 내역 : ' + str(stock_record))
print('시작 주가 : ' + str(시작주가) + '원')
print('최종 주가 : ' + str(stock_record[-1]) + '원')
print('')
print('내 시드머니 : ' + str(내시드) + '원')
print('내 최종 보유 금액 : ' + str(my_result) + '원')
print('내 수익률 : ' + str(round((my_result - 내시드) / 내시드 * 100.0, 2)) + '%')
print('내 거래 내역 : ' + str(my_record))
print('')
print('봇 시드머니 : ' + str(봇시드) + '원')
print('봇 최종 보유 금액 : ' + str(bot_result) + '원')
print('봇 수익률 : ' + str(round((bot_result - 봇시드) / 봇시드 * 100.0, 2)) + '%')
print('봇 거래 내역 : ' + str(bot_record))

2) 코드 설명

my_record = []
내시드 = int(input('내 시드머니 : '))
my_money = 내시드
my_stock = 0
my_buy = 0
  • 나의 거래내역을 저장한다. (my_record = [])

  • 내 시드머니를 입력한다. ( 내시드 = int(input...)

  • 입력값으로 내 시드머니를 설정한다. (my_money = 내시드)

  • 내 보유 주식을 출력하기 위한 변수를 선언한다. (my_stock = 0)

  • 최근 매수액을 출력하기 위한 변수를 선언한다.(my_buy = 0)

print('')
  print('턴 ' + str(turn))
  print('')
  plt.show()
  print('주가 변동 : ' + str(stock_up_down) + '원')
  print('현재 주가 : ' + str(stock) + '원')
  print('최근 구매 주가 : ' + str(my_buy) + '원')
  print('보유 금액 : ' + str(my_money) + '원')
  print('매수 가능 : ' + str(my_money // stock) + '주')
  print('보유 주식 : ' + str(my_stock) + '주')
  print('봇 보유 금액 : ' + str(bot_money) + '원')
  print('봇 보유 주식 : ' + str(bot_stock) + '주')
  print('')
  amount = int(input('매수→양수 / 매도→음수 / 스킵→0 : '))
  • 플레이어의 결정을 도울 여러 정보들을 출력한다. (print(...))

  • 플레이어에게 선택지를 부여한다.
    (amount = int(input...)

    • 매수일 경우 양수로 입력

    • 매도일 경우 음수로 입력

    • 스킵할 경우 0 입력

  if amount > 0 :
    if my_money - amount * stock < 0 :
      my_record.append(0)
      print('')
      print('잔액 부족')
    else :
      my_money = my_money - amount * stock
      my_stock = my_stock + amount
      my_buy = stock
      my_record.append(amount)
      print('매수가 : ' + str(stock) + '원')
      print('매수액 : ' + str(stock * amount) + '원')
      print('매수 완료')
  elif amount < 0 :
    if my_stock + amount < -20 :
      y_record.append(0)
      print('')
      print('공매주는 -20주 까지 보유 가능')
    else :
      my_money = my_money - amount * stock
      my_stock = my_stock + amount
      my_record.append(amount)
      print('매도가 : ' + str(stock) + '원')
      print('매도액 : ' + str(stock * -amount) + '원')
      print('매도 완료')
  elif amount == 0 :
    my_record.append(0)
    print('')
    print('턴 스킵')
  else :
    my_record.append(0)
    print('잘못된 입력')
  • 입력값이 0보다 클 경우

    • 매수액이 보유액보다 클 경우

      • '잔액 부족' 을 출력한다.

      • 거래내역에 0을 추가한다.

    • 매수액이 보유액보다 크지 않을 경우

      • 매수가, 매수액, 매수 완료를 출력하고 보유액과 보유 주식, 거래 내역을 반영한다.
  • 입력값이 0보다 작을 경우

    • 매도 후 보유 주식이 -20 보다 작을 경우
      (공매도는 20주까지 제한)

      • '공매주는 -20주 까지 보유 가능' 을 출력한다.
      • 거래내역에 0을 추가한다.
    • 매도 후 보유 주식이 -20 보다 작지 않을 경우

      • 매도가, 매도액, 매도 완료를 출력하고 보유액과 보유 주식, 거래 내역을 반영한다.
  • 입력값이 0일 경우

    • 거래내역에 0을 추가하고 '턴 스킵' 을 출력한다.
  • 그 외

    • 거래내역에 0을 추가하고 '잘못된 입력' 을 출력한다.
if my_result > bot_result :
  print('')
  print('Win!')
  print('')
elif my_result < bot_result :
  print('')
  print('Lose!')
  print('')
else :
  print('')
  print('Draw!')
  print('')

print('주가 변동 내역 : ' + str(stock_record))
print('시작 주가 : ' + str(시작주가) + '원')
print('최종 주가 : ' + str(stock_record[-1]) + '원')
print('')
print('내 시드머니 : ' + str(내시드) + '원')
print('내 최종 보유 금액 : ' + str(my_result) + '원')
print('내 수익률 : ' + str(round((my_result - 내시드) / 내시드 * 100.0, 2)) + '%')
print('내 거래 내역 : ' + str(my_record))
print('')
print('봇 시드머니 : ' + str(봇시드) + '원')
print('봇 최종 보유 금액 : ' + str(bot_result) + '원')
print('봇 수익률 : ' + str(round((bot_result - 봇시드) / 봇시드 * 100.0, 2)) + '%')
print('봇 거래 내역 : ' + str(bot_record))
  • 최종 보유 금액을 기준으로 승/패, 무승부를 판단하고 출력한다.

  • 그 외 추가 정보들을 출력한다.

3) 결과물

  • 턴 수, 시작 주가, 봇과 플레이어의 시드머니를 입력한다.
  • 턴마다 플레이어에게 수행할 행동을 묻는다.
  • 처음에 지정한 턴이 모두 종료되면 최종 결과가 출력된다.

이제 막 배우기 시작한 수준의 파이썬이지만 새로운 무언가를 만들어낼 수 있다는 점에서 흥미가 많이 느껴졌다.

맨 처음 배운 언어가 SQL이었기에 그런 흥미가 좀 더 크게 와닿았다.

좀 더 수준 높은 파이썬을 구사할 실력이 된다면 더 재밌는 것을 만들어보고 싶다.

profile
https://www.rarebeef.co.kr/

1개의 댓글

comment-user-thumbnail
2022년 7월 8일

선생님 혹시 파이썬 버전이 몇인가요?

답글 달기