Блог им. AlekseyManin

Купил и держи. Сравнение.

В продолжение предыдущей публикации, сделал графики на которых можно сравнить доходы по разным бумагам.

Интерпретацию результатов описал в предыдущей публикации. 

Особенность получающегося графика — это коряво выглядит ось Х(годы начала инвестирования), пришлось отказаться от строкового формата, ради смещения новых столбиков.

SPY, BRK-B, IJH, QQQ AAPL, BRK-B, IJH, QQQ AAPL, MSFT, NVDA, GOOGL

Кому нужен код:

from datetime import date<br /><br />import numpy as np<br />import pandas as pd<br />import yfinance as yf<br />import matplotlib.pyplot as plt<br /><br /><br />class Bar:<br />    def __init__(self):<br />        self.year = 0<br />        self.month = 0<br />        self.day = 0<br />        self.open = 0<br />        self.high = 0<br />        self.low = 0<br />        self.close = 0<br /><br /><br />def run(df, start_date, end_date, increment, date_increment, fees):<br />    """ Основная функция """<br />    df = df[start_date:end_date]<br />    cur_bar = Bar()<br />    prev_bar = Bar()<br />    increment_is_completed = False  # Приращение депо в этом месяце (False-не было, True-было)<br />    depo = 0  # Брокерский счет в валюте<br />    sum_depo = 0  # Общая сумма инвестирования (переведено на брокерский счет)<br />    portfolio = 0  # Количество бумаг<br /><br />    # Перебор строк DF, как приход нового бара<br />    for row in df.itertuples():  # Перебор строк DF<br />        cur_bar.day = date.timetuple(row[0])[2]<br />        cur_bar.month = date.timetuple(row[0])[1]<br />        cur_bar.year = date.timetuple(row[0])[0]<br />        cur_bar.open = row[1]<br />        cur_bar.high = row[2]<br />        cur_bar.low = row[3]<br />        cur_bar.close = row[4]<br /><br />        if cur_bar.month != prev_bar.month:  # Если месяц предыдущего бара не равен месяцу текущего бара<br />            increment_is_completed = False<br />        elif cur_bar.month == prev_bar.month and not increment_is_completed and cur_bar.day >= date_increment:<br />            depo += increment<br />            sum_depo += increment<br />            increment_is_completed = True<br /><br />        while cur_bar.open + cur_bar.open * fees < depo:<br />            depo -= cur_bar.open + cur_bar.open * fees<br />            portfolio += 1<br /><br />        prev_bar.day = cur_bar.day<br />        prev_bar.month = cur_bar.month<br />        prev_bar.year = cur_bar.year<br />        prev_bar.open = cur_bar.open<br />        prev_bar.high = cur_bar.high<br />        prev_bar.low = cur_bar.low<br />        prev_bar.close = cur_bar.close<br /><br />    return sum_depo, portfolio * cur_bar.close, depo, portfolio, cur_bar.close<br /><br /><br />if __name__ == '__main__':<br />    # BRK-B IJH SPY AAPL<br />    df_rez = pd.DataFrame()<br />    # ticker_lst = ['AAPL', 'SPY', 'BRK-B', 'IJH']  # Тикер финансовых инструментов как он отображается на Yahoo Finance<br />    # ticker_lst = ['AAPL', 'BRK-B', 'IJH', 'QQQ']  # Тикер финансовых инструментов как он отображается на Yahoo Finance<br />    ticker_lst = ['AAPL', 'MSFT', 'NVDA', 'GOOGL']  # Тикер финансовых инструментов как он отображается на Yahoo Finance<br />    increment: int = 100  # Сумма ежемесячного инвестирования<br />    date_increment: int = 15  # Дата пополнения(число месяца)<br />    year_invest: int = 10  # Количество лет инвестирования<br />    fees = 0.0006  # 0.05% комиссия брокера ВТБ + 0.01% комиссия биржи<br />    for ticker in ticker_lst:<br />        df_ticker = yf.download(ticker)  # Загрузка данных с Yahoo Finance<br />        df_ticker = df_ticker.drop(columns=['Adj Close', 'Volume'])  # Удаляем ненужные колонки<br /><br />        df_rez_ticker = pd.DataFrame()<br /><br />        for year in range(1993, 2022):<br />            start_date: date = date(year, 1, 1)  # Дата старта инвестирования(год, месяц, число)<br />            end_date = date(start_date.year + year_invest, start_date.month, start_date.day)<br /><br />            rez = run(df_ticker, start_date, end_date, increment, date_increment, fees)<br /><br />            dohod = round(rez[1] - rez[0] + rez[2], 2)<br /><br />            new_row = {'Год начала': int(year), f'Доход {ticker}': dohod}<br />            df_rez_ticker = df_rez_ticker.append(new_row, ignore_index=True)<br /><br />        if len(df_rez) == 0:<br />            df_rez = df_rez_ticker<br />        else:<br />            df_rez = pd.merge(df_rez, df_rez_ticker)<br /><br />    df_change_type = df_rez.astype({'Год начала': np.int64})  # Изменение типа, для печати без дробной части<br />    print(df_change_type)  # Печать результирующей таблицы<br /><br />    index = df_rez['Год начала']<br />    values0 = df_rez[f'Доход {ticker_lst[0]}']<br />    values1 = df_rez[f'Доход {ticker_lst[1]}']<br />    values2 = df_rez[f'Доход {ticker_lst[2]}']<br />    values3 = df_rez[f'Доход {ticker_lst[3]}']<br />    bw = 0.2<br />    plt.title(f'Доход за {year_invest} лет ежемесячного инвестирования по ${increment}')<br />    plt.bar(index - 0.4, values0, bw, label=f'Доход {ticker_lst[0]}')<br />    plt.bar(index - 0.2, values1, bw, label=f'Доход {ticker_lst[1]}')<br />    plt.bar(index, values2, bw, label=f'Доход {ticker_lst[2]}')<br />    plt.bar(index + 0.2, values3, bw, label=f'Доход {ticker_lst[3]}')<br />    plt.xticks(index, df_rez['Год начала'].apply(int), rotation=45)  # Подписи к оси Х переведены в int и повернуты<br />    plt.xlabel("Год начала инвестирования")<br />    plt.ylabel("Доход в $")<br />    plt.legend(loc=2)<br />    plt.show()
813 | ★1
6 комментариев
Вот поверни лейблы тиков по x:

plt.setp(
    ax.xaxis.get_majorticklabels(),
    ha=«right»,
    rotation=45,
    rotation_mode=«anchor»);


avatar
Ëжик, спасибо!
И что вам показывает этот анализ? Как вы поймете, что в 96-м нужно было вкладывать в appl, в 2006 переложиться в NVDA, а в 2017 переложиться наверное в TSLA??
Во что переложиться в 2022 году, чтобы оказаться в лучшем столбце?
avatar
NeHonduras, я бы в таком ключе не рассматривал этот анализ. Как говориться: «Не клади все яйца в одну корзину».

Читайте на SMART-LAB:
Рубль под давлением: какие активы под угрозой?
Ставка падает, рубль слабеет — это новая экономическая реальность или временный эффект? Разбираем, что на самом деле происходит с бюджетом и...
Фото
Акции RENI в списке ТОП-10 лучших дивидендных акций, по мнению УК ««ДОХОДЪ»
По сообщениям СМИ, акции Группы Ренессанс страхование (RENI) вошли в подборку Управляющей компании ««ДОХОДЪ» ТОП-10 лучших дивидендных акций с...
Акции газовой отрасли РФ растут на фоне дефицита СПГ
Сегодня на фоне слабого роста российского фондового рынка динамику намного лучше рынка демонстрируют акции газовой отрасли. Так, акции Газпрома...
Фото
X5 МСФО 2025 г. - капзатрат меньше, дивиденд больше?
Компания X5 опубликовала финансовые результаты за 2025 год. Выручка прибавила +18,8% до 4,6 трлн руб., в 4-м квартале рост на 14,9% до 1,24...

теги блога Алексей Манин

....все тэги



UPDONW
Новый дизайн