Reducerea indicelui compozit NYSE

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe R – datawookieși cu amabilitate a contribuit la R-bloggeri). (Puteți raporta problema legată de conținutul acestei pagini aici)


Doriți să vă distribuiți conținutul pe R-bloggeri? dați clic aici dacă aveți un blog, sau aici dacă nu aveți.

Pentru un proiect secundar, trebuia să răzuiesc datele pentru indicele compus NYSE, care se întorc cât mai mult posibil.

Cea mai convenabilă sursă de date este pe Yahoo! Finanţa.

Ce este indicele compus NYSE?

Indicele NYSE Composite este un indice care include toate acțiunile ordinare listate la Bursa de Valori din New York. Contribuția fiecărei acțiuni la indice (ponderea acestuia) este determinată de capitalizarea de piață a acestuia (valoarea acțiunilor disponibile pentru tranzacționare publică).

Răzuire

M-am gândit să fac răzuirea fie cu R, fie cu Python. După ce am analizat structura site-ului și datele tabulate, am decis să merg cu R.

Biblioteci

Începeți prin a încărca câteva biblioteci indispensabile.

library(httr2)
library(rvest)
library(dplyr)
library(readr)
library(janitor)

Ce scop servesc acestea?

  • httr2 — solicitări HTTP (recuperează conținutul HTML al paginii web);
  • rvest — analiza HTML (extragerea conținutului din HTML);
  • dplyr — manipularea datelor;
  • readr — pentru parse_number() funcționalitate și scriere CSV simplă; şi
  • janitor — curățarea numelor de coloane.

Parametrii de interogare

Există doi parametri de interogare, period1 şi period2 care determină durata datelor returnate. Acestea ar trebui să fie setate la valori integrale, în special numărul de secunde de la epoca UNIX. Le-am putea codifica pe acestea, dar prefer să le generez dinamic.

Iată cum facem asta pentru data de începere (31 decembrie 1965):

as.integer(as.POSIXct("1965-12-31"))

(1) -126316800

_ Valoarea este negativă deoarece data respectivă este înainte epoca UNIX (1 ianuarie 1970).

Creați o listă cu valorile parametrilor corespunzătoare.

params <- list(
  period1 = as.integer(as.POSIXct("1965-12-31")),
  period2 = as.integer(Sys.time())
)

Este necesar un singur antet obligatoriu, care este șirul User Agent.

headers <- list(
  "User-Agent" = "Mozilla/5.0 (X11; Linux x86_64)"
)

Există, de asemenea, o serie de cookie-uri, dintre care doar unul pare a fi important. Conținutul acelui cookie pare să evolueze în timp, așa că va necesita reîmprospătare.

Cerere

Acum avem toate premisele la locul lor. Voi stoca adresa URL într-o variabilă, mai degrabă decât codificarea tare în cerere.

URL <- "https://finance.yahoo.com/quote/^NYA/history/"

Acum construiți cererea folosind {httr2}. Abordarea modulară a acestui lucru este foarte bună. Despachetați listele ca parametri ai funcției folosind !!! (bang-bang-bang), care, în beneficiul Pythonistilor, este echivalentă cu utilizarea ** pe un dicționar.

response <- request(URL) |>
  req_url_query(!!!params) |>
  req_cookies_set(!!!cookies) |>
  req_headers(!!!headers) |>
  req_perform()

Parse & Wrangle

Apoi luăm obiectul răspuns și extragem corpul HTML. Apoi un pic de răzuire rapidă pe web (folosind html_element() şi html_table() pentru a localiza

and transform its content into a data frame).

The resulting column names are not to my liking. A combination of clean_names() urmat de unele redenumiri specifice face trucul totuși.

În sfârșit, o mutație pentru a curăța datele:

  • convertiți datele în format standard (nu există o lume în care luni, zi, an să aibă sens!);
  • mâner lipsă volume valori;
  • utilizați parse_number() funcție de analizare a numerelor (se ocupă de virgule); şi
  • cântare volume cu 1000 (deoarece toate valorile se termină în „000”).
table <- response |> 
  resp_body_html() |>
  html_element("table") |>
  html_table() |>
  clean_names() |>
  rename_with(~ gsub("_adjusted.*", "", .x)) |>
  rename(
    close = close_close_price
  ) |>
  mutate(
    date = as.Date(strptime(date, "%b %d, %Y")),
    volume = ifelse(volume == "-", NA, volume),
    across(.cols = -date, .fns = ~ parse_number(.)),
    across(.cols = open:close_adj, .fns = ~ sprintf("%.2f", .)),
    volume = volume / 1000
  ) %>%
  arrange(date)

Să aruncăm o privire asupra roadelor acestei eforturi. Cele mai vechi date nu au valori pentru volume.

head(table)

  date       open   high   low    close  adj_close volume
                     
1 1965-12-31 528.69 528.69 528.69 528.69 528.69        NA
2 1966-01-03 527.21 527.21 527.21 527.21 527.21        NA
3 1966-01-04 527.84 527.84 527.84 527.84 527.84        NA
4 1966-01-05 531.12 531.12 531.12 531.12 531.12        NA
5 1966-01-06 532.07 532.07 532.07 532.07 532.07        NA
6 1966-01-07 532.60 532.60 532.60 532.60 532.60        NA

Noile date sunt complete și actualizate.

tail(table, 10)

   date       open     high     low      close    adj_close  volume
                               
 1 2024-10-14 19711.22 19834.18 19690.54 19814.55 19814.55  3005250
 2 2024-10-15 19814.55 19814.55 19669.80 19678.71 19678.71  3882120
 3 2024-10-16 19678.71 19838.29 19678.71 19825.49 19825.49  3467230
 4 2024-10-17 19825.49 19901.49 19825.49 19855.26 19855.26  3480010
 5 2024-10-18 19855.26 19905.65 19808.99 19884.81 19884.81  3374490
 6 2024-10-21 19884.81 19884.81 19690.32 19720.32 19720.32  3407010
 7 2024-10-22 19720.32 19720.32 19579.84 19664.58 19664.58  3342080
 8 2024-10-23 19653.36 19653.36 19493.42 19594.24 19594.24  3532650
 9 2024-10-24 19594.24 19620.02 19496.22 19560.73 19560.73  3543030
10 2024-10-25 19560.73 19648.74 19438.80 19456.27 19456.27  3501280

Persista

Salvați-l într-un fișier CSV.

write_csv(table, "nyse-composite.csv")

Puteți prelua fișierul CSV de aici (neactualizat).

Vizualizați

În cele din urmă, să creăm o vizualizare rapidă a datelor, doar pentru a ne asigura că par legitime.

Iată graficul corespunzător pentru ultimul deceniu de la Google Finance. Linia întreruptă verticală din graficul de mai sus indică data inițială (3 ianuarie 2003) în graficul de mai jos.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.