forked from just-krivi/option-pricing-models
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathstreamlit_app.py
More file actions
128 lines (104 loc) · 5.52 KB
/
streamlit_app.py
File metadata and controls
128 lines (104 loc) · 5.52 KB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
# 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'
@st.cache
def get_historical_data(ticker):
"""Getting historical data for speified ticker and caching it with streamlit app."""
return Ticker.get_historical_data(ticker)
# 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', 300)
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', 300)
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', 300)
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}')