Workflow Analysis

getSymbols(c("AMZN", "GOOGL", "MSFT", "TSLA", "AAPL"),
           from = "2024-01-01",
           to = "2025-12-31")
[1] "AMZN"  "GOOGL" "MSFT"  "TSLA"  "AAPL" 
head(AMZN)
           AMZN.Open AMZN.High AMZN.Low AMZN.Close AMZN.Volume AMZN.Adjusted
2024-01-02    151.54    152.38   148.39     149.93    47339400        149.93
2024-01-03    149.20    151.05   148.33     148.47    49425500        148.47
2024-01-04    145.59    147.38   144.05     144.57    56039800        144.57
2024-01-05    144.69    146.59   144.53     145.24    45153100        145.24
2024-01-08    146.74    149.40   146.15     149.10    46757100        149.10
2024-01-09    148.33    151.71   148.21     151.37    43812600        151.37
head(GOOGL)
           GOOGL.Open GOOGL.High GOOGL.Low GOOGL.Close GOOGL.Volume
2024-01-02     138.55     139.45    136.48      138.17     23711200
2024-01-03     137.25     139.63    137.08      138.92     24212100
2024-01-04     138.42     139.16    136.35      136.39     27137700
2024-01-05     136.75     137.16    135.15      135.73     22513900
2024-01-08     136.29     139.01    136.26      138.84     21404000
2024-01-09     138.50     141.49    138.15      140.95     24759600
           GOOGL.Adjusted
2024-01-02       136.9556
2024-01-03       137.6990
2024-01-04       135.1912
2024-01-05       134.5370
2024-01-08       137.6197
2024-01-09       139.7112
head(AAPL)
           AAPL.Open AAPL.High AAPL.Low AAPL.Close AAPL.Volume AAPL.Adjusted
2024-01-02    187.15    188.44   183.89     185.64    82488700      183.5622
2024-01-03    184.22    185.88   183.43     184.25    58414500      182.1877
2024-01-04    182.15    183.09   180.88     181.91    71983600      179.8739
2024-01-05    181.99    182.76   180.17     181.18    62379700      179.1521
2024-01-08    182.09    185.60   181.50     185.56    59144500      183.4831
2024-01-09    183.92    185.15   182.73     185.14    42841800      183.0678
head(TSLA)
           TSLA.Open TSLA.High TSLA.Low TSLA.Close TSLA.Volume TSLA.Adjusted
2024-01-02    250.08    251.25   244.41     248.42   104654200        248.42
2024-01-03    244.98    245.68   236.32     238.45   121082600        238.45
2024-01-04    239.25    242.70   237.73     237.93   102629300        237.93
2024-01-05    236.86    240.12   234.90     237.49    92488900        237.49
2024-01-08    236.14    241.25   235.30     240.45    85166600        240.45
2024-01-09    238.11    238.96   232.04     234.96    96705700        234.96
head(MSFT)
           MSFT.Open MSFT.High MSFT.Low MSFT.Close MSFT.Volume MSFT.Adjusted
2024-01-02    373.86    375.90   366.77     370.87    25258600      363.8015
2024-01-03    369.01    373.26   368.51     370.60    23083500      363.5367
2024-01-04    370.67    373.10   367.17     367.94    20901500      360.9273
2024-01-05    368.97    372.06   366.50     367.75    21004600      360.7410
2024-01-08    369.30    375.20   369.01     374.69    23134000      367.5487
2024-01-09    372.01    375.99   371.19     375.79    20830000      368.6277
chartSeries(AMZN,
            theme = chartTheme("white"),
            name = "Amazon Stock Price")

chartSeries(GOOGL,
            theme = chartTheme("white"),
            name = "Google Stock Price")

chartSeries(AAPL,
            theme = chartTheme("white"),
            name = "Apple Stock Price")

chartSeries(TSLA,
            theme = ("white"),
            name = "Tesla Stock Price")

chartSeries(MSFT,
            theme = chartTheme("white"),
            name = "Microsoft Stock Price")

AMZN_close <- Cl(AMZN)
GOOGL_close <- Cl(GOOGL)
AAPL_close <- Cl(AAPL)
TSLA_close <- Cl(TSLA)
MSFT_close <- Cl(MSFT)
stocks <- data.frame(
    Date = index(AMZN_close),
    AMZN = as.numeric(AMZN_close),
    GOOGL = as.numeric(GOOGL_close),
    AAPL = as.numeric(AAPL_close),
    TSLA = as.numeric(TSLA_close),
    MSFT = as.numeric(MSFT_close)
)

head(stocks)
        Date   AMZN  GOOGL   AAPL   TSLA   MSFT
1 2024-01-02 149.93 138.17 185.64 248.42 370.87
2 2024-01-03 148.47 138.92 184.25 238.45 370.60
3 2024-01-04 144.57 136.39 181.91 237.93 367.94
4 2024-01-05 145.24 135.73 181.18 237.49 367.75
5 2024-01-08 149.10 138.84 185.56 240.45 374.69
6 2024-01-09 151.37 140.95 185.14 234.96 375.79
stocks_long <- stocks %>%
    pivot_longer(cols = c(AMZN, GOOGL, AAPL, TSLA, MSFT),
                 names_to = "Stock",
                 values_to = "Price")

ggplot(stocks_long, aes(x = Date, y = Price, color = Stock)) +
    geom_line(linewidth = 1) +
    labs(title = "Stock Price Comparison 2024-2025",
         x = "Date",
         y = "Closing Price  (USD)",
         color = "Company") +
    theme_minimal()

stocks <- stocks %>%
    mutate(
        AMZN_return = (AMZN / lag(AMZN) - 1) * 100,
        GOOGL_return = (AMZN / lag(GOOGL) - 1) * 100,
        AAPL_return = (AMZN / lag(AAPL) - 1) * 100,
        TSLA_return = (AMZN / lag(TSLA) - 1) * 100,
        MSFT_return = (AMZN / lag(MSFT) - 1) * 100,
    )

head(stocks)
        Date   AMZN  GOOGL   AAPL   TSLA   MSFT AMZN_return GOOGL_return
1 2024-01-02 149.93 138.17 185.64 248.42 370.87          NA           NA
2 2024-01-03 148.47 138.92 184.25 238.45 370.60  -0.9737821     7.454587
3 2024-01-04 144.57 136.39 181.91 237.93 367.94  -2.6267892     4.067096
4 2024-01-05 145.24 135.73 181.18 237.49 367.75   0.4634420     6.488750
5 2024-01-08 149.10 138.84 185.56 240.45 374.69   2.6576704     9.850446
6 2024-01-09 151.37 140.95 185.14 234.96 375.79   1.5224607     9.024776
  AAPL_return TSLA_return MSFT_return
1          NA          NA          NA
2   -20.02262   -40.23428   -59.96710
3   -21.53595   -39.37093   -60.99028
4   -20.15832   -38.95683   -60.52617
5   -17.70614   -37.21841   -59.45615
6   -18.42531   -37.04720   -59.60127
returns_long <- stocks %>%
    pivot_longer(cols = c(AMZN_return, GOOGL_return, AAPL_return, TSLA_return, MSFT_return),
                 names_to = "Stock",
                 values_to = "Return") %>%
    na.omit()
    
ggplot(returns_long, aes(x = Date, y = Return, color = Stock)) +
    geom_line(alpha = 0.9) +
    labs(title = "Daily Returns Comparison 2024-2025",
         x = "Date",
         y = "Daily Return (%)",
         color = "Company") +
    theme_minimal() +
    geom_hline(yintercept = 0, linetype = "dashed", color = "black")

stocks %>%
    summarise(
        AMZN_avg_return = mean(AMZN_return, na.rm = TRUE),
        GOOGL_avg_return = mean(GOOGL_return, na.rm = TRUE),
        AAPL_avg_return = mean(AAPL_return, na.rm = TRUE),
        TSLA_avg_return = mean(TSLA_return, na.rm = TRUE),
        MSFT_avg_return = mean(MSFT_return, na.rm = TRUE),
        AMZN_risk = sd(AMZN_return, na.rm = TRUE),
        GOOGL_risk = sd(GOOGL_return, na.rm = TRUE),
        AAPL_risk = sd(AAPL_return, na.rm = TRUE),
        TSLA_risk = sd(TSLA_return, na.rm = TRUE),
        MSFT_risk = sd(MSFT_return, na.rm = TRUE),
    )
  AMZN_avg_return GOOGL_avg_return AAPL_avg_return TSLA_avg_return
1        0.107299         10.44856        -7.76617       -26.12453
  MSFT_avg_return AMZN_risk GOOGL_risk AAPL_risk TSLA_risk MSFT_risk
1       -54.45004  1.979723    14.0167  9.181396  17.65465   3.94942
summary_stats <- data.frame(
    Stock = c("AMZN", "GOOGL", "AAPL", "TSLA", "MSFT"),
    Avg_Return = c(
        mean(stocks$AMZN_return, na.rm = TRUE),
        mean(stocks$GOOGL_return, na.rm = TRUE),
        mean(stocks$AAPL_return, na.rm = TRUE),
        mean(stocks$TSLA_return, na.rm = TRUE),
        mean(stocks$MSFT_return, na.rm = TRUE)
    ),
    Risk = c(
        sd(stocks$AMZN_return, na.rm = TRUE),
        sd(stocks$GOOGL_return, na.rm = TRUE),
        sd(stocks$AAPL_return, na.rm = TRUE),
        sd(stocks$TSLA_return, na.rm = TRUE),
        sd(stocks$MSFT_return, na.rm = TRUE)
    )
)

print(summary_stats)
  Stock Avg_Return      Risk
1  AMZN   0.107299  1.979723
2 GOOGL  10.448562 14.016704
3  AAPL  -7.766170  9.181396
4  TSLA -26.124526 17.654649
5  MSFT -54.450041  3.949420
ggplot(summary_stats, aes(x = Risk, y = Avg_Return, label = Stock)) +
    geom_point(aes(color = Stock), size = 4) +
    geom_text(vjust = -1, fontface = "bold") +
    labs(title = "Risk vs Return (2024-2025)",
         x = "Risk (Standard Deviation %)",
         y = "Average Daily Return (%)") +
    theme_minimal()