Spaces:
Build error
Build error
| # Standart python imports | |
| from enum import Enum | |
| from datetime import datetime, timedelta | |
| # Third party imports | |
| import streamlit as st | |
| # Local package imports | |
| from option_Pricing import BlackScholesModel, MonteCarloPricing, BinomialTreeModel, Ticker | |
| class OPTION_PRICING_MODEL(Enum): | |
| BLACK_SCHOLES = 'Black Scholes Model' | |
| MONTE_CARLO = 'Monte Carlo Simulation' | |
| BINOMIAL = 'Binomial Model' | |
| def get_historical_data(ticker): | |
| """Getting historical data for speified ticker and caching it with streamlit app.""" | |
| return Ticker.get_historical_data(ticker) | |
| # Ignore the Streamlit warning for using st.pyplot() | |
| st.set_option('deprecation.showPyplotGlobalUse', False) | |
| # Main title | |
| st.title('Option pricing') | |
| # User selected model from sidebar | |
| pricing_method = st.sidebar.radio('Please select option pricing method', options = [model.value for model in OPTION_PRICING_MODEL]) | |
| # Displaying specified model | |
| st.subheader(f'Pricing method: {pricing_method}') | |
| if pricing_method == OPTION_PRICING_MODEL.BLACK_SCHOLES.value: | |
| # Parameters for Black-Scholes model | |
| ticker = st.text_input('Ticker symbol', 'AAPL') | |
| strike_price = st.number_input('Strike price', 0) | |
| risk_free_rate = st.slider('Risk-free rate (%)', 0, 100, 10) | |
| sigma = st.slider('Sigma (%)', 0, 100, 20) | |
| exercise_date = st.date_input('Exercise date', min_value = datetime.today() + timedelta(days = 1), value = datetime.today() + timedelta(days = 365)) | |
| if st.button(f'Calculate option price for {ticker}'): | |
| # Getting data for selected ticker | |
| data = get_historical_data(ticker) | |
| st.write(data.tail()) | |
| Ticker.plot_data(data, ticker, 'Adj Close') | |
| st.pyplot() | |
| # Formating selected model parameters | |
| spot_price = Ticker.get_last_price(data, 'Adj Close') | |
| risk_free_rate = risk_free_rate / 100 | |
| sigma = sigma / 100 | |
| days_to_maturity = (exercise_date - datetime.now().date()).days | |
| # Calculating option price | |
| BSM = BlackScholesModel(spot_price, strike_price, days_to_maturity, risk_free_rate, sigma) | |
| call_option_price = BSM.calculate_option_price('Call Option') | |
| put_option_price = BSM.calculate_option_price('Put Option') | |
| # Displaying call/put option price | |
| st.subheader(f'Call option price: {call_option_price}') | |
| st.subheader(f'Put option price: {put_option_price}') | |
| elif pricing_method == OPTION_PRICING_MODEL.MONTE_CARLO.value: | |
| # Parameters for Monte Carlo simulation | |
| ticker = st.text_input('Ticker symbol', 'AAPL') | |
| strike_price = st.number_input('Strike price', 0) | |
| risk_free_rate = st.slider('Risk-free rate (%)', 0, 100, 10) | |
| sigma = st.slider('Sigma (%)', 0, 100, 20) | |
| exercise_date = st.date_input('Exercise date', min_value = datetime.today() + timedelta(days = 1), value = datetime.today() + timedelta(days = 365)) | |
| number_of_simulations = st.slider('Number of simulations', 100, 100000, 10000) | |
| num_of_movements = st.slider('Number of price movement simulations to be visualized ', 0, int(number_of_simulations / 10), 100) | |
| if st.button(f'Calculate option price for {ticker}'): | |
| # Getting data for selected ticker | |
| data = get_historical_data(ticker) | |
| st.write(data.tail()) | |
| Ticker.plot_data(data, ticker, 'Adj Close') | |
| st.pyplot() | |
| # Formating simulation parameters | |
| spot_price = Ticker.get_last_price(data, 'Adj Close') | |
| risk_free_rate = risk_free_rate / 100 | |
| sigma = sigma / 100 | |
| days_to_maturity = (exercise_date - datetime.now().date()).days | |
| # ESimulating stock movements | |
| MC = MonteCarloPricing(spot_price, strike_price, days_to_maturity, risk_free_rate, sigma, number_of_simulations) | |
| MC.simulate_prices() | |
| # Visualizing Monte Carlo Simulation | |
| MC.plot_simulation_results(num_of_movements) | |
| st.pyplot() | |
| # Calculating call/put option price | |
| call_option_price = MC.calculate_option_price('Call Option') | |
| put_option_price = MC.calculate_option_price('Put Option') | |
| # Displaying call/put option price | |
| st.subheader(f'Call option price: {call_option_price}') | |
| st.subheader(f'Put option price: {put_option_price}') | |
| elif pricing_method == OPTION_PRICING_MODEL.BINOMIAL.value: | |
| # Parameters for Binomial-Tree model | |
| ticker = st.text_input('Ticker symbol', 'AAPL') | |
| strike_price = st.number_input('Strike price', 0) | |
| risk_free_rate = st.slider('Risk-free rate (%)', 0, 100, 10) | |
| sigma = st.slider('Sigma (%)', 0, 100, 20) | |
| exercise_date = st.date_input('Exercise date', min_value = datetime.today() + timedelta(days = 1), value = datetime.today() + timedelta(days = 365)) | |
| number_of_time_steps = st.slider('Number of time steps', 5000, 100000, 15000) | |
| if st.button(f'Calculate option price for {ticker}'): | |
| # Getting data for selected ticker | |
| data = get_historical_data(ticker) | |
| st.write(data.tail()) | |
| Ticker.plot_data(data, ticker, 'Adj Close') | |
| st.pyplot() | |
| # Formating simulation parameters | |
| spot_price = Ticker.get_last_price(data, 'Adj Close') | |
| risk_free_rate = risk_free_rate / 100 | |
| sigma = sigma / 100 | |
| days_to_maturity = (exercise_date - datetime.now().date()).days | |
| # Calculating option price | |
| BOPM = BinomialTreeModel(spot_price, strike_price, days_to_maturity, risk_free_rate, sigma, number_of_time_steps) | |
| call_option_price = BOPM.calculate_option_price('Call Option') | |
| put_option_price = BOPM.calculate_option_price('Put Option') | |
| # Displaying call/put option price | |
| st.subheader(f'Call option price: {call_option_price}') | |
| st.subheader(f'Put option price: {put_option_price}') |