mercredi 5 février 2020

How do I run a function simultaneously with a graph? (Stock Simulation)

I am currently making a simulator for stocks using random number generator. I would need suggestions for the following 2 aspects (the first is of higher importance):

  1. Player can buy and sell stocks anytime during the simulation. (a good idea would be implementing buttons for this function, but I am unsure how to incorporate this into graph that uses matplotlib)
  2. Creating a better algorithm for the simulation that mimics the fluctuation of prices of actual stocks and commodities.

Code:

'''
import libaries
'''
import numpy as np
import matplotlib
import matplotlib.pyplot as plt
import random
import sys

from matplotlib.axes._axes import _log as matplotlib_axes_logger
matplotlib_axes_logger.setLevel('ERROR') # remove error for rgb values

'''
settings
'''
interest_rate = 0.10
budget = 1000
stock_bought = 0
stock_price = 100
time = 0
up_down = 0

'''
main
'''
while True:
    try:
        print("Write number of stocks you're going to buy below. \nPrice of stock: $" + str(stock_price) + "/stock. \nBudget: $" + str(budget) + ". \nInterest rate: 10%")
        player_input = input("> ").lower()
        print("-----------------------------------------------------------------------------")

        if stock_price * float(player_input) >= 0 and stock_price * float(player_input) <= budget:
            budget = budget - stock_price * float(player_input)
            stock_bought = stock_bought + float(player_input)
            initial_price = float(stock_price)
            print("Budget remaining: $" + str(budget) + "\nStocks bought: " + str(stock_bought))
            print("-----------------------------------------------------------------------------")
            pass
        elif stock_price * float(player_input) > budget:
            print("You have bought stocks which exceeded your budget. Please try again.")
            continue
        else:
            print("Invalid value. Please try again.")
            continue
    except ValueError:
        print("Invalid value. Please try again.")
        continue


    while True:
        try:
            print("How long do you want to turn on the stock market for (in minutes)?")
            minute = 6 * int(input("> ").lower())
            print("-----------------------------------------------------------------------------")
            break
        except ValueError:
            print("Invalid value. Please try again.")
            continue

    for i in range(minute): # 1 hour time-frame
        number = random.randint(1, 5)
        stock_change = 0

        if stock_price < 75 and up_down >= 30:
            if number == 1 or number == 2:
                stock_change = 0 - float(random.randint(1, 1000)/100)
                up_down = up_down - 2
            elif number == 3 or number == 4 or number == 5:
                stock_change = 0 + float(random.randint(1, 500)/100)
                up_down = up_down + 1
            else:
                stock_change = 0
        elif stock_price > 125 and up_down <= -30:
            if number == 1 or number == 2 or number == 3:
                stock_change = 0 - float(random.randint(1, 500)/100)
                up_down = up_down - 1
            elif number == 4 or number == 5:
                stock_change = 0 + float(random.randint(1, 1000)/100)
                up_down = up_down + 2
            else:
                stock_change = 0
        elif stock_price <= 0:
            if number == 1 or number == 2:
                stock_change = 0 - float(random.randint(1, 200)/100)
                up_down = up_down - 1
            elif number == 3 or number == 4 or number == 5:
                stock_change = 0 + float(random.randint(1, 300)/100)
                up_down = up_down + 1
            else:
                stock_change = 0
        elif stock_price >= 200:
            if number == 1 or number == 2 or number == 3:
                stock_change = 0 - float(random.randint(1, 300)/100)
                up_down = up_down - 1
            elif number == 4 or number == 5:
                stock_change = 0 + float(random.randint(1, 200)/100)
                up_down = up_down + 1
            else:
                stock_change = 0
        else:
            if number == 1:
                stock_change = 0 - float(random.randint(1, 1500)/100)
                up_down = up_down - 3
            elif number == 5:
                stock_change = 0 + float(random.randint(1, 1500)/100)
                up_down = up_down + 3
            else:
                stock_change = 0

        stock_price = stock_price + stock_change
        time = i/6 # 1i = 1 minute, i/6 = 10 seconds

        if stock_price > 125:
            color = (0, (1000 - stock_price) / 1000, 0)
        elif stock_price < 75:
            color = ((925 + stock_price) / 1000, 0, 0)
        elif stock_price == 0:
            color = (0.925, 0, 0) # 925/1000
        else:
            color = "blue"

        plt.scatter(time, stock_price, c = color, s = 5)
        plt.pause(0.05)

    plt.show()

    while True:
        try:
            print("How many stocks do you want to sell now? \nYou have " + str(stock_bought) + " stocks remaining to be sold. \nPrice of stock: $" + str(stock_price) + "/stock. \nType \"stop\" to stop the simulation.")
            stock_sold = input("> ").lower()
            print("-----------------------------------------------------------------------------")

            if stock_sold == "stop":
                print("Budget remaining: $" + str(budget) + "\nStocks remaining: " + str(stock_bought))
                sys.exit()
            elif float(stock_sold) <= stock_bought and float(stock_sold) > 0:
                stock_bought = stock_bought - float(stock_sold)
                difference = stock_price - initial_price
                if difference >= 0:
                    budget = budget + float(float(stock_sold) * stock_price) - float(difference * interest_rate)
                else:
                    budget = budget + float(float(stock_sold) * stock_price)
                break
            elif float(stock_sold) == 0:
                break
            elif float(stock_sold) > stock_bought:
                print("You tried to sell more stocks than you have. Please try again.")
                continue
            else:
                print("Invalid value. Please try again.")
                continue
        except ValueError:
            print("Invalid value. Please try again.")
            continue


    up_down = 0
    print("Budget remaining: $" + str(budget) + "\nStocks remaining: " + str(stock_bought))
    print("-----------------------------------------------------------------------------")
    continue

Thanks in advance.




Aucun commentaire:

Enregistrer un commentaire