Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import os
- import pandas as pd
- import numpy as np
- import matplotlib.pyplot as plt
- import portfolioopt as pfopt
- tickers = [f for f in os.listdir(r'C:\Users\Badaboom\Desktop\LABA\Data') if os.path.isfile(os.path.join(r'C:\Users\Badaboom\Desktop\LABA\Data', f))]
- #запись названий файлов в список tickers (название файла: тикер.csv) Получили: tickers = ['ADBE.csv','AA.csv',...]
- table = list() #table - список из таблиц компаний
- for i in tickers:
- table.append(pd.read_csv(r'C:\Users\Badaboom\Desktop\LABA\Data\{}'.format(i), delimiter = ','))
- #каждый i элемент списка table содержит таблицу котировок i-ого тикера из списка tickers
- for i in range(len(tickers)): #названия файлов без .csv - котировки
- tickers[i] = tickers[i][0:-4] #Получили: tickers = ['ADBE','AA',...]
- for i in table: #преобразование стринг даты в dateformat для всех таблиц с данными
- i['Date'] = i['Date'].astype('datetime64[ns]')
- #############################################################################################################################################
- Adj_close = pd.DataFrame(columns = ['Date'] + tickers) #таблица цен акций за весь период для каждой компании
- Adj_close['Date']=table[0]['Date'] #заполнили столбец Date в Adj_close датой
- for i in range(len(table)):
- Adj_close[tickers[i]] = table[i]['Adj Close'] #заполнили таблицу Adj_close значениями цен акций по компаниям
- log_doxod = pd.DataFrame(columns = ['Date'] + tickers) #таблица дневных лог.доходностей за весь период по компаниям
- log_doxod['Date']=table[0]['Date']
- for i in range(len(table)):
- log_doxod[tickers[i]] = np.log((table[i]['Adj Close']) / (table[i]['Adj Close']).shift(1))
- log_doxod = log_doxod[1:] #убрали пустое значение доходности, которое появилось при подсчете лог. доходности для первого дня периода
- avg_ret = list() #список из средних доходностей за каждый год (2003 - 2017) - 15 лет
- cov_matrix = list() #список из ковариационных матриц доходностей за каждый год (15 штук)
- returns = list() #список из 15 таблиц лог.доходности для каждого года по компаниям
- for i in range(2003,2018):
- mask = log_doxod['Date'].dt.year == pd.to_datetime('{}'.format(i)).year #маска для каждого года
- CV = log_doxod.loc[mask].cov() #ковар. матрица для каждого года
- cov_matrix.append(CV)
- RET = log_doxod.loc[mask].mean() #ср. значение лог доходности по годам
- avg_ret.append(RET)
- r = log_doxod.loc[mask][tickers]
- returns.append(r)
- def print_portfolio_info(returns, avg_rets, weights): #weights - доли акций в портфеле
- ret = (weights * avg_rets).sum()
- std = (weights * returns).sum(1).std() #std - отклонение
- sharpe = ret / std
- print("Доли портфеля:\n{}\n".format(weights))
- print("Ожидаемая доходность: {}".format(ret))
- print("Ожидаемый риск: {}".format(std))
- print("Коэффициент Шарпа: {}".format(sharpe))
- for i in range(15):
- weights = pfopt.min_var_portfolio(cov_matrix[i], allow_short=True) #на семинаре было allow_short=False, поэтому не оказалось отриц. долей
- print('Портфель минимального риска за ',i+2003,' год')
- print_portfolio_info(returns[i],avg_ret[i],weights)
- print('\n\n')
- final = pd.DataFrame(index = range(2004,2019)) #таблица Год - доходность прошлогоднего портфеля
- mem = list()
- for i in range(15):
- weights = pfopt.min_var_portfolio(cov_matrix[i])
- ret = (weights * avg_ret[i]).sum()
- mem.append(ret)
- final['Доходность прошлогоднего портфеля'] = mem
- plt.figure(figsize=(10,10))
- plt.ylabel('Доходность прошлогоднего портфеля')
- plt.xlabel('Год')
- plt.plot(final)
- plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement