środa, 14 lutego 2024

Stopa zwrotu - zwrot portfolio (normalizacja)

Ten post jest kontynuacją serii o stopie zwrotu: https://kamilkondrat.blogspot.com/2024/02/stopa-zwrotu-logarytmiczna-stopa-zwrotu.html

Ta praca odzwierciedla zainteresowanie autora analizą finansową i wykorzystaniem narzędzi informatycznych w jej realizacji. Niniejszy blog nie ma na celu dostarczania porad finansowych, lecz stanowi konstruktywne podejście autora do dzielenia się wiedzą. Autor widzi w tym sposobność do rozwijania swoich umiejętności i zachęcania do wzajemnej dyskusji. Należy pamiętać, że wnioski wynikające z analiz prezentowanych na tym blogu nie powinny być bezpośrednio stosowane do podejmowania decyzji finansowych. Nawet jeśli analizy są dokładne, stanowią one tylko fragment potrzebnych informacji do podjęcia w pełni świadomej decyzji. Brak szerszego kontekstu, w którym znajduje się potencjalny inwestor lub decydent, może prowadzić do niepełnych wniosków.

Zacznijmy od importu interesujących nas modułów. To wszystko już miało okazję pojawić się w poprzednich postach.

import pandas as pd
import numpy as np
import yfinance as yf
import matplotlib.pyplot as plt

Uruchomienie tej komórki bez żadnych błędów oznacza, że mamy już zainstalowane te moduły, a ich z importowanie przebiegło pomyślnie.

tickers = ['MSFT','GOOGL','NVDA']

Tworzę listę z trzema spółkami. Angielskie "tickers", w kontekście tego co robimy, znaczy to samo co unikalne symbole giełdowe. Te powyżej to Microsoft, holding Alphabet (właściciel Google), NVidia, a tak sobie je wybrałem.

df = yf.download(tickers, period = "5y")

Pobieramy dane giełdowe z ostatnich 5 lat dla tych trzech spółek.

Zastosujemy normalizację do 100. Proces ten polega na skalowaniu serii danych cenowych w taki sposób, by punkt startowy każdej serii był równy 100, co umożliwia łatwe porównywanie procentowych zmian wartości różnych aktywów, niezależnie od ich początkowej wartości.

Przeprowadzenie tego zaczyna się od ustalenia punktu startowego, który jest punktem w czasie, od którego rozpoczyna się analiza i ustawia się dla niego wartość normalizowaną na 100. Następnie, dla każdego kolejnego punktu w czasie, oblicza się wartość normalizowaną, dzieląc bieżącą cenę przez cenę w punkcie startowym i mnożąc wynik przez 100.

Oczywiście normalizację można zastosować dla wartości 14, 57, 256, albo 1570. Tylko takie obliczanie dają w rezultacie mało intuicyjny kontekst i trudniej odnieść je do zmiany procentowej.

Przejdźmy do Pythona. Python w Jupyter to moje standardowe środowisko pracy. Potrzebujemy cen aktywów. Wykorzystamy do tego cenę zamknięcia z naszej ramki danych.

df_adj_close = df['Adj Close']

Stworzyliśmy sobie zmienną "df_adj_close", która zawiera wszystkie wiersze z kolumny z cenami zamknięcia. Punktem startowym dla przeprowadzenia naszej normalizacji będzie pierwszy wiersz naszych danych. Wybierzemy ją korzystając z funkcji "iloc[0]"; iloc czyli "index location", innymi słowy: "Daj mi wartość wiersza o numerze indeksu równym zero." Korzystamy przy tym z biblioteki "pandas" dlatego też korzystamy z gotowych funkcji dostosowanych do pracy z obiektami pandas jak ramka danych, którym jest nasza własna ramka danych i należące do niej kolumny.

df_adj_close_norm = (df_adj_close / df_adj_close.iloc[0]) * 100

I dzięki powyższej linijce kodu mamy wyliczone znormalizowane ceny zamknięcia do 100 dla każdego dnia. Proponuję wyświetlić zawartość naszych obliczeń używając kodu poniżej. Można m.in. odczytać, że wartość akcji Nvidii w ciągu 5 lat wzrosły 19-krotnie!

df_adj_close_norm

To jeszcze nie jest finalny rezultat naszej analizy, którym ma być zwrot całego portfela. Niech to będzie wisienką na naszym ciasteczku, którą zafundujemy sobie w następnym wpisie. Przy okazji rozwinę to o kilka niuansów.

Brak komentarzy:

Prześlij komentarz

Analiza sentymentów - wpisy na mediach społecznościowych (podział danych)

Ten wpis zaczniemy od stworzenia DataFrame z danymi treningowymi train_df = pd.read_csv('train.csv', encoding='ISO-8859-1')....