Advertisement
Guest User

Untitled

a guest
Apr 20th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.46 KB | None | 0 0
  1. import os
  2. import pandas as pd
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. import portfolioopt as pfopt
  6. 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))]
  7. #запись названий файлов в список tickers (название файла: тикер.csv) Получили: tickers = ['ADBE.csv','AA.csv',...]
  8. table = list() #table - список из таблиц компаний
  9. for i in tickers:
  10. table.append(pd.read_csv(r'C:\Users\Badaboom\Desktop\LABA\Data\{}'.format(i), delimiter = ','))
  11. #каждый i элемент списка table содержит таблицу котировок i-ого тикера из списка tickers
  12.  
  13. for i in range(len(tickers)): #названия файлов без .csv - котировки
  14. tickers[i] = tickers[i][0:-4] #Получили: tickers = ['ADBE','AA',...]
  15.  
  16. for i in table: #преобразование стринг даты в dateformat для всех таблиц с данными
  17. i['Date'] = i['Date'].astype('datetime64[ns]')
  18. #############################################################################################################################################
  19. Adj_close = pd.DataFrame(columns = ['Date'] + tickers) #таблица цен акций за весь период для каждой компании
  20. Adj_close['Date']=table[0]['Date'] #заполнили столбец Date в Adj_close датой
  21. for i in range(len(table)):
  22. Adj_close[tickers[i]] = table[i]['Adj Close'] #заполнили таблицу Adj_close значениями цен акций по компаниям
  23.  
  24. log_doxod = pd.DataFrame(columns = ['Date'] + tickers) #таблица дневных лог.доходностей за весь период по компаниям
  25. log_doxod['Date']=table[0]['Date']
  26. for i in range(len(table)):
  27. log_doxod[tickers[i]] = np.log((table[i]['Adj Close']) / (table[i]['Adj Close']).shift(1))
  28. log_doxod = log_doxod[1:] #убрали пустое значение доходности, которое появилось при подсчете лог. доходности для первого дня периода
  29. avg_ret = list() #список из средних доходностей за каждый год (2003 - 2017) - 15 лет
  30. cov_matrix = list() #список из ковариационных матриц доходностей за каждый год (15 штук)
  31. returns = list() #список из 15 таблиц лог.доходности для каждого года по компаниям
  32. for i in range(2003,2018):
  33. mask = log_doxod['Date'].dt.year == pd.to_datetime('{}'.format(i)).year #маска для каждого года
  34. CV = log_doxod.loc[mask].cov() #ковар. матрица для каждого года
  35. cov_matrix.append(CV)
  36. RET = log_doxod.loc[mask].mean() #ср. значение лог доходности по годам
  37. avg_ret.append(RET)
  38. r = log_doxod.loc[mask][tickers]
  39. returns.append(r)
  40. def print_portfolio_info(returns, avg_rets, weights): #weights - доли акций в портфеле
  41. ret = (weights * avg_rets).sum()
  42. std = (weights * returns).sum(1).std() #std - отклонение
  43. sharpe = ret / std
  44. print("Доли портфеля:\n{}\n".format(weights))
  45. print("Ожидаемая доходность: {}".format(ret))
  46. print("Ожидаемый риск: {}".format(std))
  47. print("Коэффициент Шарпа: {}".format(sharpe))
  48.  
  49. for i in range(15):
  50. weights = pfopt.min_var_portfolio(cov_matrix[i], allow_short=True) #на семинаре было allow_short=False, поэтому не оказалось отриц. долей
  51. print('Портфель минимального риска за ',i+2003,' год')
  52. print_portfolio_info(returns[i],avg_ret[i],weights)
  53. print('\n\n')
  54.  
  55. final = pd.DataFrame(index = range(2004,2019)) #таблица Год - доходность прошлогоднего портфеля
  56. mem = list()
  57. for i in range(15):
  58. weights = pfopt.min_var_portfolio(cov_matrix[i])
  59. ret = (weights * avg_ret[i]).sum()
  60. mem.append(ret)
  61. final['Доходность прошлогоднего портфеля'] = mem
  62.  
  63. plt.figure(figsize=(10,10))
  64. plt.ylabel('Доходность прошлогоднего портфеля')
  65. plt.xlabel('Год')
  66. plt.plot(final)
  67. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement