#Trevor Taylor Mutual Fund Analysis Personal Project

# cran mirror
options(repos = c(CRAN = "https://cloud.r-project.org"))


# libraries
install.packages("dplyr")
## package 'dplyr' successfully unpacked and MD5 sums checked
## Warning: cannot remove prior installation of package 'dplyr'
## Warning in file.copy(savedcopy, lib, recursive = TRUE): problem copying
## C:\Program Files\R\R-4.4.2\library\00LOCK\dplyr\libs\x64\dplyr.dll to
## C:\Program Files\R\R-4.4.2\library\dplyr\libs\x64\dplyr.dll: Permission denied
## Warning: restored 'dplyr'
## 
## The downloaded binary packages are in
##  C:\Users\trevo\AppData\Local\Temp\RtmpG8HAik\downloaded_packages
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
# read  CSV file
data <- read.csv("ALL-F1.8.25.CSV", stringsAsFactors = FALSE)

# ClEANING DATA
data <- data %>% 
  mutate(across(everything(), ~ replace(., . == "-9999.99%", NA)))
data <- data %>% 
  mutate(across(everything(), ~ replace(., . == "9999.99%", NA)))
head(data)
##     Num Symbl               Name.1.of..19790.selected Return.12.31.24.01.08.25
## 1 13655  VOLT          Tema Electrification ETF\\Disc                    0.00%
## 2 19576   AVL      Direxion Daily AVGO Bull 2X Shares                   -2.56%
## 3 19598  AVGX  Defiance Daily Target 2X Long AVGO ETF                   -2.78%
## 4   584  BOIL  ProShares Ultra Blmbrg Natural Gas ETF                    2.71%
## 5  2088  ETHD          Proshares UltraShort Ether ETF                    1.48%
## 6 12951   ETQ T-REX 2X Inverse Ether Daily Target ETF                    0.00%
##   AnnualBP    CP DaysBP X1_Month.Return.12.06.2024.01.08.2025
## 1    0.00% 17.00      5                               183.81%
## 2  -72.93% 33.88      5                                50.98%
## 3  -75.80% 31.52      5                                49.18%
## 4  283.92% 57.33      5                                46.36%
## 5  109.60% 22.64      5                                40.97%
## 6    0.00%  9.81      5                                35.95%
##   X1_Quarter.Return.10.08.2024.01.08.2025 X6_Month.Return.07.08.2024.01.08.2025
## 1                                 183.81%                               183.81%
## 2                                    <NA>                                  <NA>
## 3                                  41.29%                                  <NA>
## 4                                  13.86%                               -12.67%
## 5                                 -62.97%                               -58.93%
## 6                                    <NA>                                  <NA>
##   YTD.Return.12.31.2024.01.08.2025 X1_Year.Return.01.08.2024.01.08.2025
## 1                            0.00%                              183.81%
## 2                           -2.56%                                 <NA>
## 3                           -2.78%                                 <NA>
## 4                            2.71%                              -67.09%
## 5                            1.48%                                 <NA>
## 6                            0.00%                                 <NA>
##   X3_Year.Return.01.07.2022.01.08.2025 X5_Year.Return.01.08.2020.01.08.2025
## 1                              494.41%                              574.60%
## 2                                 <NA>                                 <NA>
## 3                                 <NA>                                 <NA>
## 4                              -97.95%                              -99.31%
## 5                                 <NA>                                 <NA>
## 6                                 <NA>                                 <NA>
##   X10_Year.Return.01.08.2015.01.08.2025
## 1                                60.38%
## 2                                  <NA>
## 3                                  <NA>
## 4                               -99.98%
## 5                                  <NA>
## 6                                  <NA>
str(data)
## 'data.frame':    19790 obs. of  15 variables:
##  $ Num                                    : int  13655 19576 19598 584 2088 12951 3 455 180 1415 ...
##  $ Symbl                                  : chr  "VOLT" "AVL" "AVGX" "BOIL" ...
##  $ Name.1.of..19790.selected              : chr  "Tema Electrification ETF\\Disc" "Direxion Daily AVGO Bull 2X Shares" "Defiance Daily Target 2X Long AVGO ETF" "ProShares Ultra Blmbrg Natural Gas ETF" ...
##  $ Return.12.31.24.01.08.25               : chr  "0.00%" "-2.56%" "-2.78%" "2.71%" ...
##  $ AnnualBP                               : chr  "0.00%" "-72.93%" "-75.80%" "283.92%" ...
##  $ CP                                     : num  17 33.9 31.5 57.3 22.6 ...
##  $ DaysBP                                 : int  5 5 5 5 5 5 5 5 5 5 ...
##  $ X1_Month.Return.12.06.2024.01.08.2025  : chr  "183.81%" "50.98%" "49.18%" "46.36%" ...
##  $ X1_Quarter.Return.10.08.2024.01.08.2025: chr  "183.81%" NA "41.29%" "13.86%" ...
##  $ X6_Month.Return.07.08.2024.01.08.2025  : chr  "183.81%" NA NA "-12.67%" ...
##  $ YTD.Return.12.31.2024.01.08.2025       : chr  "0.00%" "-2.56%" "-2.78%" "2.71%" ...
##  $ X1_Year.Return.01.08.2024.01.08.2025   : chr  "183.81%" NA NA "-67.09%" ...
##  $ X3_Year.Return.01.07.2022.01.08.2025   : chr  "494.41%" NA NA "-97.95%" ...
##  $ X5_Year.Return.01.08.2020.01.08.2025   : chr  "574.60%" NA NA "-99.31%" ...
##  $ X10_Year.Return.01.08.2015.01.08.2025  : chr  "60.38%" NA NA "-99.98%" ...
summary(data)
##       Num           Symbl           Name.1.of..19790.selected
##  Min.   :    1   Length:19790       Length:19790             
##  1st Qu.: 4948   Class :character   Class :character         
##  Median : 9896   Mode  :character   Mode  :character         
##  Mean   : 9896                                               
##  3rd Qu.:14843                                               
##  Max.   :19790                                               
##  Return.12.31.24.01.08.25   AnnualBP               CP               DaysBP 
##  Length:19790             Length:19790       Min.   :    0.03   Min.   :5  
##  Class :character         Class :character   1st Qu.:   10.28   1st Qu.:5  
##  Mode  :character         Mode  :character   Median :   17.24   Median :5  
##                                              Mean   :   30.06   Mean   :5  
##                                              3rd Qu.:   30.75   3rd Qu.:5  
##                                              Max.   :42635.20   Max.   :5  
##  X1_Month.Return.12.06.2024.01.08.2025 X1_Quarter.Return.10.08.2024.01.08.2025
##  Length:19790                          Length:19790                           
##  Class :character                      Class :character                       
##  Mode  :character                      Mode  :character                       
##                                                                               
##                                                                               
##                                                                               
##  X6_Month.Return.07.08.2024.01.08.2025 YTD.Return.12.31.2024.01.08.2025
##  Length:19790                          Length:19790                    
##  Class :character                      Class :character                
##  Mode  :character                      Mode  :character                
##                                                                        
##                                                                        
##                                                                        
##  X1_Year.Return.01.08.2024.01.08.2025 X3_Year.Return.01.07.2022.01.08.2025
##  Length:19790                         Length:19790                        
##  Class :character                     Class :character                    
##  Mode  :character                     Mode  :character                    
##                                                                           
##                                                                           
##                                                                           
##  X5_Year.Return.01.08.2020.01.08.2025 X10_Year.Return.01.08.2015.01.08.2025
##  Length:19790                         Length:19790                         
##  Class :character                     Class :character                     
##  Mode  :character                     Mode  :character                     
##                                                                            
##                                                                            
## 
any(is.na(data))
## [1] TRUE
data[, 4:ncol(data)] <- data[, 4:ncol(data)] %>%
  mutate(across(everything(), ~ gsub("[^0-9.-]", "", .)))
# convert columns to numeric
data[, 4:ncol(data)] <- data[, 4:ncol(data)] %>%
  mutate(across(everything(), as.numeric))
summary(data[, 4:ncol(data)])
##  Return.12.31.24.01.08.25    AnnualBP             CP               DaysBP 
##  Min.   :-33.8600         Min.   :-100.00   Min.   :    0.03   Min.   :5  
##  1st Qu.: -0.1200         1st Qu.:  -6.05   1st Qu.:   10.28   1st Qu.:5  
##  Median :  0.2800         Median :  15.21   Median :   17.24   Median :5  
##  Mean   :  0.3969         Mean   :  54.68   Mean   :   30.06   Mean   :5  
##  3rd Qu.:  0.8100         3rd Qu.:  49.73   3rd Qu.:   30.75   3rd Qu.:5  
##  Max.   : 37.7500         Max.   :9943.89   Max.   :42635.20   Max.   :5  
##  NA's   :6                NA's   :34                                      
##  X1_Month.Return.12.06.2024.01.08.2025 X1_Quarter.Return.10.08.2024.01.08.2025
##  Min.   :-49.180                       Min.   :-91.0900                       
##  1st Qu.: -4.220                       1st Qu.: -2.2800                       
##  Median : -2.870                       Median : -0.3800                       
##  Mean   : -2.961                       Mean   : -0.1265                       
##  3rd Qu.: -1.680                       3rd Qu.:  1.7800                       
##  Max.   :183.810                       Max.   :204.2100                       
##  NA's   :65                            NA's   :175                            
##  X6_Month.Return.07.08.2024.01.08.2025 YTD.Return.12.31.2024.01.08.2025
##  Min.   :-98.770                       Min.   :-33.8600                
##  1st Qu.:  0.910                       1st Qu.: -0.1200                
##  Median :  3.150                       Median :  0.2800                
##  Mean   :  3.758                       Mean   :  0.3969                
##  3rd Qu.:  6.430                       3rd Qu.:  0.8100                
##  Max.   :183.810                       Max.   : 37.7500                
##  NA's   :446                           NA's   :6                       
##  X1_Year.Return.01.08.2024.01.08.2025 X3_Year.Return.01.07.2022.01.08.2025
##  Min.   :-98.78                       Min.   :-98.800                     
##  1st Qu.:  4.37                       1st Qu.: -1.215                     
##  Median :  9.37                       Median :  7.570                     
##  Mean   : 11.37                       Mean   :  8.695                     
##  3rd Qu.: 16.10                       3rd Qu.: 16.950                     
##  Max.   :372.17                       Max.   :494.410                     
##  NA's   :775                          NA's   :1987                        
##  X5_Year.Return.01.08.2020.01.08.2025 X10_Year.Return.01.08.2015.01.08.2025
##  Min.   :-99.93                       Min.   :-100.00                      
##  1st Qu.:  9.70                       1st Qu.:  29.28                      
##  Median : 30.15                       Median :  73.15                      
##  Mean   : 36.43                       Mean   :  96.25                      
##  3rd Qu.: 55.68                       3rd Qu.: 131.95                      
##  Max.   :802.63                       Max.   :3562.05                      
##  NA's   :3225                         NA's   :7005
# convert all numeric columns from percentages to decimals
data[, 4:ncol(data)] <- data[, 4:ncol(data)] %>%
  mutate(across(everything(), ~ . / 100))
summary(data[, 4:ncol(data)])
##  Return.12.31.24.01.08.25    AnnualBP             CP               DaysBP    
##  Min.   :-0.338600        Min.   :-1.0000   Min.   :  0.0003   Min.   :0.05  
##  1st Qu.:-0.001200        1st Qu.:-0.0605   1st Qu.:  0.1028   1st Qu.:0.05  
##  Median : 0.002800        Median : 0.1520   Median :  0.1724   Median :0.05  
##  Mean   : 0.003969        Mean   : 0.5468   Mean   :  0.3006   Mean   :0.05  
##  3rd Qu.: 0.008100        3rd Qu.: 0.4973   3rd Qu.:  0.3075   3rd Qu.:0.05  
##  Max.   : 0.377500        Max.   :99.4389   Max.   :426.3520   Max.   :0.05  
##  NA's   :6                NA's   :34                                         
##  X1_Month.Return.12.06.2024.01.08.2025 X1_Quarter.Return.10.08.2024.01.08.2025
##  Min.   :-0.49180                      Min.   :-0.91090                       
##  1st Qu.:-0.04220                      1st Qu.:-0.02280                       
##  Median :-0.02870                      Median :-0.00380                       
##  Mean   :-0.02961                      Mean   :-0.00127                       
##  3rd Qu.:-0.01680                      3rd Qu.: 0.01780                       
##  Max.   : 1.83810                      Max.   : 2.04210                       
##  NA's   :65                            NA's   :175                            
##  X6_Month.Return.07.08.2024.01.08.2025 YTD.Return.12.31.2024.01.08.2025
##  Min.   :-0.9877                       Min.   :-0.338600               
##  1st Qu.: 0.0091                       1st Qu.:-0.001200               
##  Median : 0.0315                       Median : 0.002800               
##  Mean   : 0.0376                       Mean   : 0.003969               
##  3rd Qu.: 0.0643                       3rd Qu.: 0.008100               
##  Max.   : 1.8381                       Max.   : 0.377500               
##  NA's   :446                           NA's   :6                       
##  X1_Year.Return.01.08.2024.01.08.2025 X3_Year.Return.01.07.2022.01.08.2025
##  Min.   :-0.9878                      Min.   :-0.9880                     
##  1st Qu.: 0.0437                      1st Qu.:-0.0121                     
##  Median : 0.0937                      Median : 0.0757                     
##  Mean   : 0.1137                      Mean   : 0.0869                     
##  3rd Qu.: 0.1610                      3rd Qu.: 0.1695                     
##  Max.   : 3.7217                      Max.   : 4.9441                     
##  NA's   :775                          NA's   :1987                        
##  X5_Year.Return.01.08.2020.01.08.2025 X10_Year.Return.01.08.2015.01.08.2025
##  Min.   :-0.999                       Min.   :-1.000                       
##  1st Qu.: 0.097                       1st Qu.: 0.293                       
##  Median : 0.302                       Median : 0.732                       
##  Mean   : 0.364                       Mean   : 0.963                       
##  3rd Qu.: 0.557                       3rd Qu.: 1.319                       
##  Max.   : 8.026                       Max.   :35.620                       
##  NA's   :3225                         NA's   :7005
#drop columns
data <- data %>% select(-c(AnnualBP,DaysBP, CP, `YTD.Return.12.31.2024.01.08.2025`))

#remove NAs
data <- na.omit(data)

# variables for good returns and bad periods
good_return_columns <- c(
  "X1_Month.Return.12.06.2024.01.08.2025",
  "X1_Quarter.Return.10.08.2024.01.08.2025",
  "X6_Month.Return.07.08.2024.01.08.2025",
  "X1_Year.Return.01.08.2024.01.08.2025",
  "X3_Year.Return.01.07.2022.01.08.2025",
  "X5_Year.Return.01.08.2020.01.08.2025",
  "X10_Year.Return.01.08.2015.01.08.2025"
)

bad_period_column <- "Return.12.31.24.01.08.25"


# calculate avg return across good periods for each fund
data <- data %>%
  rowwise() %>%
  mutate(
    avg_good_return = mean(c_across(all_of(good_return_columns)), na.rm = TRUE),
    bad_period_loss = !!sym(bad_period_column)
  ) %>%
  ungroup() 



# overall score (70% weight for good 30% weight for bad period)
data <- data %>%
  mutate(
    overall_score = (0.7 * avg_good_return) + (0.3 * bad_period_loss)
  )


# rank funds based on the overall score
data <- data %>%
  arrange(desc(overall_score)) %>% 
  mutate(rank = rank(-overall_score)) 


# top 10
top_funds <- data %>%
  arrange(desc(overall_score)) %>%
  slice(1:10) %>%
  select(Name.1.of..19790.selected, rank, overall_score, avg_good_return, bad_period_loss)


print(top_funds)
## # A tibble: 10 × 5
##    Name.1.of..19790.selected  rank overall_score avg_good_return bad_period_loss
##    <chr>                     <dbl>         <dbl>           <dbl>           <dbl>
##  1 "ProShares Ultra Semicon…     1          4.72            6.72          0.0629
##  2 "ProFunds Semiconductor …     2          3.00            4.27          0.0493
##  3 "Direxion Daily Technolo…     3          2.94            4.19          0.0147
##  4 "ProFunds Semiconductor …     4          2.75            3.90          0.0489
##  5 "ProShares UltraPro QQQ …     5          2.33            3.31          0.0196
##  6 "Tema Electrification ET…     6          1.86            2.66          0     
##  7 "Rydex Mnthly Rblnc NASD…     7          1.79            2.55          0.0144
##  8 "Rydex Mnthly Rblnc NASD…     8          1.75            2.50          0.0144
##  9 "ProShares Ultra Technol…     9          1.69            2.41          0.0095
## 10 "ProShares Ultra QQQ ETF"    10          1.54            2.20          0.0138
colnames(data)
##  [1] "Num"                                    
##  [2] "Symbl"                                  
##  [3] "Name.1.of..19790.selected"              
##  [4] "Return.12.31.24.01.08.25"               
##  [5] "X1_Month.Return.12.06.2024.01.08.2025"  
##  [6] "X1_Quarter.Return.10.08.2024.01.08.2025"
##  [7] "X6_Month.Return.07.08.2024.01.08.2025"  
##  [8] "X1_Year.Return.01.08.2024.01.08.2025"   
##  [9] "X3_Year.Return.01.07.2022.01.08.2025"   
## [10] "X5_Year.Return.01.08.2020.01.08.2025"   
## [11] "X10_Year.Return.01.08.2015.01.08.2025"  
## [12] "avg_good_return"                        
## [13] "bad_period_loss"                        
## [14] "overall_score"                          
## [15] "rank"
# top 10 for bar
top_funds_bar <- data %>%
  arrange(desc(overall_score)) %>%
  slice(1:10)

# bar chart
install.packages("ggplot2")
## package 'ggplot2' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trevo\AppData\Local\Temp\RtmpG8HAik\downloaded_packages
library(ggplot2)

ggplot(top_funds_bar, aes(x = reorder(Name.1.of..19790.selected, overall_score), y = overall_score)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Top 10 Funds by Original Overall Score",
    x = "Mutual Funds",
    y = "Overall Score"
  ) +
  theme_minimal()

# metrics table
install.packages("gt")
## package 'gt' successfully unpacked and MD5 sums checked
## 
## The downloaded binary packages are in
##  C:\Users\trevo\AppData\Local\Temp\RtmpG8HAik\downloaded_packages
library(gt)

top_funds_metrics_table <- top_funds_bar %>%
  select(Name.1.of..19790.selected, overall_score, avg_good_return, bad_period_loss)


top_funds_metrics_table %>%
  gt() %>%
  tab_header(
    title = "Top Mutual Funds",
    subtitle = "Key Indicators on Best Investments"
  ) %>%
  fmt_percent(
    columns = avg_good_return, 
    decimals = 0 
  ) %>%
  fmt_percent(
    columns = bad_period_loss,
    decimals = 2 
  ) %>%
  fmt_number(
    columns = overall_score, 
    decimals = 2 
  ) %>%
  cols_label(
    Name.1.of..19790.selected = "Mutual Fund Name",
    overall_score = "Overall Score",
    avg_good_return = "Average Good Return (%)",
    bad_period_loss = "Bad Period Performance (%)"
  )
Top Mutual Funds
Key Indicators on Best Investments
Mutual Fund Name Overall Score Average Good Return (%) Bad Period Performance (%)
ProShares Ultra Semiconductors ETF 4.72 672% 6.29%
ProFunds Semiconductor UltSecr 15x-Inv 3.00 427% 4.93%
Direxion Daily Technology Bull 3X ETF 2.94 419% 1.47%
ProFunds Semiconductor UltSecr 15x-Ser 2.75 390% 4.89%
ProShares UltraPro QQQ ETF 2.33 331% 1.96%
Tema Electrification ETF\Disc 1.86 266% 0.00%
Rydex Mnthly Rblnc NASDAQ-100 2x Strat-H 1.79 255% 1.44%
Rydex Mnthly Rblnc NASDAQ-100 2x Strat-A 1.75 250% 1.44%
ProShares Ultra Technology ETF 1.69 241% 0.95%
ProShares Ultra QQQ ETF 1.54 220% 1.38%
# scatterplot

ggplot(data, aes(x = bad_period_loss, y = avg_good_return, color = overall_score)) +
  geom_point() +
  labs(
    title = "Performance vs. Resilience",
    x = "Loss During Bad Period",
    y = "Average Good Return"
  )

# calc volatility (risk) as the standard deviation of good returns
data <- data %>%
  rowwise() %>%
  mutate(risk = sd(c_across(all_of(good_return_columns)), na.rm = TRUE)) %>%
  ungroup()

# create volatility score
data <- data %>%
  mutate(
    overall_score_volatility = (0.6 * avg_good_return) + (0.3 * bad_period_loss) - (0.1 * risk)
  )

# rank volatility score
data <- data %>%
  arrange(desc(overall_score_volatility)) %>%
  mutate(rank_volatility = rank(-overall_score_volatility))

# new top 10 with volatility 
top_funds_volatility <- data %>%
  slice_head(n = 50) %>%
  select(Symbl,Name.1.of..19790.selected, rank_volatility, overall_score_volatility, avg_good_return, bad_period_loss, risk)

print("Top Funds Based on Volatility-Adjusted Score")
## [1] "Top Funds Based on Volatility-Adjusted Score"
print(top_funds_volatility)
## # A tibble: 50 × 7
##    Symbl Name.1.of..19790.selected        rank_volatility overall_score_volati…¹
##    <chr> <chr>                                      <dbl>                  <dbl>
##  1 USD   "ProShares Ultra Semiconductors…               1                  2.74 
##  2 SMPIX "ProFunds Semiconductor UltSecr…               2                  1.81 
##  3 SMPSX "ProFunds Semiconductor UltSecr…               3                  1.67 
##  4 TECL  "Direxion Daily Technology Bull…               4                  1.55 
##  5 VOLT  "Tema Electrification ETF\\Disc"               5                  1.41 
##  6 TQQQ  "ProShares UltraPro QQQ ETF"                   6                  1.27 
##  7 RMQHX "Rydex Mnthly Rblnc NASDAQ-100 …               7                  1.02 
##  8 RMQAX "Rydex Mnthly Rblnc NASDAQ-100 …               8                  1.00 
##  9 ROM   "ProShares Ultra Technology ETF"               9                  0.934
## 10 QLD   "ProShares Ultra QQQ ETF"                     10                  0.882
## # ℹ 40 more rows
## # ℹ abbreviated name: ¹​overall_score_volatility
## # ℹ 3 more variables: avg_good_return <dbl>, bad_period_loss <dbl>, risk <dbl>
# compare the top from volatility vs none
top_funds_comparison <- data %>%
  slice_head(n = 10) %>%
  select(
    Name.1.of..19790.selected,
    rank_volatility, overall_score, 
    overall_score_volatility, risk 
  )

print("Comparison of Top Funds: Original vs. Volatility-Adjusted Rankings")
## [1] "Comparison of Top Funds: Original vs. Volatility-Adjusted Rankings"
print(top_funds_comparison)
## # A tibble: 10 × 5
##    Name.1.of..19790.selec…¹ rank_volatility overall_score overall_score_volati…²
##    <chr>                              <dbl>         <dbl>                  <dbl>
##  1 "ProShares Ultra Semico…               1          4.72                  2.74 
##  2 "ProFunds Semiconductor…               2          3.00                  1.81 
##  3 "ProFunds Semiconductor…               3          2.75                  1.67 
##  4 "Direxion Daily Technol…               4          2.94                  1.55 
##  5 "Tema Electrification E…               5          1.86                  1.41 
##  6 "ProShares UltraPro QQQ…               6          2.33                  1.27 
##  7 "Rydex Mnthly Rblnc NAS…               7          1.79                  1.02 
##  8 "Rydex Mnthly Rblnc NAS…               8          1.75                  1.00 
##  9 "ProShares Ultra Techno…               9          1.69                  0.934
## 10 "ProShares Ultra QQQ ET…              10          1.54                  0.882
## # ℹ abbreviated names: ¹​Name.1.of..19790.selected, ²​overall_score_volatility
## # ℹ 1 more variable: risk <dbl>
# top 10 lowest risk (volatility)
top_funds_lowest_risk <- data %>%
  arrange(risk) %>% 
  slice_head(n = 10) %>% 
  select(Name.1.of..19790.selected, risk, avg_good_return, bad_period_loss, overall_score_volatility) 

print("Top Mutual Funds with Lowest Risk (Volatility):")
## [1] "Top Mutual Funds with Lowest Risk (Volatility):"
print(top_funds_lowest_risk)
## # A tibble: 10 × 5
##    Name.1.of..19790.selected                risk avg_good_return bad_period_loss
##    <chr>                                   <dbl>           <dbl>           <dbl>
##  1 MoA US Government Money Market Fund   0              0                 0     
##  2 Saratoga Municipal Bond-I             0.00833       -0.0101           -0.0011
##  3 Fidelity Adv Limited-Term Muni Incom… 0.0149         0.00586           0.001 
##  4 Victory INCORE Fund for Income-C      0.0153         0.00837           0     
##  5 EuroPac International Bond-A          0.0162        -0.0142           -0.0012
##  6 Saratoga Municipal Bond-A             0.0175        -0.0193           -0.0012
##  7 Manor Bond                            0.0175        -0.00496          -0.005 
##  8 American Funds ShTrm Bd Fd of Amer-R1 0.0187         0.0245           -0.0011
##  9 Saratoga Investment Quality Bond-A    0.0192         0.000986         -0.0033
## 10 American Funds ShTrm Bd Fd of Amer-R2 0.0193         0.0251            0     
## # ℹ 1 more variable: overall_score_volatility <dbl>
#these tend to have very low gains ^


# metrics table
top_funds_volatility %>%
  gt() %>%
  tab_header(
    title = "Top Mutual Funds (Volatility-Adjusted Rankings)",
    subtitle = "Key Indicators on Best Investments"
  ) %>%
  fmt_percent(
    columns = avg_good_return, 
    decimals = 0 
  ) %>%
  fmt_percent(
    columns = bad_period_loss, 
    decimals = 2 
  ) %>%
  fmt_number(
    columns = c(overall_score_volatility, risk),
    decimals = 2 
  ) %>%
  cols_label(
    Symbl = "Symbol",
    Name.1.of..19790.selected = "Mutual Fund Name",
    rank_volatility = "Rank",
    overall_score_volatility = "Volatility-Adjusted Score",
    avg_good_return = "Average Good Return (%)",
    bad_period_loss = "Bad Period Performance (%)",
    risk = "Risk (Volatility)"
  )
Top Mutual Funds (Volatility-Adjusted Rankings)
Key Indicators on Best Investments
Symbol Mutual Fund Name Rank Volatility-Adjusted Score Average Good Return (%) Bad Period Performance (%) Risk (Volatility)
USD ProShares Ultra Semiconductors ETF 1 2.74 672% 6.29% 13.05
SMPIX ProFunds Semiconductor UltSecr 15x-Inv 2 1.81 427% 4.93% 7.64
SMPSX ProFunds Semiconductor UltSecr 15x-Ser 3 1.67 390% 4.89% 6.87
TECL Direxion Daily Technology Bull 3X ETF 4 1.55 419% 1.47% 9.75
VOLT Tema Electrification ETF\Disc 5 1.41 266% 0.00% 1.90
TQQQ ProShares UltraPro QQQ ETF 6 1.27 331% 1.96% 7.28
RMQHX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-H 7 1.02 255% 1.44% 5.16
RMQAX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-A 8 1.00 250% 1.44% 5.03
ROM ProShares Ultra Technology ETF 9 0.93 241% 0.95% 5.18
QLD ProShares Ultra QQQ ETF 10 0.88 220% 1.38% 4.41
DXQLX Direxion Mthly NASDAQ-100 Bull 175X-Inv 11 0.87 218% 1.29% 4.38
FSELX Fidelity Select Semiconductors 12 0.84 196% 3.76% 3.45
FELIX Fidelity Adv Semiconductors-I 13 0.83 193% 3.87% 3.39
RYVLX Rydex NASDAQ-100 2x Strategy-A 14 0.83 206% 1.36% 4.09
RYVYX Rydex NASDAQ-100 2x Strategy-H 15 0.83 206% 1.36% 4.09
UOPIX ProFunds UltraNASDAQ-100 2x-Inv 16 0.81 202% 1.41% 4.01
FELAX Fidelity Adv Semiconductors-A 17 0.81 188% 3.86% 3.28
SMH VanEck Semiconductor ETF 18 0.80 188% 4.15% 3.44
ARGT Global X MSCI Argentina ETF 19 0.79 155% 6.30% 1.57
FELTX Fidelity Adv Semiconductors-M 20 0.79 183% 3.85% 3.18
RYCCX Rydex NASDAQ-100 2x Strategy-C 21 0.77 191% 1.35% 3.77
FELCX Fidelity Adv Semiconductors-C 22 0.76 175% 3.85% 3.02
KNPYX Kinetics Paradigm-Inst 23 0.74 145% 11.05% 1.63
UOPSX ProFunds UltraNASDAQ-100 2x-Ser 24 0.74 182% 1.37% 3.59
WWNPX Kinetics Paradigm No Load 25 0.73 143% 11.05% 1.58
KMKYX Kinetics Market Opportunities Inst 26 0.72 144% 8.57% 1.69
KNPAX Kinetics Paradigm-Adv A 27 0.72 140% 11.05% 1.54
KMKNX Kinetics Market Opportunities No Load 28 0.71 141% 8.56% 1.65
LSHUX Kinetics Spin-Off & CorpRestrctring-Inst 29 0.71 135% 12.18% 1.39
KMKAX Kinetics Market Opportunities-Adv A 30 0.70 138% 8.57% 1.60
LSHAX Kinetics Spin-Off & CorpRestrctring-Adv 31 0.70 132% 12.21% 1.35
KSCYX Kinetics SmallCap Opportunities-Inst 32 0.67 135% 8.85% 1.65
KSCOX Kinetics SmallCap Opportunities No Load 33 0.66 132% 8.84% 1.61
SOXL Direxion Daily Semiconductor Bull 3X ETF 34 0.65 191% 10.51% 5.27
KSOAX Kinetics SmallCap Opportunities-Adv A 35 0.65 129% 8.84% 1.56
TEPIX ProFunds Technology UltSecr 15x-Inv 36 0.62 153% 0.88% 3.05
SPXL Direxion Daily S&P500 Bull 3X ETF 37 0.60 144% 1.35% 2.71
UPRO ProShares UltraPro S&P500 ETF 38 0.59 144% 1.35% 2.72
BPTIX Baron Partners-Inst 39 0.59 134% −1.32% 2.16
WWWFX Kinetics Internet No Load 40 0.57 115% 3.82% 1.30
BPTRX Baron Partners-Retail 41 0.57 131% −1.32% 2.09
FATIX Fidelity Adv Technology-I 42 0.56 132% 1.49% 2.33
KINAX Kinetics Internet-Adv A 43 0.56 113% 3.82% 1.26
TEPSX ProFunds Technology UltSecr 15x-Ser 44 0.56 138% 0.83% 2.72
FADTX Fidelity Adv Technology-A 45 0.55 128% 1.48% 2.26
PSI Invesco Dynamic Semiconductors ETF 46 0.54 128% 5.71% 2.42
SOXX iShares PHLX Semiconductor ETF 47 0.54 132% 3.74% 2.62
FATEX Fidelity Adv Technology-M 48 0.54 125% 1.47% 2.19
FSPTX Fidelity Select Technology 49 0.52 122% 1.46% 2.13
FTHCX Fidelity Adv Technology-C 50 0.51 119% 1.47% 2.07
# KEY INSIGHTS: 
  # ProShares Ultra Semiconductors ETF (Rank 1):
    #  highest VA score (2.74) due to strong good return average (6.72) 
    #  and good gains during bad period (0.06), volatility high cuz GAIN performance, not loss performance.
  #  Tema Electrification ETF\Disc (Rank 5):
    #  Low-risk option with a volatility of only 1.90, but lower overall returns make it rank below others.

# volatility bar chart
ggplot(top_funds_volatility, aes(x = reorder(Name.1.of..19790.selected, overall_score_volatility), y = overall_score_volatility)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  coord_flip() +
  labs(
    title = "Top 10 Funds by Volatility-Adjusted Score",
    x = "Mutual Funds",
    y = "Volatility-Adjusted Score"
  ) +
  theme_minimal()

# scatterplot for risk-adjusted performance
ggplot(data, aes(x = risk, y = avg_good_return, color = overall_score_volatility)) +
  geom_point() +
  labs(
    title = "Risk-Adjusted Performance (Volatility)",
    x = "Risk (Volatility)",
    y = "Average Good Return"
  )

# New stuff, taking out negative values.
columns_to_check <- c(
  "X1_Quarter.Return.10.08.2024.01.08.2025",
  "X6_Month.Return.07.08.2024.01.08.2025",
  "X1_Year.Return.01.08.2024.01.08.2025",
  "X3_Year.Return.01.07.2022.01.08.2025",
  "X5_Year.Return.01.08.2020.01.08.2025",
  "X10_Year.Return.01.08.2015.01.08.2025"
)



# Filter rows where any of the specified columns have negative values
data_filtered_no_negatives <- data %>%
  filter(!rowSums(select(., all_of(columns_to_check)) < 0))  
# Check dimensions before and after filtering
cat("Original dataset dimensions: ", dim(data), "\n")
## Original dataset dimensions:  12785 18
cat("Filtered dataset dimensions: ", dim(data_filtered_no_negatives), "\n")
## Filtered dataset dimensions:  5020 18
View(data_filtered_no_negatives)

# Calculate risk as the standard deviation of good returns
data_filtered_no_negatives <- data_filtered_no_negatives %>%
  rowwise() %>%
  mutate(risk = sd(c_across(all_of(good_return_columns)), na.rm = TRUE)) %>%
  ungroup()

data_filtered_no_negatives <- data_filtered_no_negatives %>%
  filter(Symbl != "VOLT")

# Calculate the new volatility-adjusted score
data_filtered_no_negatives <- data_filtered_no_negatives %>%
  mutate(
    overall_score_volatility = (0.8 * avg_good_return) + (0.1 * bad_period_loss) - (0.1 * risk)
  )

# Rank the funds based on the new volatility-adjusted score
data_filtered_no_negatives <- data_filtered_no_negatives %>%
  arrange(desc(overall_score_volatility)) %>%
  mutate(rank_volatility = rank(-overall_score_volatility))

# Extract Top Funds
top_funds_volatility_filtered <- data_filtered_no_negatives %>%
  slice_head(n = 50) %>%
  select(Symbl, Name.1.of..19790.selected, rank_volatility, overall_score_volatility, avg_good_return, bad_period_loss, risk)

# Print Top Funds
print("Top Funds Based on Updated Volatility-Adjusted Score:")
## [1] "Top Funds Based on Updated Volatility-Adjusted Score:"
print(top_funds_volatility_filtered)
## # A tibble: 50 × 7
##    Symbl Name.1.of..19790.selected        rank_volatility overall_score_volati…¹
##    <chr> <chr>                                      <dbl>                  <dbl>
##  1 RMQHX Rydex Mnthly Rblnc NASDAQ-100 2…               1                   1.53
##  2 RMQAX Rydex Mnthly Rblnc NASDAQ-100 2…               2                   1.50
##  3 QLD   ProShares Ultra QQQ ETF                        3                   1.32
##  4 DXQLX Direxion Mthly NASDAQ-100 Bull …               4                   1.31
##  5 RYVLX Rydex NASDAQ-100 2x Strategy-A                 5                   1.24
##  6 RYVYX Rydex NASDAQ-100 2x Strategy-H                 6                   1.24
##  7 UOPIX ProFunds UltraNASDAQ-100 2x-Inv                7                   1.21
##  8 RYCCX Rydex NASDAQ-100 2x Strategy-C                 8                   1.15
##  9 UOPSX ProFunds UltraNASDAQ-100 2x-Ser                9                   1.10
## 10 ARGT  Global X MSCI Argentina ETF                   10                   1.09
## # ℹ 40 more rows
## # ℹ abbreviated name: ¹​overall_score_volatility
## # ℹ 3 more variables: avg_good_return <dbl>, bad_period_loss <dbl>, risk <dbl>
top_funds_volatility_filtered %>%
  gt() %>%
  tab_header(
    title = "Top Mutual Funds (NO NEGATIVES AFTER 1 MONTH)",
    subtitle = "Updated Volatility-Adjusted Rankings (Weights: Avg = 0.8, Bad = 0.1, Risk = 0.1)"
  ) %>%
  fmt_percent(
    columns = avg_good_return,
    decimals = 0
  ) %>%
  fmt_percent(
    columns = bad_period_loss,
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(overall_score_volatility, risk),
    decimals = 2
  ) %>%
  cols_label(
    Symbl = "Symbol",
    Name.1.of..19790.selected = "Mutual Fund Name",
    rank_volatility = "Rank",
    overall_score_volatility = "Volatility-Adjusted Score",
    avg_good_return = "Average Good Return (%)",
    bad_period_loss = "Bad Period Performance (%)",
    risk = "Risk (Volatility)"
  )
Top Mutual Funds (NO NEGATIVES AFTER 1 MONTH)
Updated Volatility-Adjusted Rankings (Weights: Avg = 0.8, Bad = 0.1, Risk = 0.1)
Symbol Mutual Fund Name Rank Volatility-Adjusted Score Average Good Return (%) Bad Period Performance (%) Risk (Volatility)
RMQHX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-H 1 1.53 255% 1.44% 5.16
RMQAX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-A 2 1.50 250% 1.44% 5.03
QLD ProShares Ultra QQQ ETF 3 1.32 220% 1.38% 4.41
DXQLX Direxion Mthly NASDAQ-100 Bull 175X-Inv 4 1.31 218% 1.29% 4.38
RYVLX Rydex NASDAQ-100 2x Strategy-A 5 1.24 206% 1.36% 4.09
RYVYX Rydex NASDAQ-100 2x Strategy-H 6 1.24 206% 1.36% 4.09
UOPIX ProFunds UltraNASDAQ-100 2x-Inv 7 1.21 202% 1.41% 4.01
RYCCX Rydex NASDAQ-100 2x Strategy-C 8 1.15 191% 1.35% 3.77
UOPSX ProFunds UltraNASDAQ-100 2x-Ser 9 1.10 182% 1.37% 3.59
ARGT Global X MSCI Argentina ETF 10 1.09 155% 6.30% 1.57
KNPYX Kinetics Paradigm-Inst 11 1.01 145% 11.05% 1.63
WWNPX Kinetics Paradigm No Load 12 0.99 143% 11.05% 1.58
KMKYX Kinetics Market Opportunities Inst 13 0.99 144% 8.57% 1.69
KNPAX Kinetics Paradigm-Adv A 14 0.98 140% 11.05% 1.54
KMKNX Kinetics Market Opportunities No Load 15 0.97 141% 8.56% 1.65
KMKAX Kinetics Market Opportunities-Adv A 16 0.96 138% 8.57% 1.60
LSHUX Kinetics Spin-Off & CorpRestrctring-Inst 17 0.95 135% 12.18% 1.39
LSHAX Kinetics Spin-Off & CorpRestrctring-Adv 18 0.94 132% 12.21% 1.35
KSCYX Kinetics SmallCap Opportunities-Inst 19 0.92 135% 8.85% 1.65
KSCOX Kinetics SmallCap Opportunities No Load 20 0.91 132% 8.84% 1.61
KSOAX Kinetics SmallCap Opportunities-Adv A 21 0.89 129% 8.84% 1.56
SPXL Direxion Daily S&P500 Bull 3X ETF 22 0.88 144% 1.35% 2.71
UPRO ProShares UltraPro S&P500 ETF 23 0.88 144% 1.35% 2.72
BPTIX Baron Partners-Inst 24 0.86 134% −1.32% 2.16
BPTRX Baron Partners-Retail 25 0.84 131% −1.32% 2.09
FATIX Fidelity Adv Technology-I 26 0.83 132% 1.49% 2.33
FADTX Fidelity Adv Technology-A 27 0.80 128% 1.48% 2.26
WWWFX Kinetics Internet No Load 28 0.80 115% 3.82% 1.30
FATEX Fidelity Adv Technology-M 29 0.78 125% 1.47% 2.19
KINAX Kinetics Internet-Adv A 30 0.78 113% 3.82% 1.26
FSPTX Fidelity Select Technology 31 0.76 122% 1.46% 2.13
FTHCX Fidelity Adv Technology-C 32 0.74 119% 1.47% 2.07
IYW iShares US Technology ETF 33 0.74 118% 0.95% 2.06
VGT Vanguard Information Tech ETF 34 0.73 116% 0.80% 2.06
FCGSX Fidelity Series Growth Company 35 0.73 114% 1.34% 1.87
VITAX Vanguard Information Tech IxFd-Admr 36 0.72 116% 0.84% 2.04
FTEC Fidelity MSCI Information Technology ETF 37 0.72 115% 0.85% 2.01
IGM iShares Expanded Technology Sector ETF 38 0.72 114% 1.18% 1.97
SGTTX Columbia Seligman Glbl Technology-Inst2 39 0.71 114% 2.30% 2.03
CSGZX Columbia Seligman Glbl Technology-Inst 40 0.71 113% 2.28% 2.01
SPUU Direxion Daily S&P500 Bull 2X ETF 41 0.70 112% 1.20% 1.95
SCMIX Columbia Seligman Technology&Info-Inst2 42 0.70 112% 2.23% 1.97
CTHRX Columbia Global Technology Growth-Inst2 43 0.70 112% 1.62% 1.98
CCIZX Columbia Seligman Technology&Info-Inst 44 0.70 111% 2.24% 1.96
FSBDX Fidelity Series Blue Chip Growth 45 0.69 108% 1.71% 1.72
CMTFX Columbia Global Technology Growth-Inst 46 0.69 111% 1.62% 1.96
BFGIX Baron Focused Growth-Inst 47 0.69 107% 0.06% 1.64
SHGTX Columbia Seligman Glbl Technology-A 48 0.69 110% 2.27% 1.95
XLK Technology Select Sector SPDR ETF 49 0.68 110% 0.58% 1.98
ARKW ARK Next Generation Internet ETF 50 0.68 111% 2.79% 2.04
ggplot(data_filtered_no_negatives, aes(x = risk, y = avg_good_return, color = overall_score_volatility)) +
  geom_point() +
  labs(
    title = "Risk-Adjusted Performance (Filtered Dataset with Updated Weights)",
    x = "Risk (Volatility)",
    y = "Average Good Return"
  )

# Reload the raw dataset
data_full <- read.csv("ALL-F1.8.25.CSV", stringsAsFactors = FALSE)

# Drop columns that are no longer relevant (including the 10-year column)
data_full <- data_full %>%
  select(-c(AnnualBP, DaysBP, CP,`YTD.Return.12.31.2024.01.08.2025` ,X10_Year.Return.01.08.2015.01.08.2025))

# Convert all 9999.99 values to NA
data_full <- data_full %>%
  mutate(across(everything(), ~ replace(., . == "-9999.99%", NA))) %>%
  mutate(across(everything(), ~ replace(., . == "9999.99%", NA)))

# Clean and process numeric columns
data_full[, 4:ncol(data_full)] <- data_full[, 4:ncol(data_full)] %>%
  mutate(across(everything(), ~ gsub("[^0-9.-]", "", .))) %>%
  mutate(across(everything(), as.numeric)) %>%
  mutate(across(everything(), ~ . / 100))

# Remove rows with negative values 
columns_to_check <- c(
  "X1_Quarter.Return.10.08.2024.01.08.2025",
  "X6_Month.Return.07.08.2024.01.08.2025",
  "X1_Year.Return.01.08.2024.01.08.2025",
  "X3_Year.Return.01.07.2022.01.08.2025",
  "X5_Year.Return.01.08.2020.01.08.2025"
)

data_filtered <- data_full %>%
  filter(
    across(all_of(columns_to_check), ~ . >= 0)
  )
## Warning: Using `across()` in `filter()` was deprecated in dplyr 1.0.8.
## ℹ Please use `if_any()` or `if_all()` instead.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# Remove the `VOLT` row explicitly
data_filtered <- data_filtered %>%
  filter(Symbl != "VOLT")


# Define updated good return columns
good_return_columns_v2 <- c(
  "X1_Month.Return.12.06.2024.01.08.2025",
  "X1_Quarter.Return.10.08.2024.01.08.2025",
  "X6_Month.Return.07.08.2024.01.08.2025",
  "X1_Year.Return.01.08.2024.01.08.2025",
  "X3_Year.Return.01.07.2022.01.08.2025",
  "X5_Year.Return.01.08.2020.01.08.2025"
)

# Recalculate metrics and rank
data_filtered <- data_filtered %>%
  rowwise() %>%
  mutate(
    avg_good_return = mean(c_across(all_of(good_return_columns_v2)), na.rm = TRUE),
    bad_period_loss = !!sym(bad_period_column)
  ) %>%
  ungroup()

# Calculate volatility (risk)
data_filtered <- data_filtered %>%
  rowwise() %>%
  mutate(
    risk = sd(c_across(all_of(good_return_columns_v2)), na.rm = TRUE)
  ) %>%
  ungroup()

# Calculate updated volatility-adjusted score
data_filtered <- data_filtered %>%
  mutate(
    overall_score_volatility = (0.8 * avg_good_return) +
      (0.1 * bad_period_loss) - 
      (0.1 * risk)
  ) %>%
  arrange(desc(overall_score_volatility)) %>%
  mutate(rank_volatility = rank(-overall_score_volatility))

# Extract top 10 funds
top_funds_volatility_updated <- data_filtered %>%
  slice_head(n = 50) %>%
  select( Symbl, Name.1.of..19790.selected, rank_volatility,
         overall_score_volatility, avg_good_return, bad_period_loss, risk)

# Display the updated metrics table
top_funds_volatility_updated %>%
  gt() %>%
  tab_header(
    title = "Top Mutual Funds (Excluding Negative Values After 1 Month & Excluding 10 Year Returns)",
    subtitle = "Updated Volatility-Adjusted Rankings (Weights: Avg = 0.8, Bad = 0.1, Risk = 0.1)"
  ) %>%
  fmt_percent(
    columns = avg_good_return, 
    decimals = 0
  ) %>%
  fmt_percent(
    columns = bad_period_loss, 
    decimals = 2
  ) %>%
  fmt_number(
    columns = c(overall_score_volatility, risk),
    decimals = 2
  ) %>%
  cols_label(
    rank_volatility = "Rank",
    Symbl = "Symbol",
    Name.1.of..19790.selected = "Mutual Fund Name",
    overall_score_volatility = "Volatility-Adjusted Score",
    avg_good_return = "Average Good Return (%)",
    bad_period_loss = "Bad Period Performance (%)",
    risk = "Risk (Volatility)"
  )
Top Mutual Funds (Excluding Negative Values After 1 Month & Excluding 10 Year Returns)
Updated Volatility-Adjusted Rankings (Weights: Avg = 0.8, Bad = 0.1, Risk = 0.1)
Symbol Mutual Fund Name Rank Volatility-Adjusted Score Average Good Return (%) Bad Period Performance (%) Risk (Volatility)
FNGU MicroSectors FANG 3X Leveraged ETN 1 1.12 176% 3.15% 2.93
GBTC Grayscale Bitcoin Trust ETF 2 1.10 171% 0.62% 2.64
FNGO MicroSectors FANG 2X Lvrgd ETN 3 0.97 154% 0.65% 2.56
ARGT Global X MSCI Argentina ETF 4 0.77 108% 6.30% 1.04
LSHUX Kinetics Spin-Off & CorpRestrctring-Inst 5 0.66 93% 12.18% 0.89
LSHAX Kinetics Spin-Off & CorpRestrctring-Adv 6 0.66 91% 12.21% 0.88
KNPYX Kinetics Paradigm-Inst 7 0.65 90% 11.05% 0.80
WWNPX Kinetics Paradigm No Load 8 0.65 89% 11.05% 0.79
KNPAX Kinetics Paradigm-Adv A 9 0.64 88% 11.05% 0.77
KMKYX Kinetics Market Opportunities Inst 10 0.62 86% 8.57% 0.80
KMKNX Kinetics Market Opportunities No Load 11 0.61 85% 8.56% 0.79
KMKAX Kinetics Market Opportunities-Adv A 12 0.60 84% 8.57% 0.78
MSEJX MM Equity Asset-I 13 0.58 75% 37.15% 0.55
KSCYX Kinetics SmallCap Opportunities-Inst 14 0.56 78% 8.85% 0.78
KSCOX Kinetics SmallCap Opportunities No Load 15 0.55 78% 8.84% 0.77
KSOAX Kinetics SmallCap Opportunities-Adv A 16 0.55 77% 8.84% 0.76
WWWFX Kinetics Internet No Load 17 0.52 74% 3.82% 0.76
KINAX Kinetics Internet-Adv A 18 0.51 73% 3.82% 0.75
FNGS MicroSectors FANG ETN 19 0.51 77% 0.77% 1.13
WWWEX Kinetics Global No Load 20 0.46 65% 3.56% 0.60
TMV Direxion Daily 20Yr Treasury Bear3X ETF 21 0.44 63% 4.83% 0.66
EGLIX Eagle MLP Strategy-I 22 0.42 60% 3.83% 0.64
MLPNX Invesco SteelPath MLP Alpha Plus-Y 23 0.42 59% 4.00% 0.62
TTT ProShares UltraPro Shrt 20 Treasury ETF 24 0.41 59% 3.11% 0.61
EGLAX Eagle MLP Strategy-A 25 0.41 59% 3.84% 0.63
MLPLX Invesco SteelPath MLP Alpha Plus-A 26 0.41 58% 3.93% 0.61
RMQAX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-A 27 0.40 64% 1.44% 1.10
RMQHX Rydex Mnthly Rblnc NASDAQ-100 2x Strat-H 28 0.40 64% 1.44% 1.10
YCS ProShares UltraShort Yen ETF 29 0.40 58% 3.56% 0.66
QTUM Defiance Quantum ETF 30 0.40 57% −0.86% 0.62
EGLCX Eagle MLP Strategy-C 31 0.39 56% 3.85% 0.59
VLPIX Virtus Duff&Phelps Select MPL & Energy-I 32 0.38 55% 2.78% 0.59
BPTIX Baron Partners-Inst 33 0.38 59% −1.32% 0.90
BPTUX Baron Partners-R6 34 0.38 59% −1.32% 0.90
RCMFX Schwartz Value Focused 35 0.38 54% 5.22% 0.59
VLPAX Virtus Duff&Phelps Select MLP & Energy-A 36 0.38 54% 2.75% 0.57
USAI Pacer American Energy Independence ETF 37 0.37 53% 3.07% 0.52
BPTRX Baron Partners-Retail 38 0.37 58% −1.32% 0.88
MLXIX Catalyst Energy Infrastructure-I 39 0.37 53% 3.20% 0.51
BLOK Amplify Transformational DataSharing ETF 40 0.37 55% 4.08% 0.70
PDX PIMCO Energy & Tactical Credit Opps 41 0.37 54% −0.69% 0.57
MLXAX Catalyst Energy Infrastructure-A 42 0.37 52% 3.18% 0.49
MLPX Global X MLP & Energy Infrastructure ETF 43 0.37 52% 3.25% 0.51
ATMP Barclays ETN Select MLP 44 0.36 52% 4.24% 0.53
OSPAX Invesco SteelPath MLP Alpha-R6 45 0.36 51% 2.78% 0.53
QLD ProShares Ultra QQQ ETF 46 0.36 56% 1.38% 0.96
MLPOX Invesco SteelPath MLP Alpha-Y 47 0.36 51% 2.71% 0.53
MLXCX Catalyst Energy Infrastructure-C 48 0.35 50% 3.19% 0.47
EINC VanEck Energy Income ETF 49 0.35 50% 3.64% 0.48
MLPAX Invesco SteelPath MLP Alpha-A 50 0.35 50% 2.79% 0.51