#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\RtmpmUhyg0\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\RtmpmUhyg0\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\RtmpmUhyg0\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.
# Define the columns to check for 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)) # Exclude rows with any negatives
# 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 (volatility) 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"
)

# Define good_return_columns without the "X10_Year.Return.01.08.2015.01.08.2025"
good_return_columns_updated <- 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"
)
# Filter out rows with negative values in the updated good_return_columns
data_filtered_no_negatives_v2 <- data %>%
filter(across(all_of(good_return_columns_updated), ~ . >= 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.
data_filtered_no_negatives_v2 <- data_filtered_no_negatives_v2 %>%
filter(Symbl != "VOLT")
# Recalculate average good return and volatility (risk)
data_filtered_no_negatives_v2 <- data_filtered_no_negatives_v2 %>%
rowwise() %>%
mutate(
avg_good_return = mean(c_across(all_of(good_return_columns_updated)), na.rm = TRUE),
bad_period_loss = !!sym(bad_period_column),
risk = sd(c_across(all_of(good_return_columns_updated)), na.rm = TRUE)
) %>%
ungroup()
# Recalculate the volatility-adjusted score and rankings
data_filtered_no_negatives_v2 <- data_filtered_no_negatives_v2 %>%
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 the updated Top funds
top_funds_volatility_filtered_v2 <- data_filtered_no_negatives_v2 %>%
slice_head(n = 50) %>%
select(Symbl, Name.1.of..19790.selected, rank_volatility, overall_score_volatility, avg_good_return, bad_period_loss, risk)
# Print the updated Top
print("Updated Top Funds After Removing Incorrect Data and Excluding X10-Year Return:")
## [1] "Updated Top Funds After Removing Incorrect Data and Excluding X10-Year Return:"
print(top_funds_volatility_filtered_v2)
## # A tibble: 50 × 7
## Symbl Name.1.of..19790.selected rank_volatility overall_score_volati…¹
## <chr> <chr> <dbl> <dbl>
## 1 ARGT Global X MSCI Argentina ETF 1 0.931
## 2 LSHUX Kinetics Spin-Off & CorpRestrct… 2 0.823
## 3 LSHAX Kinetics Spin-Off & CorpRestrct… 3 0.814
## 4 KNPYX Kinetics Paradigm-Inst 4 0.811
## 5 WWNPX Kinetics Paradigm No Load 5 0.804
## 6 KNPAX Kinetics Paradigm-Adv A 6 0.795
## 7 KMKYX Kinetics Market Opportunities I… 7 0.768
## 8 KMKNX Kinetics Market Opportunities N… 8 0.761
## 9 KMKAX Kinetics Market Opportunities-A… 9 0.752
## 10 KSCYX Kinetics SmallCap Opportunities… 10 0.693
## # ℹ 40 more rows
## # ℹ abbreviated name: ¹overall_score_volatility
## # ℹ 3 more variables: avg_good_return <dbl>, bad_period_loss <dbl>, risk <dbl>
# Create a metrics table for the updated filtered dataset
top_funds_metrics_table_v2 <- top_funds_volatility_filtered_v2 %>%
select( Symbl, Name.1.of..19790.selected,rank_volatility, overall_score_volatility, avg_good_return, bad_period_loss, risk)
# Generate the metrics table
top_funds_metrics_table_v2 %>%
gt() %>%
tab_header(
title = "Top Mutual Funds (Filtered Dataset - Excluding 10-Year Return)",
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 (Filtered Dataset - Excluding 10-Year Return) |
| 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) |
| ARGT |
Global X MSCI Argentina ETF |
1 |
0.93 |
128% |
6.30% |
1.02 |
| LSHUX |
Kinetics Spin-Off & CorpRestrctring-Inst |
2 |
0.82 |
112% |
12.18% |
0.84 |
| LSHAX |
Kinetics Spin-Off & CorpRestrctring-Adv |
3 |
0.81 |
111% |
12.21% |
0.83 |
| KNPYX |
Kinetics Paradigm-Inst |
4 |
0.81 |
109% |
11.05% |
0.73 |
| WWNPX |
Kinetics Paradigm No Load |
5 |
0.80 |
108% |
11.05% |
0.72 |
| KNPAX |
Kinetics Paradigm-Adv A |
6 |
0.80 |
107% |
11.05% |
0.70 |
| KMKYX |
Kinetics Market Opportunities Inst |
7 |
0.77 |
104% |
8.57% |
0.75 |
| KMKNX |
Kinetics Market Opportunities No Load |
8 |
0.76 |
103% |
8.56% |
0.73 |
| KMKAX |
Kinetics Market Opportunities-Adv A |
9 |
0.75 |
102% |
8.57% |
0.72 |
| KSCYX |
Kinetics SmallCap Opportunities-Inst |
10 |
0.69 |
95% |
8.85% |
0.75 |
| KSCOX |
Kinetics SmallCap Opportunities No Load |
11 |
0.69 |
94% |
8.84% |
0.74 |
| KSOAX |
Kinetics SmallCap Opportunities-Adv A |
12 |
0.68 |
93% |
8.84% |
0.72 |
| WWWFX |
Kinetics Internet No Load |
13 |
0.65 |
90% |
3.82% |
0.73 |
| KINAX |
Kinetics Internet-Adv A |
14 |
0.64 |
89% |
3.82% |
0.71 |
| WWWEX |
Kinetics Global No Load |
15 |
0.57 |
78% |
3.56% |
0.56 |
| MLPNX |
Invesco SteelPath MLP Alpha Plus-Y |
16 |
0.51 |
71% |
4.00% |
0.60 |
| EGLIX |
Eagle MLP Strategy-I |
17 |
0.51 |
72% |
3.83% |
0.64 |
| MLPLX |
Invesco SteelPath MLP Alpha Plus-A |
18 |
0.51 |
70% |
3.93% |
0.59 |
| EGLAX |
Eagle MLP Strategy-A |
19 |
0.51 |
71% |
3.84% |
0.62 |
| RMQAX |
Rydex Mnthly Rblnc NASDAQ-100 2x Strat-A |
20 |
0.51 |
78% |
1.44% |
1.17 |
| RMQHX |
Rydex Mnthly Rblnc NASDAQ-100 2x Strat-H |
21 |
0.50 |
78% |
1.44% |
1.17 |
| TMV |
Direxion Daily 20Yr Treasury Bear3X ETF |
22 |
0.49 |
69% |
4.83% |
0.71 |
| EGLCX |
Eagle MLP Strategy-C |
23 |
0.48 |
67% |
3.85% |
0.59 |
| RCMFX |
Schwartz Value Focused |
24 |
0.47 |
66% |
5.22% |
0.58 |
| YCS |
ProShares UltraShort Yen ETF |
25 |
0.47 |
67% |
3.56% |
0.69 |
| BPTIX |
Baron Partners-Inst |
26 |
0.46 |
70% |
−1.32% |
0.96 |
| MLXIX |
Catalyst Energy Infrastructure-I |
27 |
0.46 |
63% |
3.20% |
0.49 |
| BPTRX |
Baron Partners-Retail |
28 |
0.45 |
69% |
−1.32% |
0.94 |
| MLXAX |
Catalyst Energy Infrastructure-A |
29 |
0.45 |
62% |
3.18% |
0.48 |
| TTT |
ProShares UltraPro Shrt 20 Treasury ETF |
30 |
0.45 |
64% |
3.11% |
0.67 |
| MLPX |
Global X MLP & Energy Infrastructure ETF |
31 |
0.45 |
62% |
3.25% |
0.50 |
| QLD |
ProShares Ultra QQQ ETF |
32 |
0.45 |
69% |
1.38% |
1.02 |
| ATMP |
Barclays ETN Select MLP |
33 |
0.45 |
62% |
4.24% |
0.52 |
| OSPAX |
Invesco SteelPath MLP Alpha-R6 |
34 |
0.44 |
61% |
2.78% |
0.52 |
| MLPOX |
Invesco SteelPath MLP Alpha-Y |
35 |
0.44 |
61% |
2.71% |
0.52 |
| DXQLX |
Direxion Mthly NASDAQ-100 Bull 175X-Inv |
36 |
0.44 |
68% |
1.29% |
1.05 |
| HIMDX |
Hennessy Cornerstone MidCap 30-Inst |
37 |
0.44 |
64% |
0.34% |
0.76 |
| MLPAX |
Invesco SteelPath MLP Alpha-A |
38 |
0.43 |
60% |
2.79% |
0.50 |
| RYVYX |
Rydex NASDAQ-100 2x Strategy-H |
39 |
0.43 |
66% |
1.36% |
0.99 |
| RYVLX |
Rydex NASDAQ-100 2x Strategy-A |
40 |
0.43 |
66% |
1.36% |
0.99 |
| MLXCX |
Catalyst Energy Infrastructure-C |
41 |
0.43 |
59% |
3.19% |
0.45 |
| EINC |
VanEck Energy Income ETF |
42 |
0.43 |
59% |
3.64% |
0.47 |
| IMLPX |
MainGate MLP I |
43 |
0.43 |
60% |
3.14% |
0.55 |
| HFMDX |
Hennessy Cornerstone MidCap 30-Inv |
44 |
0.43 |
63% |
0.35% |
0.74 |
| AIRR |
First Trust RBA Amer Indl RenaisTM ETF |
45 |
0.43 |
62% |
1.04% |
0.67 |
| UOPIX |
ProFunds UltraNASDAQ-100 2x-Inv |
46 |
0.43 |
65% |
1.41% |
0.96 |
| AMLPX |
MainGate MLP-A |
47 |
0.43 |
60% |
3.13% |
0.54 |
| CSHZX |
NYLI Cushing MLP Premier-I |
48 |
0.42 |
58% |
3.83% |
0.44 |
| SRV |
NXG Cushing Midstream Energy Fund |
49 |
0.42 |
59% |
2.68% |
0.49 |
| CSHNX |
NYLI Cushing MLP Premier-Inv |
50 |
0.42 |
57% |
3.85% |
0.43 |