Spaces:
Sleeping
Sleeping
File size: 2,017 Bytes
23e99b2 1c7d42a 23e99b2 1c7d42a 99a9757 1c7d42a |
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 |
import streamlit as st
import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt
#Fungsi untuk mengunduh data saham
def get_stock_data(tickers, start, end): data = yf.download(tickers, start=start, end=end)['Adj Close'] return data
#Fungsi untuk menghitung portofolio optimal
def optimize_portfolio(data): returns = data.pct_change().dropna() mean_returns = returns.mean() cov_matrix = returns.cov() num_assets = len(data.columns) num_portfolios = 10000
results = np.zeros((3, num_portfolios))
weights_record = []
for i in range(num_portfolios):
weights = np.random.random(num_assets)
weights /= np.sum(weights)
weights_record.append(weights)
portfolio_return = np.sum(weights * mean_returns)
portfolio_stddev = np.sqrt(np.dot(weights.T, np.dot(cov_matrix, weights)))
sharpe_ratio = portfolio_return / portfolio_stddev
results[0, i] = portfolio_return
results[1, i] = portfolio_stddev
results[2, i] = sharpe_ratio
max_sharpe_idx = np.argmax(results[2])
optimal_weights = weights_record[max_sharpe_idx]
optimal_portfolio = {data.columns[i]: optimal_weights[i] for i in range(num_assets)}
return optimal_portfolio
Streamlit UI
st.title("Optimasi Portofolio dengan Model Markowitz")
tickers = st.text_input("Masukkan kode saham (pisahkan dengan koma):", "BBCA.JK, TLKM.JK, UNVR.JK") start_date = st.date_input("Pilih tanggal mulai", pd.to_datetime("2020-01-01")) end_date = st.date_input("Pilih tanggal akhir", pd.to_datetime("2020-12-31"))
if st.button("Optimasi Portofolio"): tickers_list = [ticker.strip() for ticker in tickers.split(",")] data = get_stock_data(tickers_list, start_date, end_date) optimal_portfolio = optimize_portfolio(data)
st.subheader("Bobot Optimal Portofolio")
st.write(pd.DataFrame(optimal_portfolio.items(), columns=["Saham", "Bobot"]))
fig, ax = plt.subplots()
ax.pie(optimal_portfolio.values(), labels=optimal_portfolio.keys(), autopct='%1.1f%%', startangle=140)
ax.axis('equal')
st.pyplot(fig)
|