Înțelegerea analizei cozii în piețele financiare

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

(Acest articol a fost publicat pentru prima dată pe DataGeeekș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.

Pe piețele financiare, distingând între mișcări conduse de informații şi șocuri determinate de lichiditate este critic. Studiul de referință ne-am bazat munca pe subliniază importanța analiza cozii: compararea distribuțiilor gaussiene (coadă subțire) și Student-t (coadă grăsă) pentru a înțelege dacă este mai probabil ca schimbările de preț să reflecte informații autentice sau dezechilibre temporare de lichiditate.

Randamentele financiare sunt rareori la fel de bine comportate pe cât presupune distribuția gaussiană (normală). În teorie, mișcările extreme ale prețurilor ar trebui să fie extrem de rare sub un model gaussian cu coadă subțire. Cu toate acestea, în practică, piețele expun frecvent cozi grase: sărituri mari, accidente și vârfuri care apar mult mai des decât prezice teoria Gaussiană.

Această discrepanță motivează analiza cozii— o abordare statistică care compară cât de bine explică distribuțiile diferite datele observate. Doi candidați comuni sunt:

  • Distribuție gaussiană (cozi subțiri): Dacă randamentele se potrivesc mai bine acestui model, mișcările extreme sunt interpretate ca bazată pe informații. Cu alte cuvinte, noi informații au intrat pe piață și este mai probabil ca schimbările de preț să reflecte schimbări reale ale fundamentelor sau așteptărilor.
  • Distribuția student-t (cozi grase): Dacă retururile se potrivesc mai bine cu acest model, se iau în considerare mișcările extreme condus de lichiditate. Aceste șocuri apar adesea din dezechilibre temporare ale fluxului de ordine sau constrângeri de lichiditate, iar prețurile tind să revină odată ce dezechilibrul se diminuează.

Comparând log-probabilitățile potrivirilor Gaussian și Student-t, putem clasifica comportamentul pieței în aceste două regimuri. Această clasificare nu este doar academică: îi ajută pe comercianți, managerii de risc și analiștii să facă distincția între continuarea tendinței (condus pe informații) și inversare însemnătă (condus de lichiditate).

În fluxul nostru de lucru, aplicăm această analiză a cozii la futures pe aur (GC=F) în ultimele 15 zile de tranzacționare. Calculăm randamentele jurnal, ne potrivim ambelor distribuții și comparăm probabilitățile acestora. Apoi îmbogățim analiza cu a metrica impactului volumuluicare evidențiază dacă activitatea de tranzacționare anormală amplifică modificările de preț. În cele din urmă, prezentăm rezultatele într-un tabel de audit cu coduri de culori care face comportamentul cozii interpretabil vizual.

De ce aceste pachete R?

  • tidyverse: Oferă o gramatică consistentă pentru manipularea datelor (mutate, drop_na, select). Acesta asigură reproductibilitatea și lizibilitatea la transformarea datelor brute de piață în randamente de jurnal și valori derivate.
  • tidyquant: Unește sursele de date financiare cu ecosistemul ordonat. Îl folosim pentru a obține date futures pe aur (GC=F) direct de la Yahoo Finance, făcând fluxul de lucru autonom și ușor de extins la alte tickere.
  • MASA: Oferă instrumente statistice pentru montarea distribuției. Ne bazăm pe fitdistr() pentru a estima parametrii atât pentru distribuțiile Gauss, cât și pentru Student-t, permițând o comparație directă a log-probabilităților.
  • gt: Oferă randare profesională a meselor. Ne permite să formatăm numere, să aplicăm scale de culori și să evidențiem avertismentele de audit, transformând rezultatele statistice brute într-un tabel de audit interpretabil vizual.
library(tidyverse)   # Load tidyverse for data manipulation
library(tidyquant)   # Load tidyquant for financial data retrieval
library(MASS)        # Load MASS for distribution fitting
library(gt)          # Load gt for table rendering

ticker <- "GC=F"     # Define the ticker symbol (Gold Futures)
horizon <- 15        # Set horizon to last 15 days

# Fetch market data for the chosen ticker and horizon
market_data <- tq_get(ticker, from = Sys.Date() - horizon, to = Sys.Date())

# Compute log returns and drop missing values
market_tbl <- market_data %>%
  mutate(returns = log(adjusted) - log(lag(adjusted))) %>%
  drop_na()

# Gaussian fit
fit_gauss <- fitdistr(market_tbl$returns, densfun = "normal")

# Student-t fit
fit_t <- fitdistr(
  market_tbl$returns,
  densfun = function(x, df, mean, sd) dt((x - mean)/sd, df)/sd,
  start = list(df = 5, mean = mean(market_tbl$returns), sd = sd(market_tbl$returns))
)

# Compare log-likelihoods
ll_gauss <- fit_gauss$loglik
ll_t <- fit_t$loglik
signal <- if (ll_gauss > ll_t) "INFO-DRIVEN" else "LIQUIDITY-DRIVEN"

# Build audit table
audit_tbl <- market_tbl %>%
  mutate(
    Gaussian_Density = dnorm(returns, mean = mean(returns), sd = sd(returns)),
    StudentT_Density = dt((returns - mean(returns))/sd(returns), df = 5)/sd(returns),
    Volume_Impact = abs(volume)^ifelse(signal == "INFO-DRIVEN", 1.0, 0.6),
    Audit_Warning = signal
  ) %>%
  dplyr::select(Date = date,
                Price = adjusted,
                Gaussian_Density,
                StudentT_Density,
                Volume_Impact,
                Audit_Warning)


#GT Table
audit_gt <- audit_tbl %>%
  gt() %>%
  tab_header(title = md("**Tail Analysis-Based Audit Table**")) %>%
  cols_label(
    Date = md("**Date**"),
    Price = md("**Price**"),
    Gaussian_Density = md("**Gaussian Density**"),
    StudentT_Density = md("**Student-t Density**"),
    Volume_Impact = md("**Volume Impact**"),
    Audit_Warning = md("**Audit Warning**")
  ) %>%
  fmt_number(columns = c(Price, Gaussian_Density, StudentT_Density, Volume_Impact),
             decimals = 2, use_seps = TRUE) %>%
  data_color(
    columns = c(Price),
    colors = scales::col_numeric(
      palette = c("lightgreen","darkgreen"),
      domain = range(audit_tbl$Price, na.rm = TRUE)
    )
  ) %>%
  data_color(
    columns = c(Gaussian_Density, StudentT_Density),
    colors = scales::col_numeric(
      palette = c("lightblue","darkblue"),
      domain = range(c(audit_tbl$Gaussian_Density,
                       audit_tbl$StudentT_Density), na.rm = TRUE)
    )
  ) %>%
  data_color(
    columns = c(Volume_Impact),
    colors = scales::col_numeric(
      palette = c("pink","red"),
      domain = c(min(audit_tbl$Volume_Impact, na.rm = TRUE),
                 max(audit_tbl$Volume_Impact, na.rm = TRUE))
    )
  ) %>%
  text_transform(
    locations = cells_body(columns = vars(Audit_Warning)),
    fn = function(x) {
      ifelse(x == "INFO-DRIVEN",
             "INFO-DRIVEN",
             "LIQUIDITY-DRIVEN")
    }
  )

audit_gt

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.