├── .gitignore
├── stocks
├── stocks.txt
└── all_stocks.txt
├── figures
├── simulation.png
├── black-512x512.png
├── normal-512x512.png
├── backtest_results.png
├── future_test_results.png
└── portfolio_weights.png
├── Dockerfile
├── requirements.txt
├── strategies
├── minimum_variance_strategy.py
├── maximum_sharpe_ratio_strategy.py
├── eigen_portfolio_strategy.py
├── strategy_helper_functions.py
└── genetic_algo_strategy.py
├── portfolio_manager.py
├── argchecker.py
├── commands.json
├── strategy_manager.py
├── simulator.py
├── backtester.py
├── data_loader.py
├── README.md
├── eiten.py
└── LICENSE
/.gitignore:
--------------------------------------------------------------------------------
1 |
2 | *.pyc
3 | *.png
4 |
--------------------------------------------------------------------------------
/stocks/stocks.txt:
--------------------------------------------------------------------------------
1 | AAPL
2 | FB
3 | NFLX
4 | SQQQ
5 | TSLA
6 | MSFT
7 | AMZN
8 | AMD
9 | NVDA
--------------------------------------------------------------------------------
/figures/simulation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/simulation.png
--------------------------------------------------------------------------------
/figures/black-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/black-512x512.png
--------------------------------------------------------------------------------
/figures/normal-512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/normal-512x512.png
--------------------------------------------------------------------------------
/figures/backtest_results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/backtest_results.png
--------------------------------------------------------------------------------
/figures/future_test_results.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/future_test_results.png
--------------------------------------------------------------------------------
/figures/portfolio_weights.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/tradytics/eiten/HEAD/figures/portfolio_weights.png
--------------------------------------------------------------------------------
/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM debian:buster-slim
2 |
3 | ADD . /app
4 | WORKDIR /app
5 | RUN apt-get -y update \
6 | && apt-get -y install python3 python3-pip \
7 | && python3 -m pip install -r requirements.txt \
8 | && mkdir /app/output
9 | VOLUME ["/app/output"]
10 | CMD ["python3", "portfolio_manager.py", "--save_plot", "true"]
11 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | certifi==2020.6.20
2 | chardet==3.0.4
3 | cycler==0.10.0
4 | idna==2.10
5 | joblib==0.16.0
6 | kiwisolver==1.2.0
7 | matplotlib==3.3.1
8 | multitasking==0.0.9
9 | numpy==1.19.1
10 | pandas==1.1.1
11 | Pillow==7.2.0
12 | pyparsing==2.4.7
13 | python-dateutil==2.8.1
14 | pytz==2020.1
15 | requests==2.24.0
16 | scikit-learn==0.23.2
17 | scipy==1.5.2
18 | six==1.15.0
19 | threadpoolctl==2.1.0
20 | tqdm==4.48.2
21 | urllib3==1.25.10
22 | yfinance==0.1.54
--------------------------------------------------------------------------------
/strategies/minimum_variance_strategy.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import random
4 | import warnings
5 | import numpy as np
6 | warnings.filterwarnings("ignore")
7 |
8 | class MinimumVarianceStrategy:
9 | def __init__(self):
10 | print("Minimum Variance strategy has been created")
11 |
12 | def generate_portfolio(self, symbols, covariance_matrix):
13 | """
14 | Inspired by: https://srome.github.io/Eigenvesting-II-Optimize-Your-Portfolio-With-Optimization/
15 | """
16 | inverse_cov_matrix = np.linalg.pinv(covariance_matrix)
17 | ones = np.ones(len(inverse_cov_matrix))
18 | inverse_dot_ones = np.dot(inverse_cov_matrix, ones)
19 | min_var_weights = inverse_dot_ones / np.dot( inverse_dot_ones, ones)
20 | portfolio_weights_dictionary = dict([(symbols[x], min_var_weights[x]) for x in range(0, len(min_var_weights))])
21 | return portfolio_weights_dictionary
22 |
--------------------------------------------------------------------------------
/strategies/maximum_sharpe_ratio_strategy.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import random
4 | import warnings
5 | import numpy as np
6 | warnings.filterwarnings("ignore")
7 |
8 | class MaximumSharpeRatioStrategy:
9 | def __init__(self):
10 | print("Maximum sharpe ratio strategy has been created")
11 |
12 | def generate_portfolio(self, symbols, covariance_matrix, returns_vector):
13 | """
14 | Inspired by: Eigen Portfolio Selection: A Robust Approach to Sharpe Ratio Maximization, https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3070416
15 | """
16 | inverse_cov_matrix = np.linalg.pinv(covariance_matrix)
17 | ones = np.ones(len(inverse_cov_matrix))
18 |
19 | numerator = np.dot(inverse_cov_matrix, returns_vector)
20 | denominator = np.dot(np.dot(ones.transpose(), inverse_cov_matrix), returns_vector)
21 | msr_portfolio_weights = numerator / denominator
22 |
23 | portfolio_weights_dictionary = dict([(symbols[x], msr_portfolio_weights[x]) for x in range(0, len(msr_portfolio_weights))])
24 | return portfolio_weights_dictionary
--------------------------------------------------------------------------------
/strategies/eigen_portfolio_strategy.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import warnings
4 | import numpy as np
5 | warnings.filterwarnings("ignore")
6 |
7 | class EigenPortfolioStrategy:
8 | def __init__(self):
9 | print("Eigen portfolio strategy has been created")
10 |
11 | def generate_portfolio(self, symbols, covariance_matrix, eigen_portfolio_number):
12 | """
13 | Inspired by: https://srome.github.io/Eigenvesting-I-Linear-Algebra-Can-Help-You-Choose-Your-Stock-Portfolio/
14 | """
15 | eig_values, eig_vectors = np.linalg.eigh(covariance_matrix)
16 | market_eigen_portfolio = eig_vectors[:,-1] / np.sum(eig_vectors[:,-1]) # We don't need this but in case someone wants to analyze
17 | eigen_portfolio = eig_vectors[:,-eigen_portfolio_number] / np.sum(eig_vectors[:,-eigen_portfolio_number]) # This is a portfolio that is uncorrelated to market and still yields good returns
18 |
19 | portfolio_weights_dictionary = dict([(symbols[x], eigen_portfolio[x]) for x in range(0, len(eigen_portfolio))])
20 | return portfolio_weights_dictionary
21 |
--------------------------------------------------------------------------------
/portfolio_manager.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import argparse
3 | import json
4 | from eiten import Eiten
5 | from argchecker import ArgChecker
6 |
7 | # Ignore warnings
8 | import warnings
9 | warnings.filterwarnings("ignore")
10 |
11 | """
12 | Sample run:
13 | python portfolio_manager.py --is_test 1 --future_bars 90 --data_granularity_minutes 3600 --history_to_use all --apply_noise_filtering 1 --market_index QQQ --only_long 1 --eigen_portfolio_number 3 --save_plot False
14 | """
15 |
16 | def main():
17 |
18 | argParser = argparse.ArgumentParser()
19 | commands = json.load(open("commands.json", "r"))
20 | for i in commands:
21 | arg_types = {"str": str, "int": int, "bool": bool}
22 | argParser.add_argument(i["comm"], type=arg_types[i["type"]],
23 | default=i["default"], help=i["help"])
24 |
25 | # Get arguments
26 | args = argParser.parse_args()
27 |
28 | # Check arguments
29 | ArgChecker(args)
30 |
31 | # Run strategies
32 | eiten = Eiten(args)
33 | eiten.run_strategies()
34 |
35 |
36 | if __name__ == '__main__':
37 | main()
38 |
--------------------------------------------------------------------------------
/argchecker.py:
--------------------------------------------------------------------------------
1 | class ArgChecker:
2 | """
3 | Argument checker
4 | """
5 |
6 | def __init__(self, args):
7 | print("Checking arguments...")
8 | self.check_arguments(args)
9 |
10 | def check_arguments(self, args):
11 | granularity_constraints_list = [1, 5, 10, 15, 30, 60, 3600]
12 | granularity_constraints_list_string = ''.join(
13 | str(value) + "," for value in granularity_constraints_list).strip(",")
14 |
15 | assert not(args.data_granularity_minutes not in granularity_constraints_list), "You can only choose the following values for 'data_granularity_minutes' argument -> %s\nExiting now..." % granularity_constraints_list_string
16 |
17 | assert not(args.is_test == 1 and args.future_bars <
18 | 2), "You want to test but the future bars are less than 2. That does not give us enough data to test the model properly. Please use a value larger than 2.\nExiting now..."
19 |
20 | assert not(args.history_to_use != "all" and int(args.history_to_use) <
21 | args.future_bars), "It is a good idea to use more history and less future bars. Please change these two values and try again.\nExiting now..."
22 |
23 | args.market_index = str(args.market_index).upper()
24 | if args.history_to_use != "all":
25 | args.history_to_use = int(args.history_to_use)
26 |
--------------------------------------------------------------------------------
/strategies/strategy_helper_functions.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import random
4 | import warnings
5 | import numpy as np
6 | warnings.filterwarnings("ignore")
7 |
8 | class StrategyHelperFunctions:
9 | def __init__(self):
10 | print("Helper functions have been created")
11 |
12 | def random_matrix_theory_based_cov(self, returns_matrix):
13 | """
14 | This is inspired by the excellent post @ https://srome.github.io/Eigenvesting-III-Random-Matrix-Filtering-In-Finance/
15 | """
16 |
17 | # Calculate variance and std, will come in handy during reconstruction
18 | variances = np.diag(np.cov(returns_matrix))
19 | standard_deviations = np.sqrt(variances)
20 |
21 | # Get correlation matrix and compute eigen vectors and values
22 | correlation_matrix = np.corrcoef(returns_matrix)
23 | eig_values, eig_vectors = np.linalg.eigh(correlation_matrix)
24 |
25 | # Get maximum theoretical eigen value for a random matrix
26 | sigma = 1 # The variance for all of the standardized log returns is 1
27 | Q = len(returns_matrix[0]) / len(returns_matrix)
28 | max_theoretical_eval = np.power(sigma*(1 + np.sqrt(1/Q)),2)
29 |
30 | # Prune random eigen values
31 | eig_values_pruned = eig_values[eig_values > max_theoretical_eval]
32 | eig_values[eig_values <= max_theoretical_eval] = 0
33 |
34 | # Reconstruct the covariance matrix from the correlation matrix and filtered eigen values
35 | temp = np.dot(eig_vectors, np.dot(np.diag(eig_values), np.transpose(eig_vectors)))
36 | np.fill_diagonal(temp, 1)
37 | filtered_matrix = temp
38 | filtered_cov_matrix = np.dot(np.diag(standard_deviations),
39 | np.dot(filtered_matrix,np.diag(standard_deviations)))
40 |
41 | return filtered_cov_matrix
--------------------------------------------------------------------------------
/commands.json:
--------------------------------------------------------------------------------
1 | [{
2 | "comm": "--history_to_use",
3 | "type": "str",
4 | "default": "all",
5 | "help": "How many bars of 1 hour do you want to use for the anomaly detection model. Either an integer or all"
6 | },
7 | {
8 | "comm": "--data_granularity_minutes",
9 | "type": "int",
10 | "default": "15",
11 | "help": "Minute level data granularity that you want to use. Default is 60 minute bars."
12 | },
13 | {
14 | "comm": "--is_test",
15 | "type": "int",
16 | "default": "1",
17 | "help": "Whether to test the tool or just predict for future. When testing you should set the future_bars to larger than 1."
18 | },
19 | {
20 | "comm": "--future_bars",
21 | "type": "int",
22 | "default": "30",
23 | "help": "How many bars to keep for testing purposes."
24 | },
25 | {
26 | "comm": "--apply_noise_filtering",
27 | "type": "int",
28 | "default": "1",
29 | "help": "Whether to apply the random matrix theory to filter out the eigen values."
30 | },
31 | {
32 | "comm": "--only_long",
33 | "type": "int",
34 | "default": "1",
35 | "help": "Whether to only long the stocks or do both long and short."
36 | },
37 | {
38 | "comm": "--market_index",
39 | "type": "str",
40 | "default": "SPY",
41 | "help": "Which index to use for comparisons."
42 | },
43 | {
44 | "comm": "--eigen_portfolio_number",
45 | "type": "int",
46 | "default": "2",
47 | "help": "Which eigen portfolio to choose. By default the 2nd one is choosen as it gives the most risk and reward."
48 | },
49 | {
50 | "comm": "--stocks_file_path",
51 | "type": "str",
52 | "default": "stocks/stocks.txt",
53 | "help": "Stocks file that contains the list of stocks you want to build your portfolio with."
54 | }
55 | ]
--------------------------------------------------------------------------------
/strategy_manager.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import warnings
4 | from strategies.genetic_algo_strategy import GeneticAlgoStrategy
5 | from strategies.maximum_sharpe_ratio_strategy import MaximumSharpeRatioStrategy
6 | from strategies.eigen_portfolio_strategy import EigenPortfolioStrategy
7 | from strategies.minimum_variance_strategy import MinimumVarianceStrategy
8 | from strategies.strategy_helper_functions import StrategyHelperFunctions
9 | warnings.filterwarnings("ignore")
10 |
11 | class StrategyManager:
12 | """
13 | Runs and manages all strategies
14 | """
15 | def __init__(self):
16 | print("\n--= Strategy manager has been created...")
17 | self.geneticAlgoStrategy = GeneticAlgoStrategy()
18 | self.minimumVarianceStrategy = MinimumVarianceStrategy()
19 | self.eigenPortfolioStrategy = EigenPortfolioStrategy()
20 | self.maximumSharpeRatioStrategy = MaximumSharpeRatioStrategy()
21 | self.strategyHelperFunctions = StrategyHelperFunctions()
22 |
23 | def calculate_genetic_algo_portfolio(self, symbols, returns_matrix_percentages):
24 | """
25 | Genetic algorithm based portfolio that maximizes sharpe ratio. This is my own implementation
26 | """
27 | print("-* Calculating portfolio weights using genetic algorithm...")
28 | portfolio_weights_dictionary = self.geneticAlgoStrategy.generate_portfolio(symbols, returns_matrix_percentages)
29 | return portfolio_weights_dictionary
30 |
31 | def calculate_eigen_portfolio(self, symbols, covariance_matrix, eigen_portfolio_number):
32 | """
33 | 2nd Eigen Portfolio
34 | """
35 | print("-$ Calculating portfolio weights using eigen values...")
36 | portfolio_weights_dictionary = self.eigenPortfolioStrategy.generate_portfolio(symbols, covariance_matrix, eigen_portfolio_number)
37 | return portfolio_weights_dictionary
38 |
39 | def calculate_minimum_variance_portfolio(self, symbols, covariance_matrix):
40 | """
41 | Minimum variance portfolio
42 | """
43 | print("-! Calculating portfolio weights using minimum variance portfolio algorithm...")
44 | portfolio_weights_dictionary = self.minimumVarianceStrategy.generate_portfolio(symbols, covariance_matrix)
45 | return portfolio_weights_dictionary
46 |
47 | def calculate_maximum_sharpe_portfolio(self, symbols, covariance_matrix, returns_vector):
48 | """
49 | Maximum sharpe portfolio
50 | """
51 | print("-# Calculating portfolio weights using maximum sharpe portfolio algorithm...")
52 | portfolio_weights_dictionary = self.maximumSharpeRatioStrategy.generate_portfolio(symbols, covariance_matrix, returns_vector)
53 | return portfolio_weights_dictionary
54 |
55 | def random_matrix_theory_based_cov(self, returns_matrix):
56 | """
57 | Covariance matrix filtering using random matrix theory
58 | """
59 | filtered_covariance_matrix = self.strategyHelperFunctions.random_matrix_theory_based_cov(returns_matrix)
60 | return filtered_covariance_matrix
--------------------------------------------------------------------------------
/strategies/genetic_algo_strategy.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import random
4 | import warnings
5 | import numpy as np
6 | warnings.filterwarnings("ignore")
7 |
8 | class GeneticAlgoStrategy:
9 | """
10 | My own custom implementation of genetic algorithms for portfolio
11 | """
12 | def __init__(self):
13 | print("Genetic algo strategy has been created")
14 | self.initial_genes = 100
15 | self.selection_top = 25
16 | self.mutation_iterations = 50
17 | self.weight_update_factor = 0.1
18 | self.gene_length = None
19 | self.genes_in_each_iteration = 250
20 | self.iterations = 50
21 | self.crossover_probability = 0.05
22 |
23 | def generate_portfolio(self, symbols, return_matrix):
24 | self.gene_length = len(symbols)
25 |
26 | # Create initial genes
27 | initial_genes = self.generate_initial_genes(symbols)
28 |
29 | for i in range(self.iterations):
30 | # Select
31 | top_genes = self.select(return_matrix, initial_genes)
32 | #print("Iteration %d Best Sharpe Ratio: %.3f" % (i, top_genes[0][0]))
33 | top_genes = [item[1] for item in top_genes]
34 |
35 | # Mutate
36 | mutated_genes = self.mutate(top_genes)
37 | initial_genes = mutated_genes
38 |
39 | top_genes = self.select(return_matrix, initial_genes)
40 | best_gene = top_genes[0][1]
41 | transposed_gene = np.array(best_gene).transpose() # Gene is a distribution of weights for different stocks
42 | return_matrix_transposed = return_matrix.transpose()
43 | returns = np.dot(return_matrix_transposed, transposed_gene)
44 | returns_cumsum = np.cumsum(returns)
45 |
46 | ga_portfolio_weights = best_gene
47 | ga_portfolio_weights = dict([(symbols[x], ga_portfolio_weights[x]) for x in range(0, len(ga_portfolio_weights))])
48 | return ga_portfolio_weights
49 |
50 | def generate_initial_genes(self, symbols):
51 | total_symbols = len(symbols)
52 |
53 | genes = []
54 | for i in range(self.initial_genes):
55 | gene = [random.uniform(-1, 1) for _ in range(0, total_symbols)]
56 | genes.append(gene)
57 |
58 | return genes
59 |
60 | def mutate(self, genes):
61 | new_genes = []
62 |
63 | for gene in genes:
64 | for x in range(0, self.mutation_iterations):
65 | mutation = gene + (self.weight_update_factor * np.random.uniform(-1, 1, self.gene_length))
66 | mutation = list(mutation)
67 | new_genes.append(mutation)
68 |
69 | new_genes = genes + new_genes
70 | random.shuffle(new_genes)
71 | genes_to_keep = new_genes[:self.genes_in_each_iteration]
72 |
73 | # Add crossovers
74 | crossovers = self.crossover(new_genes)
75 | genes_to_keep = genes_to_keep + crossovers
76 |
77 | return genes_to_keep
78 |
79 | def select(self, return_matrix, genes):
80 | genes_with_scores = []
81 | for gene in genes:
82 | transposed_gene = np.array(gene).transpose() # Gene is a distribution of weights for different stocks
83 | return_matrix_transposed = return_matrix.transpose()
84 | returns = np.dot(return_matrix_transposed, transposed_gene)
85 | returns_cumsum = np.cumsum(returns)
86 |
87 | # Get fitness score
88 | fitness = self.fitness_score(returns)
89 | genes_with_scores.append([fitness, gene])
90 |
91 | # Sort
92 | random_genes = [self.generate_a_gene() for _ in range(5)]
93 | genes_with_scores = list(reversed(sorted(genes_with_scores)))
94 | genes_with_scores = genes_with_scores[:self.selection_top] + random_genes
95 | return genes_with_scores
96 |
97 | def fitness_score(self, returns):
98 | sharpe_returns = np.mean(returns) / np.std(returns)
99 | return sharpe_returns
100 |
101 | def generate_a_gene(self):
102 | gene = [random.uniform(-1, 1) for _ in range(self.gene_length)]
103 | return gene
104 |
105 | def crossover(self, population):
106 | crossover_population = []
107 | for z in range(0, len(population)):
108 | if random.uniform(0, 1) < self.crossover_probability:
109 | try:
110 | random_gene_first = list(random.sample(population, 1)[0])
111 | random_gene_second = list(random.sample(population, 1)[0])
112 | random_split = random.randrange(1, len(random_gene_first) - 1)
113 | crossover_gene = random_gene_first[:random_split] + random_gene_second[random_split:]
114 | crossover_population.append(crossover_gene)
115 | except Exception as e:
116 | continue
117 |
118 | return crossover_population
--------------------------------------------------------------------------------
/simulator.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import sys
4 | import math
5 | import scipy
6 | import random
7 | import collections
8 | import numpy as np
9 | import pandas as pd
10 | import scipy.stats as st
11 | import matplotlib.pyplot as plt
12 | import warnings
13 | warnings.filterwarnings("ignore")
14 |
15 | # Styling for plots
16 | plt.style.use('seaborn-white')
17 | plt.rc('grid', linestyle="dotted", color='#a0a0a0')
18 | plt.rcParams['axes.edgecolor'] = "#04383F"
19 |
20 |
21 | class MontoCarloSimulator:
22 | """
23 | Monto carlo simulator that calculates the historical returns distribution and uses it to predict the future returns
24 | """
25 |
26 | def __init__(self):
27 | print("\n--$ Simulator has been initialized")
28 |
29 | def calculate_percentage_change(self, old, new):
30 | """
31 | Percentage change
32 | """
33 | return ((new - old) * 100) / old
34 |
35 | def draw_portfolio_performance_chart(self, returns_matrix, portfolio_weights_dictionary, strategy_name):
36 | """
37 | Draw returns chart for portfolio performance
38 | """
39 |
40 | # Get portfolio returns
41 | returns_matrix = np.array(returns_matrix).transpose()
42 | portfolio_weights_vector = np.array([portfolio_weights_dictionary[symbol] for symbol in portfolio_weights_dictionary]).transpose()
43 | portfolio_returns = np.dot(returns_matrix, portfolio_weights_vector)
44 | portfolio_returns_cumulative = np.cumsum(portfolio_returns)
45 |
46 | # Plot
47 | x = np.arange(len(portfolio_returns_cumulative))
48 | plt.axhline(y = 0, linestyle = 'dotted', alpha = 0.3, color = 'black')
49 | plt.plot(x, portfolio_returns_cumulative, linewidth = 2.0, label = "Projected Returns from " + str(strategy_name))
50 | plt.title("Simulated Future Returns", fontsize = 14)
51 | plt.xlabel("Bars (Time Sorted)", fontsize = 14)
52 | plt.ylabel("Cumulative Percentage Return", fontsize = 14)
53 | plt.xticks(fontsize = 14)
54 | plt.yticks(fontsize = 14)
55 |
56 | def draw_market_performance_chart(self, actual_returns, strategy_name):
57 | """
58 | Draw actual market returns if future data is available
59 | """
60 |
61 | # Get market returns
62 | cumulative_returns = np.cumsum(actual_returns)
63 |
64 | # Plot
65 | x = np.arange(len(cumulative_returns))
66 | plt.axhline(y = 0, linestyle = 'dotted', alpha = 0.3, color = 'black')
67 | plt.plot(x, cumulative_returns, linewidth = 2.0, color = '#282828', linestyle = '--', label = "Market Index Returns")
68 | plt.title("Simulated Future Returns", fontsize = 14)
69 | plt.xlabel("Bars (Time Sorted)", fontsize = 14)
70 | plt.ylabel("Cumulative Percentage Return", fontsize = 14)
71 | plt.xticks(fontsize = 14)
72 | plt.yticks(fontsize = 14)
73 |
74 | def simulate_portfolio(self, symbol_names, portfolio_weights_dictionary, portfolio_data_dictionary, future_prices_market, test_or_predict, market_chart, strategy_name, simulation_timesteps = 25):
75 | """
76 | Simulate portfolio returns in the future
77 | """
78 | returns_matrix = []
79 | actual_returns_matrix = []
80 |
81 | # Iterate over each symbol to get their returns
82 | for symbol in symbol_names:
83 |
84 | # Get symbol returns using monte carlo
85 | historical_close_prices = list(portfolio_data_dictionary[symbol]["historical_prices"]["Close"])
86 | future_price_predictions, _ = self.simulate_and_get_future_prices(historical_close_prices, simulation_timesteps = max(simulation_timesteps, len(list(portfolio_data_dictionary[symbol]["future_prices"]))))
87 | predicted_future_returns = [self.calculate_percentage_change(future_price_predictions[i - 1], future_price_predictions[i]) for i in range(1, len(future_price_predictions))]
88 | returns_matrix.append(predicted_future_returns)
89 |
90 |
91 | # Get portfolio returns
92 | self.draw_portfolio_performance_chart(returns_matrix, portfolio_weights_dictionary, strategy_name)
93 |
94 | # Check whether we have actual future data available or not
95 | if test_or_predict == 1:
96 | future_prices_market = [item[4] for item in list(future_prices_market)]
97 | actual_future_prices_returns = [self.calculate_percentage_change(future_prices_market[i - 1], future_prices_market[i]) for i in range(1, len(future_prices_market))]
98 | if market_chart == True:
99 | # Also draw the actual future returns
100 | self.draw_market_performance_chart(actual_future_prices_returns, strategy_name)
101 |
102 | def simulate_and_get_future_prices(self, historical_prices, simulation_timesteps = 25):
103 |
104 | # Get log returns from historical data
105 | close_prices = historical_prices
106 | returns = [math.log(close_prices[i] / close_prices[i - 1]) for i in range(1, len(close_prices))]
107 |
108 | # Get distribution of returns
109 | hist = np.histogram(returns, bins = 32)
110 | hist_dist = scipy.stats.rv_histogram(hist) # Distribution function
111 |
112 | predicted_prices = []
113 | # Do 25 iterations to simulate prices
114 | for iteration in range(25):
115 | new_close_prices = [close_prices[-1]]
116 | new_close_prices_percentages = []
117 | for i in range(simulation_timesteps):
118 | random_value = random.uniform(0, 1)
119 | return_value = round(np.exp(hist_dist.ppf(random_value)), 5) # Get simulated return
120 | price_last_point = new_close_prices[-1]
121 | price_next_point = price_last_point * return_value
122 | percentage_change = self.calculate_percentage_change(price_last_point, price_next_point)
123 |
124 | # Add to list
125 | new_close_prices.append(price_next_point)
126 |
127 | predicted_prices.append(new_close_prices)
128 |
129 | # Calculate confidence intervals and average future returns. Conf intervals are not being used right now
130 | conf_intervals = st.t.interval(0.95, len(predicted_prices), loc=np.mean(predicted_prices, axis = 0), scale=st.sem(predicted_prices, axis = 0))
131 | predicted_prices_mean = np.mean(predicted_prices, axis = 0)
132 | return predicted_prices_mean, conf_intervals
133 |
134 | def is_nan(self, object):
135 | """
136 | Check if object is null
137 | """
138 | return object != object
139 |
140 |
141 |
--------------------------------------------------------------------------------
/backtester.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import sys
4 | import math
5 | import scipy
6 | import random
7 | import collections
8 | import numpy as np
9 | import pandas as pd
10 | import matplotlib.pyplot as plt
11 | import warnings
12 | warnings.filterwarnings("ignore")
13 |
14 | # Styling for plots
15 | plt.style.use('seaborn-white')
16 | plt.rc('grid', linestyle="dotted", color='#a0a0a0')
17 | plt.rcParams['axes.edgecolor'] = "#04383F"
18 |
19 |
20 | class BackTester:
21 | """
22 | Backtester module that does both backward and forward testing for our portfolios.
23 | """
24 | def __init__(self):
25 | print("\n--# Backtester has been initialized")
26 |
27 | def calculate_percentage_change(self, old, new):
28 | """
29 | Percentage change
30 | """
31 | return ((new - old) * 100) / old
32 |
33 | def portfolio_weight_manager(self, weight, is_long_only):
34 | """
35 | Manage portfolio weights. If portfolio is long only, set the negative weights to zero.
36 | """
37 | if is_long_only == 1:
38 | weight = max(weight, 0)
39 | else:
40 | weight = weight
41 | return weight
42 |
43 | def back_test(self, symbol_names, portfolio_weights_dictionary, portfolio_data_dictionary, historical_price_market, is_long_only, market_chart, strategy_name):
44 | """
45 | Main backtest function. Takes in the portfolio weights and compares the portfolio returns with a market index of your choice.
46 | """
47 |
48 | # Get market returns during the backtesting time
49 | historical_price_market = list(historical_price_market["Close"])
50 | market_returns = [self.calculate_percentage_change(historical_price_market[i - 1], historical_price_market[i]) for i in range(1, len(historical_price_market))]
51 | market_returns_cumulative = np.cumsum(market_returns)
52 |
53 | # Get invidiual returns for each stock in our portfolio
54 | normal_returns_matrix = []
55 | for symbol in symbol_names:
56 | symbol_historical_prices = list(portfolio_data_dictionary[symbol]["historical_prices"]["Close"])
57 | symbol_historical_returns = [self.calculate_percentage_change(symbol_historical_prices[i - 1], symbol_historical_prices[i]) for i in range(1, len(symbol_historical_prices))]
58 | normal_returns_matrix.append(symbol_historical_returns)
59 |
60 | # Get portfolio returns
61 | normal_returns_matrix = np.array(normal_returns_matrix).transpose()
62 | portfolio_weights_vector = np.array([self.portfolio_weight_manager(portfolio_weights_dictionary[symbol], is_long_only) for symbol in portfolio_weights_dictionary]).transpose()
63 | portfolio_returns = np.dot(normal_returns_matrix, portfolio_weights_vector)
64 | portfolio_returns_cumulative = np.cumsum(portfolio_returns)
65 |
66 | # Plot returns
67 | x = np.arange(len(portfolio_returns_cumulative))
68 | plt.plot(x, portfolio_returns_cumulative, linewidth = 2.0, label = strategy_name)
69 | plt.axhline(y = 0, linestyle = 'dotted', alpha = 0.3, color = 'black')
70 | if market_chart:
71 | x = np.arange(len(market_returns_cumulative))
72 | plt.plot(x, market_returns_cumulative, linewidth = 2.0, color = '#282828', label = 'Market Index', linestyle = '--')
73 |
74 | # Plotting styles
75 | plt.title("Backtest Results", fontsize = 14)
76 | plt.xlabel("Bars (Time Sorted)", fontsize = 14)
77 | plt.ylabel("Cumulative Percentage Return", fontsize = 14)
78 | plt.xticks(fontsize = 14)
79 | plt.yticks(fontsize = 14)
80 |
81 | def future_test(self, symbol_names, portfolio_weights_dictionary, portfolio_data_dictionary, future_price_market, is_long_only, market_chart, strategy_name):
82 | """
83 | Main future test function. If future data is available i.e is_test is set to 1 and future_bars set to > 0, this takes in the portfolio weights and compares the portfolio returns with a market index of your choice in the future.
84 | """
85 |
86 | # Get future prices
87 | future_price_market = [item[4] for item in list(future_price_market)]
88 | market_returns = [self.calculate_percentage_change(future_price_market[i - 1], future_price_market[i]) for i in range(1, len(future_price_market))]
89 | market_returns_cumulative = np.cumsum(market_returns)
90 |
91 | # Get invidiual returns for each stock in our portfolio
92 | normal_returns_matrix = []
93 | for symbol in symbol_names:
94 | symbol_historical_prices = [item[4] for item in list(portfolio_data_dictionary[symbol]["future_prices"])]
95 | symbol_historical_returns = [self.calculate_percentage_change(symbol_historical_prices[i - 1], symbol_historical_prices[i]) for i in range(1, len(symbol_historical_prices))]
96 | normal_returns_matrix.append(symbol_historical_returns)
97 |
98 | # Get portfolio returns
99 | normal_returns_matrix = np.array(normal_returns_matrix).transpose()
100 | portfolio_weights_vector = np.array([self.portfolio_weight_manager(portfolio_weights_dictionary[symbol], is_long_only) for symbol in portfolio_weights_dictionary]).transpose()
101 | portfolio_returns = np.dot(normal_returns_matrix, portfolio_weights_vector)
102 | portfolio_returns_cumulative = np.cumsum(portfolio_returns)
103 |
104 | # Plot
105 | x = np.arange(len(portfolio_returns_cumulative))
106 | plt.axhline(y = 0, linestyle = 'dotted', alpha = 0.3, color = 'black')
107 | plt.plot(x, portfolio_returns_cumulative, linewidth = 2.0, label = strategy_name)
108 | if market_chart:
109 | x = np.arange(len(market_returns_cumulative))
110 | plt.plot(x, market_returns_cumulative, linewidth = 2.0, color = '#282828', label = 'Market Index', linestyle = '--')
111 |
112 | # Plotting styles
113 | plt.title("Future Test Results", fontsize = 14)
114 | plt.xlabel("Bars (Time Sorted)", fontsize = 14)
115 | plt.ylabel("Cumulative Percentage Return", fontsize = 14)
116 | plt.xticks(fontsize = 14)
117 | plt.yticks(fontsize = 14)
118 |
--------------------------------------------------------------------------------
/data_loader.py:
--------------------------------------------------------------------------------
1 | # Basic libraries
2 | import os
3 | import collections
4 | import pandas as pd
5 | import yfinance as yf
6 | from tqdm import tqdm
7 | import warnings
8 | warnings.filterwarnings("ignore")
9 |
10 |
11 | class DataEngine:
12 | def __init__(self, args):
13 | print("\n--> Data engine has been initialized...")
14 | self.args = args
15 |
16 | # Stocks list
17 | self.directory_path = str(os.path.dirname(os.path.abspath(__file__)))
18 | self.stocks_file_path = f"{self.directory_path}/{self.args.stocks_file_path}"
19 | self.stocks_list = []
20 |
21 | # Load stock names in a list
22 | self.load_stocks_from_file()
23 |
24 | # Dictionary to store data. This will only store and save data if the argument is_save_dictionary is 1.
25 | self.data_dictionary = {}
26 |
27 | # Data length
28 | self.stock_data_length = []
29 |
30 | def load_stocks_from_file(self):
31 | """
32 | Load stock names from the file
33 | """
34 | print("Loading all stocks from file...")
35 | stocks_list = open(self.stocks_file_path, "r").readlines()
36 | stocks_list = [str(item).strip("\n") for item in stocks_list]
37 |
38 | # Load symbols
39 | stocks_list = list(sorted(set(stocks_list)))
40 | print("Total number of stocks: %d" % len(stocks_list))
41 | self.stocks_list = stocks_list
42 |
43 | def get_most_frequent_key(self, input_list):
44 | counter = collections.Counter(input_list)
45 | return list(counter.keys())[0]
46 |
47 | def get_data(self, symbol):
48 | """
49 | Get stock data from yahoo finance.
50 | """
51 | future_prices = None
52 | historical_prices = None
53 | # Find period
54 | if self.args.data_granularity_minutes == 1:
55 | period = "7d"
56 | interval = str(self.args.data_granularity_minutes) + "m"
57 | if self.args.data_granularity_minutes == 3600:
58 | period = "5y"
59 | interval = "1d"
60 | else:
61 | period = "30d"
62 | interval = str(self.args.data_granularity_minutes) + "m"
63 |
64 | # Get stock price
65 | try:
66 | # Stock price
67 | stock_prices = yf.download(
68 | tickers=symbol,
69 | period=period,
70 | interval=interval,
71 | auto_adjust=False,
72 | progress=False)
73 | stock_prices = stock_prices.reset_index()
74 | try:
75 | stock_prices = stock_prices.drop(columns=["Adj Close"])
76 | except Exception as e:
77 | print("Exception", e)
78 |
79 | data_length = stock_prices.shape[0]
80 | self.stock_data_length.append(data_length)
81 |
82 | # After getting some data, ignore partial data from yfinance
83 | # based on number of data samples
84 | if len(self.stock_data_length) > 5:
85 | most_frequent_key = self.get_most_frequent_key(
86 | self.stock_data_length)
87 | if (data_length != most_frequent_key and
88 | data_length != self.args.history_to_use and
89 | symbol != self.args.market_index): # Needs index
90 | return [], [], True
91 |
92 | if self.args.history_to_use == "all":
93 | # For some reason, yfinance gives some 0
94 | # values in the first index
95 | stock_prices = stock_prices.iloc[1:]
96 | else:
97 | stock_prices = stock_prices.iloc[-self.args.history_to_use:]
98 |
99 | if self.args.is_test == 1:
100 | future_prices = stock_prices.iloc[-self.args.future_bars:]
101 | historical_prices = stock_prices.iloc[:-self.args.future_bars]
102 | else:
103 | historical_prices = stock_prices
104 |
105 | if stock_prices.shape[0] == 0:
106 | return [], [], True
107 | except Exception as e:
108 | print("Exception", e)
109 | return [], [], True
110 |
111 | return historical_prices, future_prices.values.tolist(), False
112 |
113 | def get_market_index_price(self):
114 | """
115 | Gets market index price e.g SPY. One can change it to some other index
116 | """
117 | symbol = self.args.market_index
118 | stock_price_data, future_prices, not_found = self.get_data(symbol)
119 | if not_found:
120 | return None, None
121 |
122 | return stock_price_data, future_prices
123 |
124 | def collect_data_for_all_tickers(self):
125 | """
126 | Iterates over all symbols and collects their data
127 | """
128 |
129 | print("Loading data for all stocks...")
130 | symbol_names = []
131 | historical_price = []
132 | future_price = []
133 |
134 | # Any stock with very low volatility is ignored.
135 | # You can change this line to address that.
136 | for i in tqdm(range(len(self.stocks_list))):
137 | symbol = self.stocks_list[i]
138 | try:
139 | stock_price_data, future_prices, not_found = self.get_data(
140 | symbol)
141 | if not not_found:
142 | # Add to lists
143 | symbol_names.append(symbol)
144 | historical_price.append(stock_price_data)
145 | future_price.append(future_prices)
146 | except Exception as e:
147 | print("Exception", e)
148 | continue
149 |
150 | # Sometimes, there are some errors in feature generation or price
151 | # extraction, let us remove that stuff
152 | historical_price_info, future_price_info, symbol_names = self.remove_bad_data(
153 | historical_price, future_price, symbol_names)
154 | for i in range(0, len(symbol_names)):
155 | self.data_dictionary[symbol_names[i]] = {
156 | "historical_prices": historical_price_info[i],
157 | "future_prices": future_price_info[i]}
158 |
159 | return self.data_dictionary
160 |
161 | def remove_bad_data(self, historical_price, future_price, symbol_names):
162 | """
163 | Remove bad data i.e data that had some errors while scraping or feature generation
164 |
165 | *** This can be much more improved with dicts and filter function.
166 | """
167 |
168 | length_dictionary = collections.Counter(
169 | [i.shape[0] for i in historical_price])
170 | length_dictionary = list(length_dictionary.keys())
171 | most_common_length = length_dictionary[0]
172 |
173 | filtered_historical_price, filtered_future_prices, filtered_symbols = [], [], [],
174 | for i in range(len(future_price)):
175 | if historical_price[i].shape[0] == most_common_length:
176 | filtered_symbols.append(symbol_names[i])
177 | filtered_historical_price.append(historical_price[i])
178 | filtered_future_prices.append(future_price[i])
179 |
180 | return filtered_historical_price, filtered_future_prices, filtered_symbols
181 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | # Eiten - Algorithmic Investing Strategies for Everyone
6 | Eiten is an open source toolkit by [Tradytics](https://www.tradytics.com/) that implements various statistical and algorithmic investing strategies such as **Eigen Portfolios**, **Minimum Variance Portfolios**, **Maximum Sharpe Ratio Portfolios**, and **Genetic Algorithms** based Portfolios. It allows you to build your own portfolios with your own set of stocks that can beat the market. The rigorous testing framework included in Eiten enables you to have confidence in your portfolios.
7 |
8 | If you are looking to discuss these tools in depth and talk about more tools that we are working on, please feel free to join our [Discord](https://discord.gg/QuvE2Z8) channel where we have a bunch of more tools too.
9 |
10 | ### Files Description
11 | | Path | Description
12 | | :--- | :----------
13 | | eiten | Main folder.
14 | | └ figures | Figures for this github repositories.
15 | | └ stocks | Folder to keep your stock lists that you want to use to create your portfolios.
16 | | └ strategies | A bunch of strategies implemented in python.
17 | | backtester.py | Backtesting module that both backtests and forward tests all portfolios.
18 | | data_loader.py | Module for loading data from yahoo finance.
19 | | portfolio_manager.py | Main file that takes in a bunch of arguments and generates several portfolios for you.
20 | | simulator.py | Simulator that uses historical returns and monte carlo to simulate future prices for the portfolios.
21 | | strategy_manager.py | Manages the strategies implemented in the 'strategies' folder.
22 |
23 | ## Required Packages
24 | You will need to install the following package to train and test the models.
25 | - [Scikit-learn](https://scikit-learn.org/)
26 | - [Numpy](https://numpy.org/)
27 | - [Tqdm](https://github.com/tqdm/tqdm)
28 | - [Yfinance](https://github.com/ranaroussi/yfinance)
29 | - [Pandas](https://pandas.pydata.org/)
30 | - [Scipy](https://www.scipy.org/install.html)
31 |
32 | You can install all packages using the following command. Please note that the script was written using python3.
33 |
34 | ```
35 | pip install -r requirements.txt
36 | ```
37 |
38 | ## Build your portfolios
39 | Let us see how we can use all the strategies given in the toolkit to build our portfolios. The first thing you need to do is modify the **stocks.txt** file in the **stocks** folder and add the stocks of your choice. It is recommended to keep the list small i.e anywhere between **5 to 50** stocks should be fine. We have already put a small stocks list containing a bunch of tech stocks like AAPL, MSFT, TSLA etc. Let us build our portfolios now. This is the main command that you need to run.
40 |
41 | ```
42 | python portfolio_manager.py --is_test 1 --future_bars 90 --data_granularity_minutes 3600 --history_to_use all --apply_noise_filtering 1 --market_index QQQ --only_long 1 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt
43 | ```
44 |
45 | This command will use last 5 years of daily data excluding the last 90 days and build several portfolios for you. Based on those portfolios, it will then test them on the out of sample data of 90 days and show you the performance of each portfolio. Finally, it will also compare the performance with your choice of market index which is **QQQ** here. Let's dive into each of the parameters in detail.
46 | - **is_test**: The value determined if the program is going to keep some separate data for future testing. When this is enabled, the value of **future_bars** should be larger than 5.
47 | - **future_bars**: These are the bars that the tool will exclude during portfolio building and will forward test the portfolios on the excluded set. This is also called out of sample data.
48 | - **data_granularity_minutes**: How much granular data do you want to use to build your portfolios. For long term portfolios, you should use daily data but for short term, you can use hourly or minute level data. The possible values here are **3600, 60, 30, 15, 5, 1.** 3600 means daily.
49 | - **history_to_use**: Whether to use a specific number of historical bars or use everything that we receive from yahoo finance. For minute level data, we only receive up to one month of historical data. For daily, we receive 5 years worth of historical data. If you want to use all available data, the value should be **all** but if you want to use smaller history, you can set it to an integer value e.g **100** which will only use the last 100 bars to build the portfolios.
50 | - **apply_noise_filtering**: This uses [random matrix theory](http://faculty.baruch.cuny.edu/jgatheral/randommatrixcovariance2008.pdf) to filter out the covariance matrix from randomness thus yielding better portfolios. A value of 1 will enable it and 0 will disable it.
51 | - **market_index**: Which index do you want to use to compare your portfolios. This should mostly be **SPY** but since we analyzed tech stocks, we used **QQQ**.
52 | - **only_long**: Whether to use long only portfolio or enable short selling as well. Long only portfolios have shown to have better performance using algorithmic techniques.
53 | - **eigen_portfolio_number**: Which eigen portfolio to use. Any value between 1-5 should work. The first eigen portfolio (1) represents the market portfolio and should act just like the underlying index such as SPY or QQQ. The second one is orthogonal and uncorrelated to the market and poses the greatest risk and reward. The following ones have reduced risk and reward. Read more on [eigen-portfolios](https://srome.github.io/Eigenvesting-I-Linear-Algebra-Can-Help-You-Choose-Your-Stock-Portfolio/).
54 | - **stocks_file_path**: File that contains the list of stocks that you want to use to build your portfolio.
55 |
56 | ### Some Portfolio Building Examples
57 | Here are a few examples for building different types of portfolios.
58 | - Both **long and short** portfolios by analyzing last **90 days** data and keeping the **last 30 days** as testing data. This will give us 60 days of portfolio construction data and 30 days of testing.
59 | ```
60 | python portfolio_manager.py --is_test 1 --future_bars 30 --data_granularity_minutes 3600 --history_to_use 90 --apply_noise_filtering 1 --market_index QQQ --only_long 0 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt
61 | ```
62 | - Only **long portfolio** on **60 minute bars** of the last **30 days**. **No future testing**. Compare the results with **SPY** index instead of QQQ.
63 | ```
64 | python portfolio_manager.py --is_test 0 --future_bars 0 --data_granularity_minutes 60 --history_to_use all --apply_noise_filtering 1 --market_index SPY --only_long 1 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt
65 | ```
66 | - **Do not apply noise filtering** on the covariance matrix. Use the **first eigen portfolio** (market portfolio) and compare with SQQQ,
67 | ```
68 | python portfolio_manager.py --is_test 1 --future_bars 90 --data_granularity_minutes 3600 --history_to_use all --apply_noise_filtering 0 --market_index SQQQ --only_long 1 --eigen_portfolio_number 1 --stocks_file_path stocks/stocks.txt
69 | ```
70 |
71 | ## Portfolio Strategies
72 | Four different portfolio strategies are currently supported by the toolkit.
73 | 1. **Eigen Portfolios**
74 | 1. These portfolios are orthogonal and uncorrelated to the market in general thus yielding high reward and alpha. However, since they are uncorrelated to the market, they can also provide great risk. The first eigen portfolio is considered to be a market portfolio which is often ignored. The second one is uncorrelated to the others and provides the highest risk and reward. As we go down the numbering, the risk as well as the reward are reduced.
75 | 2. **Minimum Variance Portfolio (MVP)**
76 | 1. MVP tries to minimize the variance of the portfolio. These portfolios are lowest risk and reward.
77 | 3. **Maximum Sharpe Ratio Portfolio (MSR)**
78 | 1. MSR solves an optimization problem that tries to maximize the sharpe ratio of the portfolio. It uses past returns during the optimization process which means if past returns are not the same as future returns, the results can vary in future.
79 | 4. **Genetic Algorithm (GA) based Portfolio**
80 | 1. This is our own implementation of a GA based portfolio that again tries to maximize the sharpe ratio but in a slightly more robust way. This usually provides more robust portfolios than the others.
81 |
82 | When you run the command above, our tool will generate portfolios from all these strategies and give them to you. Let us look at some resulting portfolios.
83 |
84 | ## Resulting Portfolios
85 | For the purpose these results, we will use the 9 stocks in the stocks/stocks.txt file. When we run the above command, we first get the portfolio weights for all four strategies. For testing purposes, the above command used last five years of daily data up till April 29th. The remaining data for this year was used for forward testing i.e the portfolio strategies had no access to it when building the portfolios.
86 |
87 | **What if my portfolio needs different stocks?**: All you need to do is change the stocks in the stocks.txt file and run the tool again. Here is the final command again that we run in order to get our portfolios:
88 |
89 | ```
90 | python portfolio_manager.py --is_test 1 --future_bars 90 --data_granularity_minutes 3600 --history_to_use all --apply_noise_filtering 1 --market_index QQQ --only_long 1 --eigen_portfolio_number 3 --stocks_file_path stocks/stocks.txt
91 | ```
92 |
93 | ### Portfolio Weights
94 |
95 |
96 |
97 |
98 | We can see that the eigen portfolio is giving a large weight to TSLA while the others are dividing their weights more uniformly. An interesting phenomena happening here is the hedging with **SQQQ** that all the strategies have learned automatically. Every tool is assigning some positive weight to SQQQ while also assigning positive weights to other stocks which indicates that the strategies are automatically trying to hedge the portfolios from risk. Obviously this is not perfect, but just the fact that it's happening is fascinating. Let us look at the backtest results on the last five years prior to April 29, 2020.
99 |
100 | ### Backtest Results
101 |
102 |
103 |
104 |
105 | The backtests look pretty encouraging. The black dotted line is the market index i.e **QQQ**. Other lines are the strategies. Our custom genetic algorithm implementation seems to have the best backtest results because it's an advanced version of other strategies. The eigen portfolio that weighed TSLA the most have the most volatility but its profits are also very high. Finally, as expected, the MVP has the minimum variance and ultimately the least profits. However, since the variance is extremely low, it is a good portfolio for those who want to stay safe. The most interesting part comes next, let us look at the forward or future test results for these portfolios.
106 |
107 | ### Forward Test Results
108 |
109 |
110 |
111 |
112 | These results are from April 29th, 2020 to September 4th, 2020. The eigen portfolio performed the best but it also had a lot of volatility. Moreover, most of those returns are due to TSLA rocketing in the last few months. After that, our GA algorithm worked quite effectively as it beat the market index. Again, as expected, the MVP had the lowest risk and reward and slowly went up in 4-5 months. This shows the effectiveness and power of these algorithmic portfolio optimization strategies where we've developed different portfolios for different kinds of risk and reward profiles.
113 |
114 |
115 | ## Conclusion and Discussion
116 | We are happy to share this toolkit with the trading community and hope that people will like and contribute to it. As is the case with everything in trading, these strategies are not perfect but they are based on rigorous theory and some great empirical results. Please take care when trading with these strategies and always manage your risk. The above results were not cherry picked but the market has been highly bullish in the last few months which has led to the strong results shown above. We would love for the community to try out different strategies and share them with us.
117 |
118 | #### Special Thanks
119 | Special thanks to [Scott Rome's](https://srome.github.io/) blog. The eigen portfolios and minimum variance portfolio concepts came from his blog posts. The code for filtering eigen values of the covariance matrix was also mostly obtained from one of his posts.
120 |
121 | ## License
122 | [](https://www.gnu.org/licenses/gpl-3.0)
123 |
124 | A product by [Tradytics](https://www.tradytics.com/)
125 |
126 | Copyright (c) 2020-present, Tradytics.com
127 |
--------------------------------------------------------------------------------
/eiten.py:
--------------------------------------------------------------------------------
1 | import math
2 | import numpy as np
3 | import matplotlib.pyplot as plt
4 |
5 | # Load our modules
6 | from data_loader import DataEngine
7 | from simulator import MontoCarloSimulator
8 | from backtester import BackTester
9 | from strategy_manager import StrategyManager
10 |
11 |
12 | class Eiten:
13 | def __init__(self, args):
14 | plt.style.use('seaborn-white')
15 | plt.rc('grid', linestyle="dotted", color='#a0a0a0')
16 | plt.rcParams['axes.edgecolor'] = "#04383F"
17 | plt.rcParams['figure.figsize'] = (12, 6)
18 |
19 | print("\n--* Eiten has been initialized...")
20 | self.args = args
21 |
22 | # Create data engine
23 | self.dataEngine = DataEngine(args)
24 |
25 | # Monto carlo simulator
26 | self.simulator = MontoCarloSimulator()
27 |
28 | # Strategy manager
29 | self.strategyManager = StrategyManager()
30 |
31 | # Back tester
32 | self.backTester = BackTester()
33 |
34 | # Data dictionary
35 | self.data_dictionary = {}
36 |
37 | print('\n')
38 |
39 | def calculate_percentage_change(self, old, new):
40 | """
41 | Calculate percentage change
42 | """
43 | return ((new - old) * 100) / old
44 |
45 | def create_returns(self, historical_price_info):
46 | """
47 | Create log return matrix, percentage return matrix, and mean return
48 | vector
49 | """
50 |
51 | returns_matrix = []
52 | returns_matrix_percentages = []
53 | predicted_return_vectors = []
54 | for i in range(0, len(historical_price_info)):
55 | close_prices = list(historical_price_info[i]["Close"])
56 | log_returns = [math.log(close_prices[i] / close_prices[i - 1])
57 | for i in range(1, len(close_prices))]
58 | percentage_returns = [self.calculate_percentage_change(
59 | close_prices[i - 1], close_prices[i]) for i in range(1, len(close_prices))]
60 |
61 | total_data = len(close_prices)
62 |
63 | # Expected returns in future. We can either use historical returns as future returns on try to simulate future returns and take the mean. For simulation, you can modify the functions in simulator to use here.
64 | future_expected_returns = np.mean([(self.calculate_percentage_change(close_prices[i - 1], close_prices[i])) / (
65 | total_data - i) for i in range(1, len(close_prices))]) # More focus on recent returns
66 |
67 | # Add to matrices
68 | returns_matrix.append(log_returns)
69 | returns_matrix_percentages.append(percentage_returns)
70 |
71 | # Add returns to vector
72 | # Assuming that future returns are similar to past returns
73 | predicted_return_vectors.append(future_expected_returns)
74 |
75 | # Convert to numpy arrays for one liner calculations
76 | predicted_return_vectors = np.array(predicted_return_vectors)
77 | returns_matrix = np.array(returns_matrix)
78 | returns_matrix_percentages = np.array(returns_matrix_percentages)
79 |
80 | return predicted_return_vectors, returns_matrix, returns_matrix_percentages
81 |
82 | def load_data(self):
83 | """
84 | Loads data needed for analysis
85 | """
86 | # Gather data for all stocks in a dictionary format
87 | # Dictionary keys will be -> historical_prices, future_prices
88 | self.data_dictionary = self.dataEngine.collect_data_for_all_tickers()
89 |
90 | # Add data to lists
91 | symbol_names = list(sorted(self.data_dictionary.keys()))
92 | historical_price_info, future_prices = [], []
93 | for symbol in symbol_names:
94 | historical_price_info.append(
95 | self.data_dictionary[symbol]["historical_prices"])
96 | future_prices.append(self.data_dictionary[symbol]["future_prices"])
97 |
98 | # Get return matrices and vectors
99 | predicted_return_vectors, returns_matrix, returns_matrix_percentages = self.create_returns(
100 | historical_price_info)
101 | return historical_price_info, future_prices, symbol_names, predicted_return_vectors, returns_matrix, returns_matrix_percentages
102 |
103 | def run_strategies(self):
104 | """
105 | Run strategies, back and future test them, and simulate the returns.
106 | """
107 | historical_price_info, future_prices, symbol_names, predicted_return_vectors, returns_matrix, returns_matrix_percentages = self.load_data()
108 | historical_price_market, future_prices_market = self.dataEngine.get_market_index_price()
109 |
110 | # Calculate covariance matrix
111 | covariance_matrix = np.cov(returns_matrix)
112 |
113 | # Use random matrix theory to filter out the noisy eigen values
114 | if self.args.apply_noise_filtering:
115 | print(
116 | "\n** Applying random matrix theory to filter out noise in the covariance matrix...\n")
117 | covariance_matrix = self.strategyManager.random_matrix_theory_based_cov(
118 | returns_matrix)
119 |
120 | # Get weights for the portfolio
121 | eigen_portfolio_weights_dictionary = self.strategyManager.calculate_eigen_portfolio(
122 | symbol_names, covariance_matrix, self.args.eigen_portfolio_number)
123 | mvp_portfolio_weights_dictionary = self.strategyManager.calculate_minimum_variance_portfolio(
124 | symbol_names, covariance_matrix)
125 | msr_portfolio_weights_dictionary = self.strategyManager.calculate_maximum_sharpe_portfolio(
126 | symbol_names, covariance_matrix, predicted_return_vectors)
127 | ga_portfolio_weights_dictionary = self.strategyManager.calculate_genetic_algo_portfolio(
128 | symbol_names, returns_matrix_percentages)
129 |
130 | # Print weights
131 | print("\n*% Printing portfolio weights...")
132 | self.print_and_plot_portfolio_weights(
133 | eigen_portfolio_weights_dictionary, 'Eigen Portfolio', plot_num=1)
134 | self.print_and_plot_portfolio_weights(
135 | mvp_portfolio_weights_dictionary, 'Minimum Variance Portfolio (MVP)', plot_num=2)
136 | self.print_and_plot_portfolio_weights(
137 | msr_portfolio_weights_dictionary, 'Maximum Sharpe Portfolio (MSR)', plot_num=3)
138 | self.print_and_plot_portfolio_weights(
139 | ga_portfolio_weights_dictionary, 'Genetic Algo (GA)', plot_num=4)
140 | self.draw_plot("output/weights.png")
141 |
142 | # Back test
143 | print("\n*& Backtesting the portfolios...")
144 | self.backTester.back_test(symbol_names, eigen_portfolio_weights_dictionary,
145 | self.data_dictionary,
146 | historical_price_market,
147 | self.args.only_long,
148 | market_chart=True,
149 | strategy_name='Eigen Portfolio')
150 | self.backTester.back_test(symbol_names,
151 | mvp_portfolio_weights_dictionary,
152 | self.data_dictionary, historical_price_market,
153 | self.args.only_long,
154 | market_chart=False,
155 | strategy_name='Minimum Variance Portfolio (MVP)')
156 | self.backTester.back_test(symbol_names, msr_portfolio_weights_dictionary,
157 | self.data_dictionary,
158 | historical_price_market,
159 | self.args.only_long,
160 | market_chart=False,
161 | strategy_name='Maximum Sharpe Portfolio (MSR)')
162 | self.backTester.back_test(symbol_names,
163 | ga_portfolio_weights_dictionary,
164 | self.data_dictionary,
165 | historical_price_market,
166 | self.args.only_long,
167 | market_chart=False,
168 | strategy_name='Genetic Algo (GA)')
169 | self.draw_plot("output/backtest.png")
170 |
171 | if self.args.is_test:
172 | print("\n#^ Future testing the portfolios...")
173 | # Future test
174 | self.backTester.future_test(symbol_names,
175 | eigen_portfolio_weights_dictionary,
176 | self.data_dictionary,
177 | future_prices_market,
178 | self.args.only_long,
179 | market_chart=True,
180 | strategy_name='Eigen Portfolio')
181 | self.backTester.future_test(symbol_names,
182 | mvp_portfolio_weights_dictionary,
183 | self.data_dictionary,
184 | future_prices_market,
185 | self.args.only_long,
186 | market_chart=False,
187 | strategy_name='Minimum Variance Portfolio (MVP)')
188 | self.backTester.future_test(symbol_names,
189 | msr_portfolio_weights_dictionary,
190 | self.data_dictionary,
191 | future_prices_market,
192 | self.args.only_long,
193 | market_chart=False,
194 | strategy_name='Maximum Sharpe Portfolio (MSR)')
195 | self.backTester.future_test(symbol_names,
196 | ga_portfolio_weights_dictionary,
197 | self.data_dictionary,
198 | future_prices_market,
199 | self.args.only_long,
200 | market_chart=False,
201 | strategy_name='Genetic Algo (GA)')
202 | self.draw_plot("output/future_tests.png")
203 |
204 | # Simulation
205 | print("\n+$ Simulating future prices using monte carlo...")
206 | self.simulator.simulate_portfolio(symbol_names,
207 | eigen_portfolio_weights_dictionary,
208 | self.data_dictionary,
209 | future_prices_market,
210 | self.args.is_test,
211 | market_chart=True,
212 | strategy_name='Eigen Portfolio')
213 | self.simulator.simulate_portfolio(symbol_names,
214 | eigen_portfolio_weights_dictionary,
215 | self.data_dictionary,
216 | future_prices_market,
217 | self.args.is_test,
218 | market_chart=False,
219 | strategy_name='Minimum Variance Portfolio (MVP)')
220 | self.simulator.simulate_portfolio(symbol_names,
221 | eigen_portfolio_weights_dictionary,
222 | self.data_dictionary,
223 | future_prices_market,
224 | self.args.is_test,
225 | market_chart=False,
226 | strategy_name='Maximum Sharpe Portfolio (MSR)')
227 | self.simulator.simulate_portfolio(symbol_names,
228 | ga_portfolio_weights_dictionary,
229 | self.data_dictionary,
230 | future_prices_market,
231 | self.args.is_test,
232 | market_chart=False,
233 | strategy_name='Genetic Algo (GA)')
234 | self.draw_plot("output/monte_carlo.png")
235 |
236 | def draw_plot(self, filename="output/graph.png"):
237 | """
238 | Draw plots
239 | """
240 | # Styling for plots
241 |
242 | plt.grid()
243 | plt.legend(fontsize=14)
244 | plt.tight_layout()
245 | plt.show()
246 |
247 | """if self.args.save_plot:
248 | plt.savefig(filename)
249 | else:
250 | plt.tight_layout()
251 | plt.show()""" # Plots were not being generated properly. Need to fix this.
252 |
253 | def print_and_plot_portfolio_weights(self, weights_dictionary: dict, strategy, plot_num: int) -> None:
254 | print("\n-------- Weights for %s --------" % strategy)
255 | symbols = list(sorted(weights_dictionary.keys()))
256 | symbol_weights = []
257 | for symbol in symbols:
258 | print("Symbol: %s, Weight: %.4f" %
259 | (symbol, weights_dictionary[symbol]))
260 | symbol_weights.append(weights_dictionary[symbol])
261 |
262 | # Plot
263 | width = 0.1
264 | x = np.arange(len(symbol_weights))
265 | plt.bar(x + (width * (plot_num - 1)) + 0.05,
266 | symbol_weights, label=strategy, width=width)
267 | plt.xticks(x, symbols, fontsize=14)
268 | plt.yticks(fontsize=14)
269 | plt.xlabel("Symbols", fontsize=14)
270 | plt.ylabel("Weight in Portfolio", fontsize=14)
271 | plt.title("Portfolio Weights for Different Strategies", fontsize=14)
272 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | GNU GENERAL PUBLIC LICENSE
2 | Version 3, 29 June 2007
3 |
4 | Copyright (C) 2007 Free Software Foundation, Inc.
5 | Everyone is permitted to copy and distribute verbatim copies
6 | of this license document, but changing it is not allowed.
7 |
8 | Preamble
9 |
10 | The GNU General Public License is a free, copyleft license for
11 | software and other kinds of works.
12 |
13 | The licenses for most software and other practical works are designed
14 | to take away your freedom to share and change the works. By contrast,
15 | the GNU General Public License is intended to guarantee your freedom to
16 | share and change all versions of a program--to make sure it remains free
17 | software for all its users. We, the Free Software Foundation, use the
18 | GNU General Public License for most of our software; it applies also to
19 | any other work released this way by its authors. You can apply it to
20 | your programs, too.
21 |
22 | When we speak of free software, we are referring to freedom, not
23 | price. Our General Public Licenses are designed to make sure that you
24 | have the freedom to distribute copies of free software (and charge for
25 | them if you wish), that you receive source code or can get it if you
26 | want it, that you can change the software or use pieces of it in new
27 | free programs, and that you know you can do these things.
28 |
29 | To protect your rights, we need to prevent others from denying you
30 | these rights or asking you to surrender the rights. Therefore, you have
31 | certain responsibilities if you distribute copies of the software, or if
32 | you modify it: responsibilities to respect the freedom of others.
33 |
34 | For example, if you distribute copies of such a program, whether
35 | gratis or for a fee, you must pass on to the recipients the same
36 | freedoms that you received. You must make sure that they, too, receive
37 | or can get the source code. And you must show them these terms so they
38 | know their rights.
39 |
40 | Developers that use the GNU GPL protect your rights with two steps:
41 | (1) assert copyright on the software, and (2) offer you this License
42 | giving you legal permission to copy, distribute and/or modify it.
43 |
44 | For the developers' and authors' protection, the GPL clearly explains
45 | that there is no warranty for this free software. For both users' and
46 | authors' sake, the GPL requires that modified versions be marked as
47 | changed, so that their problems will not be attributed erroneously to
48 | authors of previous versions.
49 |
50 | Some devices are designed to deny users access to install or run
51 | modified versions of the software inside them, although the manufacturer
52 | can do so. This is fundamentally incompatible with the aim of
53 | protecting users' freedom to change the software. The systematic
54 | pattern of such abuse occurs in the area of products for individuals to
55 | use, which is precisely where it is most unacceptable. Therefore, we
56 | have designed this version of the GPL to prohibit the practice for those
57 | products. If such problems arise substantially in other domains, we
58 | stand ready to extend this provision to those domains in future versions
59 | of the GPL, as needed to protect the freedom of users.
60 |
61 | Finally, every program is threatened constantly by software patents.
62 | States should not allow patents to restrict development and use of
63 | software on general-purpose computers, but in those that do, we wish to
64 | avoid the special danger that patents applied to a free program could
65 | make it effectively proprietary. To prevent this, the GPL assures that
66 | patents cannot be used to render the program non-free.
67 |
68 | The precise terms and conditions for copying, distribution and
69 | modification follow.
70 |
71 | TERMS AND CONDITIONS
72 |
73 | 0. Definitions.
74 |
75 | "This License" refers to version 3 of the GNU General Public License.
76 |
77 | "Copyright" also means copyright-like laws that apply to other kinds of
78 | works, such as semiconductor masks.
79 |
80 | "The Program" refers to any copyrightable work licensed under this
81 | License. Each licensee is addressed as "you". "Licensees" and
82 | "recipients" may be individuals or organizations.
83 |
84 | To "modify" a work means to copy from or adapt all or part of the work
85 | in a fashion requiring copyright permission, other than the making of an
86 | exact copy. The resulting work is called a "modified version" of the
87 | earlier work or a work "based on" the earlier work.
88 |
89 | A "covered work" means either the unmodified Program or a work based
90 | on the Program.
91 |
92 | To "propagate" a work means to do anything with it that, without
93 | permission, would make you directly or secondarily liable for
94 | infringement under applicable copyright law, except executing it on a
95 | computer or modifying a private copy. Propagation includes copying,
96 | distribution (with or without modification), making available to the
97 | public, and in some countries other activities as well.
98 |
99 | To "convey" a work means any kind of propagation that enables other
100 | parties to make or receive copies. Mere interaction with a user through
101 | a computer network, with no transfer of a copy, is not conveying.
102 |
103 | An interactive user interface displays "Appropriate Legal Notices"
104 | to the extent that it includes a convenient and prominently visible
105 | feature that (1) displays an appropriate copyright notice, and (2)
106 | tells the user that there is no warranty for the work (except to the
107 | extent that warranties are provided), that licensees may convey the
108 | work under this License, and how to view a copy of this License. If
109 | the interface presents a list of user commands or options, such as a
110 | menu, a prominent item in the list meets this criterion.
111 |
112 | 1. Source Code.
113 |
114 | The "source code" for a work means the preferred form of the work
115 | for making modifications to it. "Object code" means any non-source
116 | form of a work.
117 |
118 | A "Standard Interface" means an interface that either is an official
119 | standard defined by a recognized standards body, or, in the case of
120 | interfaces specified for a particular programming language, one that
121 | is widely used among developers working in that language.
122 |
123 | The "System Libraries" of an executable work include anything, other
124 | than the work as a whole, that (a) is included in the normal form of
125 | packaging a Major Component, but which is not part of that Major
126 | Component, and (b) serves only to enable use of the work with that
127 | Major Component, or to implement a Standard Interface for which an
128 | implementation is available to the public in source code form. A
129 | "Major Component", in this context, means a major essential component
130 | (kernel, window system, and so on) of the specific operating system
131 | (if any) on which the executable work runs, or a compiler used to
132 | produce the work, or an object code interpreter used to run it.
133 |
134 | The "Corresponding Source" for a work in object code form means all
135 | the source code needed to generate, install, and (for an executable
136 | work) run the object code and to modify the work, including scripts to
137 | control those activities. However, it does not include the work's
138 | System Libraries, or general-purpose tools or generally available free
139 | programs which are used unmodified in performing those activities but
140 | which are not part of the work. For example, Corresponding Source
141 | includes interface definition files associated with source files for
142 | the work, and the source code for shared libraries and dynamically
143 | linked subprograms that the work is specifically designed to require,
144 | such as by intimate data communication or control flow between those
145 | subprograms and other parts of the work.
146 |
147 | The Corresponding Source need not include anything that users
148 | can regenerate automatically from other parts of the Corresponding
149 | Source.
150 |
151 | The Corresponding Source for a work in source code form is that
152 | same work.
153 |
154 | 2. Basic Permissions.
155 |
156 | All rights granted under this License are granted for the term of
157 | copyright on the Program, and are irrevocable provided the stated
158 | conditions are met. This License explicitly affirms your unlimited
159 | permission to run the unmodified Program. The output from running a
160 | covered work is covered by this License only if the output, given its
161 | content, constitutes a covered work. This License acknowledges your
162 | rights of fair use or other equivalent, as provided by copyright law.
163 |
164 | You may make, run and propagate covered works that you do not
165 | convey, without conditions so long as your license otherwise remains
166 | in force. You may convey covered works to others for the sole purpose
167 | of having them make modifications exclusively for you, or provide you
168 | with facilities for running those works, provided that you comply with
169 | the terms of this License in conveying all material for which you do
170 | not control copyright. Those thus making or running the covered works
171 | for you must do so exclusively on your behalf, under your direction
172 | and control, on terms that prohibit them from making any copies of
173 | your copyrighted material outside their relationship with you.
174 |
175 | Conveying under any other circumstances is permitted solely under
176 | the conditions stated below. Sublicensing is not allowed; section 10
177 | makes it unnecessary.
178 |
179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180 |
181 | No covered work shall be deemed part of an effective technological
182 | measure under any applicable law fulfilling obligations under article
183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184 | similar laws prohibiting or restricting circumvention of such
185 | measures.
186 |
187 | When you convey a covered work, you waive any legal power to forbid
188 | circumvention of technological measures to the extent such circumvention
189 | is effected by exercising rights under this License with respect to
190 | the covered work, and you disclaim any intention to limit operation or
191 | modification of the work as a means of enforcing, against the work's
192 | users, your or third parties' legal rights to forbid circumvention of
193 | technological measures.
194 |
195 | 4. Conveying Verbatim Copies.
196 |
197 | You may convey verbatim copies of the Program's source code as you
198 | receive it, in any medium, provided that you conspicuously and
199 | appropriately publish on each copy an appropriate copyright notice;
200 | keep intact all notices stating that this License and any
201 | non-permissive terms added in accord with section 7 apply to the code;
202 | keep intact all notices of the absence of any warranty; and give all
203 | recipients a copy of this License along with the Program.
204 |
205 | You may charge any price or no price for each copy that you convey,
206 | and you may offer support or warranty protection for a fee.
207 |
208 | 5. Conveying Modified Source Versions.
209 |
210 | You may convey a work based on the Program, or the modifications to
211 | produce it from the Program, in the form of source code under the
212 | terms of section 4, provided that you also meet all of these conditions:
213 |
214 | a) The work must carry prominent notices stating that you modified
215 | it, and giving a relevant date.
216 |
217 | b) The work must carry prominent notices stating that it is
218 | released under this License and any conditions added under section
219 | 7. This requirement modifies the requirement in section 4 to
220 | "keep intact all notices".
221 |
222 | c) You must license the entire work, as a whole, under this
223 | License to anyone who comes into possession of a copy. This
224 | License will therefore apply, along with any applicable section 7
225 | additional terms, to the whole of the work, and all its parts,
226 | regardless of how they are packaged. This License gives no
227 | permission to license the work in any other way, but it does not
228 | invalidate such permission if you have separately received it.
229 |
230 | d) If the work has interactive user interfaces, each must display
231 | Appropriate Legal Notices; however, if the Program has interactive
232 | interfaces that do not display Appropriate Legal Notices, your
233 | work need not make them do so.
234 |
235 | A compilation of a covered work with other separate and independent
236 | works, which are not by their nature extensions of the covered work,
237 | and which are not combined with it such as to form a larger program,
238 | in or on a volume of a storage or distribution medium, is called an
239 | "aggregate" if the compilation and its resulting copyright are not
240 | used to limit the access or legal rights of the compilation's users
241 | beyond what the individual works permit. Inclusion of a covered work
242 | in an aggregate does not cause this License to apply to the other
243 | parts of the aggregate.
244 |
245 | 6. Conveying Non-Source Forms.
246 |
247 | You may convey a covered work in object code form under the terms
248 | of sections 4 and 5, provided that you also convey the
249 | machine-readable Corresponding Source under the terms of this License,
250 | in one of these ways:
251 |
252 | a) Convey the object code in, or embodied in, a physical product
253 | (including a physical distribution medium), accompanied by the
254 | Corresponding Source fixed on a durable physical medium
255 | customarily used for software interchange.
256 |
257 | b) Convey the object code in, or embodied in, a physical product
258 | (including a physical distribution medium), accompanied by a
259 | written offer, valid for at least three years and valid for as
260 | long as you offer spare parts or customer support for that product
261 | model, to give anyone who possesses the object code either (1) a
262 | copy of the Corresponding Source for all the software in the
263 | product that is covered by this License, on a durable physical
264 | medium customarily used for software interchange, for a price no
265 | more than your reasonable cost of physically performing this
266 | conveying of source, or (2) access to copy the
267 | Corresponding Source from a network server at no charge.
268 |
269 | c) Convey individual copies of the object code with a copy of the
270 | written offer to provide the Corresponding Source. This
271 | alternative is allowed only occasionally and noncommercially, and
272 | only if you received the object code with such an offer, in accord
273 | with subsection 6b.
274 |
275 | d) Convey the object code by offering access from a designated
276 | place (gratis or for a charge), and offer equivalent access to the
277 | Corresponding Source in the same way through the same place at no
278 | further charge. You need not require recipients to copy the
279 | Corresponding Source along with the object code. If the place to
280 | copy the object code is a network server, the Corresponding Source
281 | may be on a different server (operated by you or a third party)
282 | that supports equivalent copying facilities, provided you maintain
283 | clear directions next to the object code saying where to find the
284 | Corresponding Source. Regardless of what server hosts the
285 | Corresponding Source, you remain obligated to ensure that it is
286 | available for as long as needed to satisfy these requirements.
287 |
288 | e) Convey the object code using peer-to-peer transmission, provided
289 | you inform other peers where the object code and Corresponding
290 | Source of the work are being offered to the general public at no
291 | charge under subsection 6d.
292 |
293 | A separable portion of the object code, whose source code is excluded
294 | from the Corresponding Source as a System Library, need not be
295 | included in conveying the object code work.
296 |
297 | A "User Product" is either (1) a "consumer product", which means any
298 | tangible personal property which is normally used for personal, family,
299 | or household purposes, or (2) anything designed or sold for incorporation
300 | into a dwelling. In determining whether a product is a consumer product,
301 | doubtful cases shall be resolved in favor of coverage. For a particular
302 | product received by a particular user, "normally used" refers to a
303 | typical or common use of that class of product, regardless of the status
304 | of the particular user or of the way in which the particular user
305 | actually uses, or expects or is expected to use, the product. A product
306 | is a consumer product regardless of whether the product has substantial
307 | commercial, industrial or non-consumer uses, unless such uses represent
308 | the only significant mode of use of the product.
309 |
310 | "Installation Information" for a User Product means any methods,
311 | procedures, authorization keys, or other information required to install
312 | and execute modified versions of a covered work in that User Product from
313 | a modified version of its Corresponding Source. The information must
314 | suffice to ensure that the continued functioning of the modified object
315 | code is in no case prevented or interfered with solely because
316 | modification has been made.
317 |
318 | If you convey an object code work under this section in, or with, or
319 | specifically for use in, a User Product, and the conveying occurs as
320 | part of a transaction in which the right of possession and use of the
321 | User Product is transferred to the recipient in perpetuity or for a
322 | fixed term (regardless of how the transaction is characterized), the
323 | Corresponding Source conveyed under this section must be accompanied
324 | by the Installation Information. But this requirement does not apply
325 | if neither you nor any third party retains the ability to install
326 | modified object code on the User Product (for example, the work has
327 | been installed in ROM).
328 |
329 | The requirement to provide Installation Information does not include a
330 | requirement to continue to provide support service, warranty, or updates
331 | for a work that has been modified or installed by the recipient, or for
332 | the User Product in which it has been modified or installed. Access to a
333 | network may be denied when the modification itself materially and
334 | adversely affects the operation of the network or violates the rules and
335 | protocols for communication across the network.
336 |
337 | Corresponding Source conveyed, and Installation Information provided,
338 | in accord with this section must be in a format that is publicly
339 | documented (and with an implementation available to the public in
340 | source code form), and must require no special password or key for
341 | unpacking, reading or copying.
342 |
343 | 7. Additional Terms.
344 |
345 | "Additional permissions" are terms that supplement the terms of this
346 | License by making exceptions from one or more of its conditions.
347 | Additional permissions that are applicable to the entire Program shall
348 | be treated as though they were included in this License, to the extent
349 | that they are valid under applicable law. If additional permissions
350 | apply only to part of the Program, that part may be used separately
351 | under those permissions, but the entire Program remains governed by
352 | this License without regard to the additional permissions.
353 |
354 | When you convey a copy of a covered work, you may at your option
355 | remove any additional permissions from that copy, or from any part of
356 | it. (Additional permissions may be written to require their own
357 | removal in certain cases when you modify the work.) You may place
358 | additional permissions on material, added by you to a covered work,
359 | for which you have or can give appropriate copyright permission.
360 |
361 | Notwithstanding any other provision of this License, for material you
362 | add to a covered work, you may (if authorized by the copyright holders of
363 | that material) supplement the terms of this License with terms:
364 |
365 | a) Disclaiming warranty or limiting liability differently from the
366 | terms of sections 15 and 16 of this License; or
367 |
368 | b) Requiring preservation of specified reasonable legal notices or
369 | author attributions in that material or in the Appropriate Legal
370 | Notices displayed by works containing it; or
371 |
372 | c) Prohibiting misrepresentation of the origin of that material, or
373 | requiring that modified versions of such material be marked in
374 | reasonable ways as different from the original version; or
375 |
376 | d) Limiting the use for publicity purposes of names of licensors or
377 | authors of the material; or
378 |
379 | e) Declining to grant rights under trademark law for use of some
380 | trade names, trademarks, or service marks; or
381 |
382 | f) Requiring indemnification of licensors and authors of that
383 | material by anyone who conveys the material (or modified versions of
384 | it) with contractual assumptions of liability to the recipient, for
385 | any liability that these contractual assumptions directly impose on
386 | those licensors and authors.
387 |
388 | All other non-permissive additional terms are considered "further
389 | restrictions" within the meaning of section 10. If the Program as you
390 | received it, or any part of it, contains a notice stating that it is
391 | governed by this License along with a term that is a further
392 | restriction, you may remove that term. If a license document contains
393 | a further restriction but permits relicensing or conveying under this
394 | License, you may add to a covered work material governed by the terms
395 | of that license document, provided that the further restriction does
396 | not survive such relicensing or conveying.
397 |
398 | If you add terms to a covered work in accord with this section, you
399 | must place, in the relevant source files, a statement of the
400 | additional terms that apply to those files, or a notice indicating
401 | where to find the applicable terms.
402 |
403 | Additional terms, permissive or non-permissive, may be stated in the
404 | form of a separately written license, or stated as exceptions;
405 | the above requirements apply either way.
406 |
407 | 8. Termination.
408 |
409 | You may not propagate or modify a covered work except as expressly
410 | provided under this License. Any attempt otherwise to propagate or
411 | modify it is void, and will automatically terminate your rights under
412 | this License (including any patent licenses granted under the third
413 | paragraph of section 11).
414 |
415 | However, if you cease all violation of this License, then your
416 | license from a particular copyright holder is reinstated (a)
417 | provisionally, unless and until the copyright holder explicitly and
418 | finally terminates your license, and (b) permanently, if the copyright
419 | holder fails to notify you of the violation by some reasonable means
420 | prior to 60 days after the cessation.
421 |
422 | Moreover, your license from a particular copyright holder is
423 | reinstated permanently if the copyright holder notifies you of the
424 | violation by some reasonable means, this is the first time you have
425 | received notice of violation of this License (for any work) from that
426 | copyright holder, and you cure the violation prior to 30 days after
427 | your receipt of the notice.
428 |
429 | Termination of your rights under this section does not terminate the
430 | licenses of parties who have received copies or rights from you under
431 | this License. If your rights have been terminated and not permanently
432 | reinstated, you do not qualify to receive new licenses for the same
433 | material under section 10.
434 |
435 | 9. Acceptance Not Required for Having Copies.
436 |
437 | You are not required to accept this License in order to receive or
438 | run a copy of the Program. Ancillary propagation of a covered work
439 | occurring solely as a consequence of using peer-to-peer transmission
440 | to receive a copy likewise does not require acceptance. However,
441 | nothing other than this License grants you permission to propagate or
442 | modify any covered work. These actions infringe copyright if you do
443 | not accept this License. Therefore, by modifying or propagating a
444 | covered work, you indicate your acceptance of this License to do so.
445 |
446 | 10. Automatic Licensing of Downstream Recipients.
447 |
448 | Each time you convey a covered work, the recipient automatically
449 | receives a license from the original licensors, to run, modify and
450 | propagate that work, subject to this License. You are not responsible
451 | for enforcing compliance by third parties with this License.
452 |
453 | An "entity transaction" is a transaction transferring control of an
454 | organization, or substantially all assets of one, or subdividing an
455 | organization, or merging organizations. If propagation of a covered
456 | work results from an entity transaction, each party to that
457 | transaction who receives a copy of the work also receives whatever
458 | licenses to the work the party's predecessor in interest had or could
459 | give under the previous paragraph, plus a right to possession of the
460 | Corresponding Source of the work from the predecessor in interest, if
461 | the predecessor has it or can get it with reasonable efforts.
462 |
463 | You may not impose any further restrictions on the exercise of the
464 | rights granted or affirmed under this License. For example, you may
465 | not impose a license fee, royalty, or other charge for exercise of
466 | rights granted under this License, and you may not initiate litigation
467 | (including a cross-claim or counterclaim in a lawsuit) alleging that
468 | any patent claim is infringed by making, using, selling, offering for
469 | sale, or importing the Program or any portion of it.
470 |
471 | 11. Patents.
472 |
473 | A "contributor" is a copyright holder who authorizes use under this
474 | License of the Program or a work on which the Program is based. The
475 | work thus licensed is called the contributor's "contributor version".
476 |
477 | A contributor's "essential patent claims" are all patent claims
478 | owned or controlled by the contributor, whether already acquired or
479 | hereafter acquired, that would be infringed by some manner, permitted
480 | by this License, of making, using, or selling its contributor version,
481 | but do not include claims that would be infringed only as a
482 | consequence of further modification of the contributor version. For
483 | purposes of this definition, "control" includes the right to grant
484 | patent sublicenses in a manner consistent with the requirements of
485 | this License.
486 |
487 | Each contributor grants you a non-exclusive, worldwide, royalty-free
488 | patent license under the contributor's essential patent claims, to
489 | make, use, sell, offer for sale, import and otherwise run, modify and
490 | propagate the contents of its contributor version.
491 |
492 | In the following three paragraphs, a "patent license" is any express
493 | agreement or commitment, however denominated, not to enforce a patent
494 | (such as an express permission to practice a patent or covenant not to
495 | sue for patent infringement). To "grant" such a patent license to a
496 | party means to make such an agreement or commitment not to enforce a
497 | patent against the party.
498 |
499 | If you convey a covered work, knowingly relying on a patent license,
500 | and the Corresponding Source of the work is not available for anyone
501 | to copy, free of charge and under the terms of this License, through a
502 | publicly available network server or other readily accessible means,
503 | then you must either (1) cause the Corresponding Source to be so
504 | available, or (2) arrange to deprive yourself of the benefit of the
505 | patent license for this particular work, or (3) arrange, in a manner
506 | consistent with the requirements of this License, to extend the patent
507 | license to downstream recipients. "Knowingly relying" means you have
508 | actual knowledge that, but for the patent license, your conveying the
509 | covered work in a country, or your recipient's use of the covered work
510 | in a country, would infringe one or more identifiable patents in that
511 | country that you have reason to believe are valid.
512 |
513 | If, pursuant to or in connection with a single transaction or
514 | arrangement, you convey, or propagate by procuring conveyance of, a
515 | covered work, and grant a patent license to some of the parties
516 | receiving the covered work authorizing them to use, propagate, modify
517 | or convey a specific copy of the covered work, then the patent license
518 | you grant is automatically extended to all recipients of the covered
519 | work and works based on it.
520 |
521 | A patent license is "discriminatory" if it does not include within
522 | the scope of its coverage, prohibits the exercise of, or is
523 | conditioned on the non-exercise of one or more of the rights that are
524 | specifically granted under this License. You may not convey a covered
525 | work if you are a party to an arrangement with a third party that is
526 | in the business of distributing software, under which you make payment
527 | to the third party based on the extent of your activity of conveying
528 | the work, and under which the third party grants, to any of the
529 | parties who would receive the covered work from you, a discriminatory
530 | patent license (a) in connection with copies of the covered work
531 | conveyed by you (or copies made from those copies), or (b) primarily
532 | for and in connection with specific products or compilations that
533 | contain the covered work, unless you entered into that arrangement,
534 | or that patent license was granted, prior to 28 March 2007.
535 |
536 | Nothing in this License shall be construed as excluding or limiting
537 | any implied license or other defenses to infringement that may
538 | otherwise be available to you under applicable patent law.
539 |
540 | 12. No Surrender of Others' Freedom.
541 |
542 | If conditions are imposed on you (whether by court order, agreement or
543 | otherwise) that contradict the conditions of this License, they do not
544 | excuse you from the conditions of this License. If you cannot convey a
545 | covered work so as to satisfy simultaneously your obligations under this
546 | License and any other pertinent obligations, then as a consequence you may
547 | not convey it at all. For example, if you agree to terms that obligate you
548 | to collect a royalty for further conveying from those to whom you convey
549 | the Program, the only way you could satisfy both those terms and this
550 | License would be to refrain entirely from conveying the Program.
551 |
552 | 13. Use with the GNU Affero General Public License.
553 |
554 | Notwithstanding any other provision of this License, you have
555 | permission to link or combine any covered work with a work licensed
556 | under version 3 of the GNU Affero General Public License into a single
557 | combined work, and to convey the resulting work. The terms of this
558 | License will continue to apply to the part which is the covered work,
559 | but the special requirements of the GNU Affero General Public License,
560 | section 13, concerning interaction through a network will apply to the
561 | combination as such.
562 |
563 | 14. Revised Versions of this License.
564 |
565 | The Free Software Foundation may publish revised and/or new versions of
566 | the GNU General Public License from time to time. Such new versions will
567 | be similar in spirit to the present version, but may differ in detail to
568 | address new problems or concerns.
569 |
570 | Each version is given a distinguishing version number. If the
571 | Program specifies that a certain numbered version of the GNU General
572 | Public License "or any later version" applies to it, you have the
573 | option of following the terms and conditions either of that numbered
574 | version or of any later version published by the Free Software
575 | Foundation. If the Program does not specify a version number of the
576 | GNU General Public License, you may choose any version ever published
577 | by the Free Software Foundation.
578 |
579 | If the Program specifies that a proxy can decide which future
580 | versions of the GNU General Public License can be used, that proxy's
581 | public statement of acceptance of a version permanently authorizes you
582 | to choose that version for the Program.
583 |
584 | Later license versions may give you additional or different
585 | permissions. However, no additional obligations are imposed on any
586 | author or copyright holder as a result of your choosing to follow a
587 | later version.
588 |
589 | 15. Disclaimer of Warranty.
590 |
591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599 |
600 | 16. Limitation of Liability.
601 |
602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610 | SUCH DAMAGES.
611 |
612 | 17. Interpretation of Sections 15 and 16.
613 |
614 | If the disclaimer of warranty and limitation of liability provided
615 | above cannot be given local legal effect according to their terms,
616 | reviewing courts shall apply local law that most closely approximates
617 | an absolute waiver of all civil liability in connection with the
618 | Program, unless a warranty or assumption of liability accompanies a
619 | copy of the Program in return for a fee.
620 |
621 | END OF TERMS AND CONDITIONS
622 |
623 | How to Apply These Terms to Your New Programs
624 |
625 | If you develop a new program, and you want it to be of the greatest
626 | possible use to the public, the best way to achieve this is to make it
627 | free software which everyone can redistribute and change under these terms.
628 |
629 | To do so, attach the following notices to the program. It is safest
630 | to attach them to the start of each source file to most effectively
631 | state the exclusion of warranty; and each file should have at least
632 | the "copyright" line and a pointer to where the full notice is found.
633 |
634 |
635 | Copyright (C)
636 |
637 | This program is free software: you can redistribute it and/or modify
638 | it under the terms of the GNU General Public License as published by
639 | the Free Software Foundation, either version 3 of the License, or
640 | (at your option) any later version.
641 |
642 | This program is distributed in the hope that it will be useful,
643 | but WITHOUT ANY WARRANTY; without even the implied warranty of
644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645 | GNU General Public License for more details.
646 |
647 | You should have received a copy of the GNU General Public License
648 | along with this program. If not, see .
649 |
650 | Also add information on how to contact you by electronic and paper mail.
651 |
652 | If the program does terminal interaction, make it output a short
653 | notice like this when it starts in an interactive mode:
654 |
655 | Copyright (C)
656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657 | This is free software, and you are welcome to redistribute it
658 | under certain conditions; type `show c' for details.
659 |
660 | The hypothetical commands `show w' and `show c' should show the appropriate
661 | parts of the General Public License. Of course, your program's commands
662 | might be different; for a GUI interface, you would use an "about box".
663 |
664 | You should also get your employer (if you work as a programmer) or school,
665 | if any, to sign a "copyright disclaimer" for the program, if necessary.
666 | For more information on this, and how to apply and follow the GNU GPL, see
667 | .
668 |
669 | The GNU General Public License does not permit incorporating your program
670 | into proprietary programs. If your program is a subroutine library, you
671 | may consider it more useful to permit linking proprietary applications with
672 | the library. If this is what you want to do, use the GNU Lesser General
673 | Public License instead of this License. But first, please read
674 | .
675 |
--------------------------------------------------------------------------------
/stocks/all_stocks.txt:
--------------------------------------------------------------------------------
1 | A
2 | AA
3 | AACG
4 | AAL
5 | AAMC
6 | AAME
7 | AAN
8 | AAOI
9 | AAON
10 | AAP
11 | AAPL
12 | AAT
13 | AAU
14 | AAWW
15 | AAXJ
16 | AAXN
17 | AB
18 | ABB
19 | ABBV
20 | ABC
21 | ABCB
22 | ABEO
23 | ABEV
24 | ABG
25 | ABIO
26 | ABM
27 | ABMD
28 | ABR
29 | ABT
30 | ABTX
31 | ABUS
32 | AC
33 | ACA
34 | ACAD
35 | ACAM
36 | ACB
37 | ACBI
38 | ACC
39 | ACCO
40 | ACEL
41 | ACER
42 | ACGL
43 | ACH
44 | ACHC
45 | ACHV
46 | ACIA
47 | ACIU
48 | ACIW
49 | ACLS
50 | ACM
51 | ACMR
52 | ACN
53 | ACNB
54 | ACOR
55 | ACP
56 | ACRE
57 | ACRS
58 | ACRX
59 | ACST
60 | ACT
61 | ACTG
62 | ACU
63 | ACV
64 | ACWI
65 | ACWX
66 | ACY
67 | ADAP
68 | ADBE
69 | ADC
70 | ADCT
71 | ADES
72 | ADI
73 | ADIL
74 | ADM
75 | ADMA
76 | ADMP
77 | ADMS
78 | ADNT
79 | ADP
80 | ADPT
81 | ADRE
82 | ADRO
83 | ADS
84 | ADSK
85 | ADSW
86 | ADT
87 | ADTN
88 | ADUS
89 | ADVM
90 | ADX
91 | ADXS
92 | AE
93 | AEE
94 | AEF
95 | AEG
96 | AEGN
97 | AEHR
98 | AEIS
99 | AEL
100 | AEM
101 | AEMD
102 | AEO
103 | AEP
104 | AER
105 | AERI
106 | AES
107 | AESE
108 | AEY
109 | AEYE
110 | AEZS
111 | AFB
112 | AFG
113 | AFH
114 | AFI
115 | AFIN
116 | AFL
117 | AFMD
118 | AFT
119 | AFYA
120 | AG
121 | AGCO
122 | AGD
123 | AGE
124 | AGEN
125 | AGFS
126 | AGI
127 | AGIO
128 | AGLE
129 | AGM
130 | AGMH
131 | AGNC
132 | AGO
133 | AGR
134 | AGRO
135 | AGRX
136 | AGS
137 | AGTC
138 | AGX
139 | AGYS
140 | AGZD
141 | AHC
142 | AHCO
143 | AHH
144 | AHPI
145 | AHT
146 | AI
147 | AIA
148 | AIF
149 | AIG
150 | AIH
151 | AIHS
152 | AIKI
153 | AIM
154 | AIMC
155 | AIMT
156 | AIN
157 | AINC
158 | AINV
159 | AIQ
160 | AIR
161 | AIRG
162 | AIRI
163 | AIRR
164 | AIRT
165 | AIT
166 | AIV
167 | AIZ
168 | AJG
169 | AJRD
170 | AJX
171 | AKAM
172 | AKBA
173 | AKCA
174 | AKER
175 | AKR
176 | AKRO
177 | AKTS
178 | AKTX
179 | AL
180 | ALAC
181 | ALB
182 | ALBO
183 | ALC
184 | ALCO
185 | ALDX
186 | ALE
187 | ALEC
188 | ALEX
189 | ALG
190 | ALGN
191 | ALGT
192 | ALIM
193 | ALJJ
194 | ALK
195 | ALKS
196 | ALL
197 | ALLE
198 | ALLK
199 | ALLO
200 | ALLT
201 | ALLY
202 | ALNA
203 | ALNY
204 | ALO
205 | ALOT
206 | ALPN
207 | ALRM
208 | ALRN
209 | ALRS
210 | ALSK
211 | ALSN
212 | ALT
213 | ALTG
214 | ALTM
215 | ALTR
216 | ALTY
217 | ALV
218 | ALX
219 | ALXN
220 | ALYA
221 | AM
222 | AMAG
223 | AMAL
224 | AMAT
225 | AMBA
226 | AMBC
227 | AMBO
228 | AMC
229 | AMCA
230 | AMCI
231 | AMCR
232 | AMCX
233 | AMD
234 | AME
235 | AMED
236 | AMEH
237 | AMG
238 | AMGN
239 | AMH
240 | AMK
241 | AMKR
242 | AMN
243 | AMNB
244 | AMOT
245 | AMP
246 | AMPE
247 | AMPH
248 | AMPY
249 | AMRB
250 | AMRC
251 | AMRH
252 | AMRK
253 | AMRN
254 | AMRS
255 | AMRX
256 | AMS
257 | AMSC
258 | AMSF
259 | AMSWA
260 | AMT
261 | AMTB
262 | AMTD
263 | AMTI
264 | AMTX
265 | AMWD
266 | AMX
267 | AMZN
268 | AN
269 | ANAB
270 | ANAT
271 | ANCN
272 | ANDA
273 | ANDE
274 | ANET
275 | ANF
276 | ANGI
277 | ANGL
278 | ANGO
279 | ANH
280 | ANIK
281 | ANIP
282 | ANIX
283 | ANPC
284 | ANSS
285 | ANTE
286 | ANTM
287 | ANVS
288 | ANY
289 | AOD
290 | AON
291 | AOS
292 | AOSL
293 | AP
294 | APA
295 | APAM
296 | APD
297 | APDN
298 | APEI
299 | APEN
300 | APEX
301 | APG
302 | APH
303 | APHA
304 | APLE
305 | APLS
306 | APLT
307 | APM
308 | APO
309 | APOG
310 | APOP
311 | APPF
312 | APPN
313 | APPS
314 | APRE
315 | APRN
316 | APT
317 | APTO
318 | APTS
319 | APTV
320 | APTX
321 | APVO
322 | APWC
323 | APXT
324 | APYX
325 | AQB
326 | AQMS
327 | AQN
328 | AQST
329 | AQUA
330 | AR
331 | ARA
332 | ARAV
333 | ARAY
334 | ARC
335 | ARCB
336 | ARCC
337 | ARCE
338 | ARCH
339 | ARCO
340 | ARCT
341 | ARD
342 | ARDC
343 | ARDS
344 | ARDX
345 | ARE
346 | ARES
347 | ARGO
348 | ARGX
349 | ARI
350 | ARKR
351 | ARL
352 | ARLO
353 | ARLP
354 | ARMK
355 | ARMP
356 | ARNA
357 | ARNC
358 | AROC
359 | AROW
360 | ARPO
361 | ARQT
362 | ARR
363 | ARTL
364 | ARTNA
365 | ARTW
366 | ARVN
367 | ARW
368 | ARWR
369 | ARYA
370 | ASA
371 | ASB
372 | ASC
373 | ASET
374 | ASFI
375 | ASG
376 | ASGN
377 | ASH
378 | ASIX
379 | ASLN
380 | ASM
381 | ASMB
382 | ASML
383 | ASNA
384 | ASND
385 | ASPN
386 | ASPS
387 | ASPU
388 | ASR
389 | ASRT
390 | ASRV
391 | ASTC
392 | ASTE
393 | ASUR
394 | ASX
395 | ASYS
396 | AT
397 | ATAX
398 | ATCO
399 | ATCX
400 | ATEC
401 | ATEN
402 | ATEX
403 | ATGE
404 | ATH
405 | ATHE
406 | ATHM
407 | ATHX
408 | ATI
409 | ATIF
410 | ATKR
411 | ATLC
412 | ATLO
413 | ATNI
414 | ATNM
415 | ATNX
416 | ATO
417 | ATOM
418 | ATOS
419 | ATR
420 | ATRA
421 | ATRC
422 | ATRI
423 | ATRO
424 | ATRS
425 | ATSG
426 | ATTO
427 | ATUS
428 | ATV
429 | ATVI
430 | ATXI
431 | AU
432 | AUB
433 | AUBN
434 | AUDC
435 | AUG
436 | AUMN
437 | AUPH
438 | AUTL
439 | AUTO
440 | AUY
441 | AVA
442 | AVAL
443 | AVAV
444 | AVB
445 | AVCO
446 | AVCT
447 | AVD
448 | AVDL
449 | AVEO
450 | AVGO
451 | AVGR
452 | AVID
453 | AVK
454 | AVLR
455 | AVNS
456 | AVNW
457 | AVRO
458 | AVT
459 | AVTR
460 | AVXL
461 | AVY
462 | AVYA
463 | AWF
464 | AWH
465 | AWI
466 | AWK
467 | AWP
468 | AWR
469 | AWRE
470 | AWX
471 | AX
472 | AXAS
473 | AXDX
474 | AXGN
475 | AXGT
476 | AXL
477 | AXLA
478 | AXNX
479 | AXP
480 | AXR
481 | AXS
482 | AXSM
483 | AXTA
484 | AXTI
485 | AXU
486 | AY
487 | AYI
488 | AYLA
489 | AYRO
490 | AYTU
491 | AYX
492 | AZEK
493 | AZN
494 | AZO
495 | AZPN
496 | AZRE
497 | AZRX
498 | AZUL
499 | AZZ
500 | B
501 | BA
502 | BABA
503 | BAC
504 | BAF
505 | BAH
506 | BAK
507 | BAM
508 | BANC
509 | BAND
510 | BANF
511 | BANR
512 | BANX
513 | BAP
514 | BASI
515 | BATL
516 | BATRA
517 | BATRK
518 | BAX
519 | BB
520 | BBAR
521 | BBBY
522 | BBC
523 | BBCP
524 | BBD
525 | BBDC
526 | BBF
527 | BBGI
528 | BBH
529 | BBI
530 | BBIO
531 | BBK
532 | BBL
533 | BBN
534 | BBP
535 | BBQ
536 | BBSI
537 | BBU
538 | BBVA
539 | BBW
540 | BBX
541 | BBY
542 | BC
543 | BCBP
544 | BCC
545 | BCDA
546 | BCE
547 | BCEI
548 | BCEL
549 | BCH
550 | BCLI
551 | BCML
552 | BCO
553 | BCOM
554 | BCOR
555 | BCOV
556 | BCPC
557 | BCRX
558 | BCS
559 | BCSF
560 | BCV
561 | BCX
562 | BCYC
563 | BDC
564 | BDGE
565 | BDJ
566 | BDL
567 | BDN
568 | BDR
569 | BDSI
570 | BDTX
571 | BDX
572 | BE
573 | BEAM
574 | BEAT
575 | BECN
576 | BEDU
577 | BELFB
578 | BEN
579 | BEP
580 | BERY
581 | BEST
582 | BFAM
583 | BFIN
584 | BFIT
585 | BFK
586 | BFO
587 | BFRA
588 | BFS
589 | BFST
590 | BFY
591 | BFYT
592 | BFZ
593 | BG
594 | BGB
595 | BGCP
596 | BGFV
597 | BGG
598 | BGH
599 | BGI
600 | BGIO
601 | BGNE
602 | BGR
603 | BGRN
604 | BGS
605 | BGSF
606 | BGT
607 | BGX
608 | BGY
609 | BH
610 | BHAT
611 | BHB
612 | BHC
613 | BHE
614 | BHF
615 | BHK
616 | BHLB
617 | BHP
618 | BHR
619 | BHTG
620 | BHV
621 | BHVN
622 | BIB
623 | BICK
624 | BIDU
625 | BIF
626 | BIG
627 | BIIB
628 | BILI
629 | BILL
630 | BIMI
631 | BIO
632 | BIOC
633 | BIOL
634 | BIOX
635 | BIP
636 | BIPC
637 | BIS
638 | BIT
639 | BITA
640 | BJ
641 | BJK
642 | BJRI
643 | BK
644 | BKCC
645 | BKD
646 | BKE
647 | BKEP
648 | BKH
649 | BKI
650 | BKK
651 | BKN
652 | BKNG
653 | BKR
654 | BKSC
655 | BKT
656 | BKTI
657 | BKU
658 | BKYI
659 | BL
660 | BLBD
661 | BLCM
662 | BLCN
663 | BLD
664 | BLDP
665 | BLDR
666 | BLE
667 | BLFS
668 | BLIN
669 | BLK
670 | BLKB
671 | BLL
672 | BLMN
673 | BLNK
674 | BLPH
675 | BLRX
676 | BLU
677 | BLUE
678 | BLW
679 | BLX
680 | BMA
681 | BMCH
682 | BME
683 | BMI
684 | BMLP
685 | BMO
686 | BMRA
687 | BMRC
688 | BMRN
689 | BMTC
690 | BMY
691 | BND
692 | BNDW
693 | BNDX
694 | BNED
695 | BNFT
696 | BNGO
697 | BNR
698 | BNS
699 | BNSO
700 | BNTC
701 | BNTX
702 | BNY
703 | BOCH
704 | BOE
705 | BOH
706 | BOKF
707 | BOMN
708 | BOOM
709 | BOOT
710 | BORR
711 | BOSC
712 | BOTJ
713 | BOTZ
714 | BOX
715 | BOXL
716 | BP
717 | BPFH
718 | BPMC
719 | BPMP
720 | BPOP
721 | BPT
722 | BPTH
723 | BPY
724 | BPYU
725 | BQH
726 | BR
727 | BRBR
728 | BRC
729 | BREW
730 | BRFS
731 | BRG
732 | BRID
733 | BRKL
734 | BRKR
735 | BRKS
736 | BRMK
737 | BRN
738 | BRO
739 | BROG
740 | BRP
741 | BRPA
742 | BRQS
743 | BRT
744 | BRX
745 | BRY
746 | BSA
747 | BSAC
748 | BSAE
749 | BSBE
750 | BSBK
751 | BSBR
752 | BSCK
753 | BSCL
754 | BSCM
755 | BSCN
756 | BSCO
757 | BSCP
758 | BSCQ
759 | BSCR
760 | BSCS
761 | BSCT
762 | BSD
763 | BSDE
764 | BSE
765 | BSET
766 | BSGM
767 | BSIG
768 | BSJK
769 | BSJL
770 | BSJM
771 | BSJN
772 | BSJO
773 | BSJP
774 | BSJQ
775 | BSJR
776 | BSL
777 | BSM
778 | BSML
779 | BSMM
780 | BSMN
781 | BSMO
782 | BSMP
783 | BSMQ
784 | BSMR
785 | BSMS
786 | BSMT
787 | BSMX
788 | BSQR
789 | BSRR
790 | BST
791 | BSTC
792 | BSX
793 | BTA
794 | BTAI
795 | BTE
796 | BTEC
797 | BTG
798 | BTI
799 | BTN
800 | BTO
801 | BTT
802 | BTU
803 | BTZ
804 | BUD
805 | BUG
806 | BUI
807 | BURL
808 | BUSE
809 | BV
810 | BVN
811 | BVXV
812 | BW
813 | BWA
814 | BWAY
815 | BWB
816 | BWEN
817 | BWFG
818 | BWG
819 | BWMX
820 | BWXT
821 | BX
822 | BXC
823 | BXG
824 | BXMT
825 | BXMX
826 | BXP
827 | BXRX
828 | BXS
829 | BY
830 | BYD
831 | BYFC
832 | BYM
833 | BYND
834 | BYSI
835 | BZH
836 | BZM
837 | BZUN
838 | C
839 | CAAP
840 | CAAS
841 | CABA
842 | CABO
843 | CAC
844 | CACC
845 | CACG
846 | CACI
847 | CADE
848 | CAE
849 | CAF
850 | CAG
851 | CAH
852 | CAI
853 | CAJ
854 | CAKE
855 | CAL
856 | CALA
857 | CALM
858 | CALT
859 | CALX
860 | CAMP
861 | CAMT
862 | CAN
863 | CANF
864 | CANG
865 | CAPL
866 | CAPR
867 | CAR
868 | CARA
869 | CARE
870 | CARG
871 | CARR
872 | CARS
873 | CARV
874 | CARZ
875 | CASA
876 | CASH
877 | CASI
878 | CASS
879 | CASY
880 | CAT
881 | CATB
882 | CATC
883 | CATH
884 | CATM
885 | CATO
886 | CATS
887 | CATY
888 | CB
889 | CBAN
890 | CBAT
891 | CBAY
892 | CBB
893 | CBD
894 | CBFV
895 | CBH
896 | CBIO
897 | CBL
898 | CBLI
899 | CBMB
900 | CBMG
901 | CBNK
902 | CBOE
903 | CBPO
904 | CBRE
905 | CBRL
906 | CBSH
907 | CBT
908 | CBTX
909 | CBU
910 | CBZ
911 | CC
912 | CCAP
913 | CCBG
914 | CCC
915 | CCCL
916 | CCD
917 | CCEP
918 | CCF
919 | CCH
920 | CCI
921 | CCJ
922 | CCK
923 | CCL
924 | CCLP
925 | CCM
926 | CCMP
927 | CCNE
928 | CCO
929 | CCOI
930 | CCR
931 | CCRC
932 | CCRN
933 | CCS
934 | CCU
935 | CCX
936 | CCXI
937 | CCXX
938 | CDAY
939 | CDC
940 | CDE
941 | CDEV
942 | CDK
943 | CDL
944 | CDLX
945 | CDMO
946 | CDNA
947 | CDNS
948 | CDOR
949 | CDR
950 | CDTX
951 | CDW
952 | CDXC
953 | CDXS
954 | CDZI
955 | CE
956 | CEA
957 | CECE
958 | CEE
959 | CEI
960 | CEIX
961 | CEL
962 | CELC
963 | CELH
964 | CELP
965 | CEM
966 | CEMI
967 | CEN
968 | CENT
969 | CENTA
970 | CENX
971 | CEO
972 | CEPU
973 | CEQP
974 | CERC
975 | CERN
976 | CERS
977 | CET
978 | CETV
979 | CETX
980 | CEV
981 | CEVA
982 | CEY
983 | CEZ
984 | CF
985 | CFA
986 | CFB
987 | CFBK
988 | CFFA
989 | CFFI
990 | CFFN
991 | CFG
992 | CFMS
993 | CFO
994 | CFR
995 | CFRX
996 | CFX
997 | CG
998 | CGA
999 | CGBD
1000 | CGC
1001 | CGEN
1002 | CGIX
1003 | CGNX
1004 | CGO
1005 | CGROU
1006 | CHA
1007 | CHAP
1008 | CHCI
1009 | CHCO
1010 | CHCT
1011 | CHD
1012 | CHDN
1013 | CHE
1014 | CHEF
1015 | CHEK
1016 | CHFS
1017 | CHGG
1018 | CHH
1019 | CHI
1020 | CHIC
1021 | CHKP
1022 | CHL
1023 | CHMA
1024 | CHMG
1025 | CHMI
1026 | CHN
1027 | CHNA
1028 | CHNG
1029 | CHNR
1030 | CHPM
1031 | CHRA
1032 | CHRS
1033 | CHRW
1034 | CHS
1035 | CHSCL
1036 | CHSCM
1037 | CHSCN
1038 | CHSCO
1039 | CHSCP
1040 | CHT
1041 | CHTR
1042 | CHU
1043 | CHUY
1044 | CHW
1045 | CHWY
1046 | CHX
1047 | CHY
1048 | CI
1049 | CIA
1050 | CIB
1051 | CIBR
1052 | CID
1053 | CIDM
1054 | CIEN
1055 | CIF
1056 | CIG
1057 | CIGI
1058 | CIH
1059 | CII
1060 | CIIC
1061 | CIK
1062 | CIL
1063 | CIM
1064 | CINF
1065 | CINR
1066 | CIO
1067 | CIR
1068 | CIT
1069 | CIVB
1070 | CIX
1071 | CIZ
1072 | CIZN
1073 | CJJD
1074 | CKH
1075 | CKPT
1076 | CKX
1077 | CL
1078 | CLAR
1079 | CLB
1080 | CLBK
1081 | CLBS
1082 | CLCT
1083 | CLDR
1084 | CLDT
1085 | CLDX
1086 | CLEU
1087 | CLF
1088 | CLFD
1089 | CLGN
1090 | CLGX
1091 | CLH
1092 | CLI
1093 | CLIR
1094 | CLLS
1095 | CLM
1096 | CLMT
1097 | CLNC
1098 | CLNE
1099 | CLNY
1100 | CLOU
1101 | CLPR
1102 | CLPS
1103 | CLPT
1104 | CLR
1105 | CLRB
1106 | CLRG
1107 | CLRO
1108 | CLS
1109 | CLSD
1110 | CLSK
1111 | CLSN
1112 | CLUB
1113 | CLVS
1114 | CLW
1115 | CLWT
1116 | CLX
1117 | CLXT
1118 | CM
1119 | CMA
1120 | CMBM
1121 | CMC
1122 | CMCM
1123 | CMCO
1124 | CMCSA
1125 | CMCT
1126 | CMD
1127 | CME
1128 | CMG
1129 | CMI
1130 | CMLS
1131 | CMO
1132 | CMP
1133 | CMPR
1134 | CMRE
1135 | CMRX
1136 | CMS
1137 | CMT
1138 | CMTL
1139 | CMU
1140 | CNA
1141 | CNBKA
1142 | CNC
1143 | CNCE
1144 | CNCR
1145 | CNDT
1146 | CNET
1147 | CNF
1148 | CNFR
1149 | CNHI
1150 | CNI
1151 | CNK
1152 | CNMD
1153 | CNNE
1154 | CNO
1155 | CNOB
1156 | CNP
1157 | CNQ
1158 | CNR
1159 | CNS
1160 | CNSL
1161 | CNSP
1162 | CNST
1163 | CNTG
1164 | CNTY
1165 | CNX
1166 | CNXM
1167 | CNXN
1168 | CO
1169 | COCP
1170 | CODA
1171 | CODI
1172 | CODX
1173 | COE
1174 | COF
1175 | COG
1176 | COHN
1177 | COHR
1178 | COHU
1179 | COKE
1180 | COLB
1181 | COLD
1182 | COLL
1183 | COLM
1184 | COMM
1185 | COMT
1186 | CONE
1187 | CONN
1188 | COO
1189 | COOP
1190 | COP
1191 | COR
1192 | CORE
1193 | CORR
1194 | CORT
1195 | COST
1196 | COTY
1197 | COUP
1198 | COWN
1199 | CP
1200 | CPA
1201 | CPAA
1202 | CPAC
1203 | CPAH
1204 | CPB
1205 | CPE
1206 | CPF
1207 | CPG
1208 | CPHC
1209 | CPHI
1210 | CPIX
1211 | CPLG
1212 | CPLP
1213 | CPRI
1214 | CPRT
1215 | CPRX
1216 | CPS
1217 | CPSH
1218 | CPSI
1219 | CPSS
1220 | CPST
1221 | CPT
1222 | CPTA
1223 | CQP
1224 | CR
1225 | CRAI
1226 | CRBP
1227 | CRC
1228 | CRDF
1229 | CREE
1230 | CREG
1231 | CRESY
1232 | CREX
1233 | CRF
1234 | CRH
1235 | CRHM
1236 | CRI
1237 | CRIS
1238 | CRK
1239 | CRL
1240 | CRM
1241 | CRMD
1242 | CRMT
1243 | CRNC
1244 | CRNT
1245 | CRNX
1246 | CRON
1247 | CROX
1248 | CRS
1249 | CRSA
1250 | CRSP
1251 | CRT
1252 | CRTO
1253 | CRTX
1254 | CRUS
1255 | CRVL
1256 | CRVS
1257 | CRWD
1258 | CRWS
1259 | CRY
1260 | CS
1261 | CSA
1262 | CSB
1263 | CSBR
1264 | CSCO
1265 | CSF
1266 | CSGP
1267 | CSGS
1268 | CSII
1269 | CSIQ
1270 | CSL
1271 | CSLT
1272 | CSML
1273 | CSOD
1274 | CSPI
1275 | CSPR
1276 | CSQ
1277 | CSSE
1278 | CSTE
1279 | CSTL
1280 | CSTM
1281 | CSTR
1282 | CSU
1283 | CSV
1284 | CSWC
1285 | CSWI
1286 | CSX
1287 | CTAS
1288 | CTB
1289 | CTBB
1290 | CTBI
1291 | CTEK
1292 | CTG
1293 | CTHR
1294 | CTIB
1295 | CTIC
1296 | CTK
1297 | CTL
1298 | CTLT
1299 | CTMX
1300 | CTO
1301 | CTR
1302 | CTRA
1303 | CTRE
1304 | CTRM
1305 | CTRN
1306 | CTS
1307 | CTSH
1308 | CTSO
1309 | CTT
1310 | CTVA
1311 | CTXR
1312 | CTXS
1313 | CUB
1314 | CUBA
1315 | CUBE
1316 | CUBI
1317 | CUE
1318 | CUK
1319 | CULP
1320 | CURO
1321 | CUTR
1322 | CUZ
1323 | CVA
1324 | CVBF
1325 | CVCO
1326 | CVCY
1327 | CVE
1328 | CVEO
1329 | CVET
1330 | CVGI
1331 | CVGW
1332 | CVI
1333 | CVIA
1334 | CVLT
1335 | CVLY
1336 | CVM
1337 | CVNA
1338 | CVR
1339 | CVS
1340 | CVTI
1341 | CVU
1342 | CVV
1343 | CVX
1344 | CW
1345 | CWBC
1346 | CWBR
1347 | CWCO
1348 | CWEN
1349 | CWH
1350 | CWK
1351 | CWST
1352 | CWT
1353 | CX
1354 | CXDC
1355 | CXE
1356 | CXH
1357 | CXO
1358 | CXP
1359 | CXSE
1360 | CXW
1361 | CYAD
1362 | CYAN
1363 | CYBE
1364 | CYBR
1365 | CYCC
1366 | CYCN
1367 | CYD
1368 | CYH
1369 | CYRN
1370 | CYRX
1371 | CYTK
1372 | CZNC
1373 | CZR
1374 | CZWI
1375 | CZZ
1376 | D
1377 | DAC
1378 | DADA
1379 | DAIO
1380 | DAKT
1381 | DAL
1382 | DALI
1383 | DAN
1384 | DAO
1385 | DAR
1386 | DARE
1387 | DAVA
1388 | DAX
1389 | DB
1390 | DBCP
1391 | DBD
1392 | DBI
1393 | DBL
1394 | DBVT
1395 | DBX
1396 | DCI
1397 | DCO
1398 | DCOM
1399 | DCP
1400 | DCPH
1401 | DCTH
1402 | DD
1403 | DDD
1404 | DDF
1405 | DDIV
1406 | DDOG
1407 | DDS
1408 | DE
1409 | DEA
1410 | DECK
1411 | DEI
1412 | DELL
1413 | DENN
1414 | DEO
1415 | DESP
1416 | DEX
1417 | DFFN
1418 | DFIN
1419 | DFNL
1420 | DFP
1421 | DFPHU
1422 | DFS
1423 | DG
1424 | DGICA
1425 | DGII
1426 | DGLD
1427 | DGLY
1428 | DGRE
1429 | DGRS
1430 | DGRW
1431 | DGX
1432 | DHC
1433 | DHF
1434 | DHI
1435 | DHIL
1436 | DHR
1437 | DHT
1438 | DHX
1439 | DHY
1440 | DIAX
1441 | DIN
1442 | DINT
1443 | DIOD
1444 | DIS
1445 | DISCA
1446 | DISCK
1447 | DISH
1448 | DIT
1449 | DJCO
1450 | DK
1451 | DKL
1452 | DKNG
1453 | DKS
1454 | DL
1455 | DLA
1456 | DLB
1457 | DLHC
1458 | DLNG
1459 | DLPH
1460 | DLPN
1461 | DLR
1462 | DLTH
1463 | DLTR
1464 | DLX
1465 | DMAC
1466 | DMB
1467 | DMF
1468 | DMLP
1469 | DMO
1470 | DMPI
1471 | DMRC
1472 | DMTK
1473 | DNI
1474 | DNJR
1475 | DNK
1476 | DNKN
1477 | DNLI
1478 | DNN
1479 | DNOW
1480 | DNP
1481 | DNR
1482 | DOC
1483 | DOCU
1484 | DOGZ
1485 | DOMO
1486 | DOOO
1487 | DOOR
1488 | DORM
1489 | DOV
1490 | DOW
1491 | DOX
1492 | DOYU
1493 | DPG
1494 | DPHC
1495 | DPW
1496 | DPZ
1497 | DQ
1498 | DRAD
1499 | DRD
1500 | DRE
1501 | DRH
1502 | DRI
1503 | DRIO
1504 | DRIV
1505 | DRNA
1506 | DRQ
1507 | DRRX
1508 | DRTT
1509 | DS
1510 | DSE
1511 | DSGX
1512 | DSKE
1513 | DSL
1514 | DSLV
1515 | DSM
1516 | DSPG
1517 | DSS
1518 | DSSI
1519 | DSU
1520 | DSWL
1521 | DSX
1522 | DT
1523 | DTE
1524 | DTEA
1525 | DTF
1526 | DTIL
1527 | DTJ
1528 | DTSS
1529 | DTYL
1530 | DUC
1531 | DUK
1532 | DUKH
1533 | DUO
1534 | DUOT
1535 | DUSA
1536 | DVA
1537 | DVAX
1538 | DVD
1539 | DVLU
1540 | DVN
1541 | DVOL
1542 | DVY
1543 | DWAS
1544 | DWAT
1545 | DWAW
1546 | DWEQ
1547 | DWFI
1548 | DWLD
1549 | DWMC
1550 | DWPP
1551 | DWSH
1552 | DWSN
1553 | DWUS
1554 | DX
1555 | DXC
1556 | DXCM
1557 | DXF
1558 | DXGE
1559 | DXJS
1560 | DXLG
1561 | DXPE
1562 | DXR
1563 | DXYN
1564 | DY
1565 | DYAI
1566 | DYNT
1567 | DZSI
1568 | E
1569 | EA
1570 | EAD
1571 | EAF
1572 | EARN
1573 | EARS
1574 | EAST
1575 | EAT
1576 | EB
1577 | EBAY
1578 | EBF
1579 | EBIX
1580 | EBIZ
1581 | EBMT
1582 | EBR
1583 | EBS
1584 | EBSB
1585 | EBTC
1586 | EC
1587 | ECC
1588 | ECF
1589 | ECHO
1590 | ECL
1591 | ECOL
1592 | ECOM
1593 | ECOR
1594 | ECOW
1595 | ECPG
1596 | ECT
1597 | ED
1598 | EDAP
1599 | EDD
1600 | EDF
1601 | EDI
1602 | EDIT
1603 | EDN
1604 | EDNT
1605 | EDRY
1606 | EDSA
1607 | EDU
1608 | EDUC
1609 | EE
1610 | EEA
1611 | EEFT
1612 | EEMA
1613 | EEX
1614 | EFAS
1615 | EFC
1616 | EFF
1617 | EFOI
1618 | EFR
1619 | EFSC
1620 | EFT
1621 | EFX
1622 | EGAN
1623 | EGBN
1624 | EGF
1625 | EGHT
1626 | EGIF
1627 | EGLE
1628 | EGO
1629 | EGOV
1630 | EGP
1631 | EGRX
1632 | EGY
1633 | EH
1634 | EHC
1635 | EHI
1636 | EHT
1637 | EHTH
1638 | EIDX
1639 | EIG
1640 | EIGI
1641 | EIGR
1642 | EIM
1643 | EIX
1644 | EKSO
1645 | EL
1646 | ELA
1647 | ELAN
1648 | ELF
1649 | ELGX
1650 | ELLO
1651 | ELMD
1652 | ELOX
1653 | ELP
1654 | ELS
1655 | ELSE
1656 | ELTK
1657 | ELVT
1658 | ELY
1659 | EMAN
1660 | EMB
1661 | EMCB
1662 | EMCF
1663 | EMD
1664 | EME
1665 | EMF
1666 | EMIF
1667 | EMKR
1668 | EML
1669 | EMN
1670 | EMO
1671 | EMR
1672 | EMX
1673 | EMXC
1674 | ENB
1675 | ENBL
1676 | ENDP
1677 | ENG
1678 | ENIA
1679 | ENIC
1680 | ENLC
1681 | ENLV
1682 | ENOB
1683 | ENPH
1684 | ENR
1685 | ENS
1686 | ENSG
1687 | ENSV
1688 | ENT
1689 | ENTA
1690 | ENTG
1691 | ENTX
1692 | ENV
1693 | ENVA
1694 | ENX
1695 | ENZ
1696 | ENZL
1697 | EOD
1698 | EOG
1699 | EOI
1700 | EOLS
1701 | EOS
1702 | EOT
1703 | EPAC
1704 | EPAM
1705 | EPAY
1706 | EPC
1707 | EPD
1708 | EPIX
1709 | EPM
1710 | EPR
1711 | EPRT
1712 | EPSN
1713 | EPZM
1714 | EQ
1715 | EQBK
1716 | EQC
1717 | EQH
1718 | EQIX
1719 | EQNR
1720 | EQR
1721 | EQRR
1722 | EQS
1723 | EQT
1724 | EQX
1725 | ERC
1726 | ERF
1727 | ERH
1728 | ERI
1729 | ERIC
1730 | ERIE
1731 | ERII
1732 | ERJ
1733 | EROS
1734 | ERYP
1735 | ES
1736 | ESBK
1737 | ESCA
1738 | ESE
1739 | ESEA
1740 | ESG
1741 | ESGD
1742 | ESGE
1743 | ESGG
1744 | ESGR
1745 | ESGU
1746 | ESI
1747 | ESLT
1748 | ESNT
1749 | ESP
1750 | ESPO
1751 | ESPR
1752 | ESQ
1753 | ESRT
1754 | ESS
1755 | ESSA
1756 | ESTA
1757 | ESTC
1758 | ESTE
1759 | ESXB
1760 | ET
1761 | ETB
1762 | ETFC
1763 | ETG
1764 | ETH
1765 | ETJ
1766 | ETM
1767 | ETN
1768 | ETNB
1769 | ETO
1770 | ETON
1771 | ETR
1772 | ETRN
1773 | ETSY
1774 | ETTX
1775 | ETV
1776 | ETW
1777 | ETX
1778 | ETY
1779 | EUFN
1780 | EURN
1781 | EV
1782 | EVA
1783 | EVBG
1784 | EVBN
1785 | EVC
1786 | EVER
1787 | EVF
1788 | EVFM
1789 | EVG
1790 | EVGN
1791 | EVH
1792 | EVI
1793 | EVK
1794 | EVLO
1795 | EVM
1796 | EVN
1797 | EVOK
1798 | EVOL
1799 | EVOP
1800 | EVR
1801 | EVRG
1802 | EVRI
1803 | EVSI
1804 | EVT
1805 | EVTC
1806 | EVV
1807 | EVY
1808 | EW
1809 | EWBC
1810 | EWJE
1811 | EWJV
1812 | EWZS
1813 | EXAS
1814 | EXC
1815 | EXD
1816 | EXEL
1817 | EXFO
1818 | EXG
1819 | EXK
1820 | EXLS
1821 | EXP
1822 | EXPD
1823 | EXPE
1824 | EXPI
1825 | EXPO
1826 | EXPR
1827 | EXR
1828 | EXTN
1829 | EXTR
1830 | EYE
1831 | EYEG
1832 | EYEN
1833 | EYES
1834 | EYPT
1835 | EZPW
1836 | F
1837 | FAAR
1838 | FAB
1839 | FAD
1840 | FAF
1841 | FALN
1842 | FAM
1843 | FAMI
1844 | FANG
1845 | FANH
1846 | FARM
1847 | FARO
1848 | FAST
1849 | FAT
1850 | FATE
1851 | FAX
1852 | FB
1853 | FBC
1854 | FBHS
1855 | FBIO
1856 | FBIZ
1857 | FBK
1858 | FBM
1859 | FBMS
1860 | FBNC
1861 | FBP
1862 | FBRX
1863 | FBSS
1864 | FBZ
1865 | FC
1866 | FCA
1867 | FCAL
1868 | FCAN
1869 | FCAP
1870 | FCAU
1871 | FCBC
1872 | FCBP
1873 | FCCO
1874 | FCCY
1875 | FCEF
1876 | FCEL
1877 | FCF
1878 | FCFS
1879 | FCN
1880 | FCNCA
1881 | FCNCP
1882 | FCO
1883 | FCPT
1884 | FCT
1885 | FCVT
1886 | FCX
1887 | FDEU
1888 | FDIV
1889 | FDNI
1890 | FDP
1891 | FDS
1892 | FDT
1893 | FDTS
1894 | FDUS
1895 | FDX
1896 | FE
1897 | FEAC
1898 | FEDU
1899 | FEI
1900 | FEIM
1901 | FELE
1902 | FEM
1903 | FEMB
1904 | FEMS
1905 | FEN
1906 | FENC
1907 | FENG
1908 | FEO
1909 | FEP
1910 | FET
1911 | FEUZ
1912 | FEX
1913 | FEYE
1914 | FF
1915 | FFA
1916 | FFBC
1917 | FFBW
1918 | FFC
1919 | FFG
1920 | FFHL
1921 | FFIC
1922 | FFIN
1923 | FFIV
1924 | FFNW
1925 | FFWM
1926 | FGB
1927 | FGBI
1928 | FGEN
1929 | FGM
1930 | FHB
1931 | FHI
1932 | FHK
1933 | FHN
1934 | FI
1935 | FIBK
1936 | FICO
1937 | FID
1938 | FIF
1939 | FINV
1940 | FINX
1941 | FIS
1942 | FISI
1943 | FISV
1944 | FIT
1945 | FITB
1946 | FIV
1947 | FIVE
1948 | FIVN
1949 | FIX
1950 | FIXD
1951 | FIXX
1952 | FIZZ
1953 | FJP
1954 | FKO
1955 | FKU
1956 | FL
1957 | FLAT
1958 | FLC
1959 | FLDM
1960 | FLEX
1961 | FLGT
1962 | FLIC
1963 | FLIR
1964 | FLL
1965 | FLMN
1966 | FLN
1967 | FLNG
1968 | FLNT
1969 | FLO
1970 | FLOW
1971 | FLR
1972 | FLS
1973 | FLT
1974 | FLWS
1975 | FLXN
1976 | FLXS
1977 | FLY
1978 | FMAO
1979 | FMB
1980 | FMBH
1981 | FMBI
1982 | FMC
1983 | FMCI
1984 | FMHI
1985 | FMK
1986 | FMN
1987 | FMNB
1988 | FMO
1989 | FMS
1990 | FMX
1991 | FMY
1992 | FN
1993 | FNB
1994 | FNCB
1995 | FND
1996 | FNF
1997 | FNHC
1998 | FNJN
1999 | FNK
2000 | FNKO
2001 | FNLC
2002 | FNV
2003 | FNWB
2004 | FNX
2005 | FNY
2006 | FOCS
2007 | FOE
2008 | FOF
2009 | FOLD
2010 | FONR
2011 | FOR
2012 | FORD
2013 | FORK
2014 | FORM
2015 | FORR
2016 | FORTY
2017 | FOSL
2018 | FOUR
2019 | FOX
2020 | FOXA
2021 | FOXF
2022 | FPA
2023 | FPAC
2024 | FPAY
2025 | FPF
2026 | FPH
2027 | FPI
2028 | FPL
2029 | FPRX
2030 | FPXE
2031 | FPXI
2032 | FR
2033 | FRA
2034 | FRAN
2035 | FRBA
2036 | FRBK
2037 | FRC
2038 | FRD
2039 | FREQ
2040 | FRG
2041 | FRGI
2042 | FRHC
2043 | FRME
2044 | FRO
2045 | FRPH
2046 | FRPT
2047 | FRSX
2048 | FRT
2049 | FRTA
2050 | FSB
2051 | FSBW
2052 | FSCT
2053 | FSD
2054 | FSFG
2055 | FSI
2056 | FSK
2057 | FSLF
2058 | FSLR
2059 | FSLY
2060 | FSM
2061 | FSP
2062 | FSS
2063 | FSTR
2064 | FSV
2065 | FSZ
2066 | FT
2067 | FTA
2068 | FTAC
2069 | FTAG
2070 | FTAI
2071 | FTC
2072 | FTCH
2073 | FTCS
2074 | FTDR
2075 | FTEK
2076 | FTF
2077 | FTFT
2078 | FTGC
2079 | FTHI
2080 | FTI
2081 | FTK
2082 | FTLB
2083 | FTNT
2084 | FTRI
2085 | FTS
2086 | FTSI
2087 | FTSL
2088 | FTSM
2089 | FTV
2090 | FTXD
2091 | FTXG
2092 | FTXH
2093 | FTXL
2094 | FTXN
2095 | FTXO
2096 | FTXR
2097 | FUL
2098 | FULC
2099 | FULT
2100 | FUN
2101 | FUNC
2102 | FUND
2103 | FUTU
2104 | FUV
2105 | FV
2106 | FVC
2107 | FVCB
2108 | FVE
2109 | FVRR
2110 | FWONA
2111 | FWONK
2112 | FWP
2113 | FWRD
2114 | FYC
2115 | FYT
2116 | FYX
2117 | G
2118 | GAB
2119 | GABC
2120 | GAIA
2121 | GAIN
2122 | GALT
2123 | GAM
2124 | GAN
2125 | GARS
2126 | GASS
2127 | GATX
2128 | GAU
2129 | GBAB
2130 | GBCI
2131 | GBDC
2132 | GBIO
2133 | GBL
2134 | GBLI
2135 | GBR
2136 | GBT
2137 | GBX
2138 | GCAP
2139 | GCBC
2140 | GCI
2141 | GCO
2142 | GCP
2143 | GCV
2144 | GD
2145 | GDDY
2146 | GDEN
2147 | GDL
2148 | GDO
2149 | GDOT
2150 | GDP
2151 | GDS
2152 | GDV
2153 | GDYN
2154 | GE
2155 | GEC
2156 | GECC
2157 | GEF
2158 | GEL
2159 | GEN
2160 | GENC
2161 | GENE
2162 | GENY
2163 | GEO
2164 | GEOS
2165 | GER
2166 | GERN
2167 | GES
2168 | GEVO
2169 | GF
2170 | GFED
2171 | GFF
2172 | GFI
2173 | GFL
2174 | GFN
2175 | GFY
2176 | GGAL
2177 | GGB
2178 | GGG
2179 | GGM
2180 | GGN
2181 | GGT
2182 | GGZ
2183 | GH
2184 | GHC
2185 | GHG
2186 | GHL
2187 | GHM
2188 | GHSI
2189 | GHY
2190 | GIB
2191 | GIFI
2192 | GIGE
2193 | GIGM
2194 | GIII
2195 | GIL
2196 | GILD
2197 | GILT
2198 | GIM
2199 | GIS
2200 | GIX
2201 | GKOS
2202 | GL
2203 | GLAD
2204 | GLBS
2205 | GLBZ
2206 | GLDD
2207 | GLDI
2208 | GLG
2209 | GLIBA
2210 | GLMD
2211 | GLNG
2212 | GLO
2213 | GLOB
2214 | GLOG
2215 | GLOP
2216 | GLP
2217 | GLPG
2218 | GLPI
2219 | GLQ
2220 | GLRE
2221 | GLT
2222 | GLU
2223 | GLUU
2224 | GLV
2225 | GLW
2226 | GLYC
2227 | GM
2228 | GMAB
2229 | GMBL
2230 | GMDA
2231 | GME
2232 | GMED
2233 | GMHI
2234 | GMLP
2235 | GMO
2236 | GMRE
2237 | GMS
2238 | GMZ
2239 | GNC
2240 | GNCA
2241 | GNE
2242 | GNFT
2243 | GNK
2244 | GNL
2245 | GNLN
2246 | GNMA
2247 | GNMK
2248 | GNOM
2249 | GNPX
2250 | GNRC
2251 | GNRS
2252 | GNSS
2253 | GNT
2254 | GNTX
2255 | GNTY
2256 | GNUS
2257 | GNW
2258 | GO
2259 | GOF
2260 | GOGL
2261 | GOGO
2262 | GOL
2263 | GOLD
2264 | GOLF
2265 | GOOD
2266 | GOOG
2267 | GOOGL
2268 | GOOS
2269 | GORO
2270 | GOSS
2271 | GPAQ
2272 | GPC
2273 | GPI
2274 | GPK
2275 | GPL
2276 | GPM
2277 | GPMT
2278 | GPN
2279 | GPOR
2280 | GPP
2281 | GPRE
2282 | GPRK
2283 | GPRO
2284 | GPS
2285 | GPX
2286 | GRA
2287 | GRAF
2288 | GRAM
2289 | GRBK
2290 | GRC
2291 | GRF
2292 | GRFS
2293 | GRID
2294 | GRIF
2295 | GRIL
2296 | GRIN
2297 | GRMN
2298 | GRNQ
2299 | GROW
2300 | GRPN
2301 | GRTS
2302 | GRTX
2303 | GRUB
2304 | GRVY
2305 | GRWG
2306 | GRX
2307 | GS
2308 | GSAT
2309 | GSB
2310 | GSBC
2311 | GSBD
2312 | GSH
2313 | GSHD
2314 | GSIT
2315 | GSK
2316 | GSKY
2317 | GSL
2318 | GSM
2319 | GSMG
2320 | GSS
2321 | GSUM
2322 | GSV
2323 | GSX
2324 | GT
2325 | GTE
2326 | GTEC
2327 | GTES
2328 | GTHX
2329 | GTIM
2330 | GTLS
2331 | GTN
2332 | GTS
2333 | GTT
2334 | GTX
2335 | GTY
2336 | GTYH
2337 | GURE
2338 | GUT
2339 | GV
2340 | GVA
2341 | GVP
2342 | GWB
2343 | GWGH
2344 | GWPH
2345 | GWRE
2346 | GWRS
2347 | GWW
2348 | GXTG
2349 | GYC
2350 | GYRO
2351 | H
2352 | HA
2353 | HAE
2354 | HAFC
2355 | HAIN
2356 | HAL
2357 | HALL
2358 | HALO
2359 | HAPP
2360 | HARP
2361 | HAS
2362 | HASI
2363 | HAYN
2364 | HBAN
2365 | HBB
2366 | HBCP
2367 | HBI
2368 | HBIO
2369 | HBM
2370 | HBMD
2371 | HBNC
2372 | HBP
2373 | HBT
2374 | HCA
2375 | HCAC
2376 | HCAP
2377 | HCAT
2378 | HCC
2379 | HCCH
2380 | HCCI
2381 | HCCO
2382 | HCFT
2383 | HCHC
2384 | HCI
2385 | HCKT
2386 | HCM
2387 | HCR
2388 | HCSG
2389 | HD
2390 | HDB
2391 | HDS
2392 | HDSN
2393 | HE
2394 | HEAR
2395 | HEBT
2396 | HECCU
2397 | HEES
2398 | HEI
2399 | HELE
2400 | HEP
2401 | HEPA
2402 | HEQ
2403 | HERD
2404 | HERO
2405 | HES
2406 | HESM
2407 | HEWG
2408 | HEXO
2409 | HFBL
2410 | HFC
2411 | HFFG
2412 | HFRO
2413 | HFWA
2414 | HGSH
2415 | HGV
2416 | HHC
2417 | HHR
2418 | HHS
2419 | HHT
2420 | HI
2421 | HIBB
2422 | HIE
2423 | HIFS
2424 | HIG
2425 | HIHO
2426 | HII
2427 | HIL
2428 | HIMX
2429 | HIO
2430 | HIW
2431 | HIX
2432 | HJLI
2433 | HKIB
2434 | HL
2435 | HLAL
2436 | HLF
2437 | HLG
2438 | HLI
2439 | HLIO
2440 | HLIT
2441 | HLNE
2442 | HLT
2443 | HLX
2444 | HMC
2445 | HMHC
2446 | HMI
2447 | HMLP
2448 | HMN
2449 | HMNF
2450 | HMST
2451 | HMSY
2452 | HMTV
2453 | HMY
2454 | HNDL
2455 | HNGR
2456 | HNI
2457 | HNNA
2458 | HNP
2459 | HNRG
2460 | HNW
2461 | HOFT
2462 | HOG
2463 | HOLI
2464 | HOLX
2465 | HOMB
2466 | HOME
2467 | HON
2468 | HONE
2469 | HOOK
2470 | HOPE
2471 | HOTH
2472 | HOV
2473 | HOVNP
2474 | HP
2475 | HPE
2476 | HPF
2477 | HPI
2478 | HPP
2479 | HPQ
2480 | HPR
2481 | HPS
2482 | HQH
2483 | HQI
2484 | HQL
2485 | HQY
2486 | HR
2487 | HRB
2488 | HRC
2489 | HRI
2490 | HRL
2491 | HROW
2492 | HRTG
2493 | HRTX
2494 | HRZN
2495 | HSBC
2496 | HSC
2497 | HSDT
2498 | HSIC
2499 | HSII
2500 | HSKA
2501 | HSON
2502 | HST
2503 | HSTM
2504 | HSTO
2505 | HSY
2506 | HT
2507 | HTA
2508 | HTBI
2509 | HTBK
2510 | HTBX
2511 | HTD
2512 | HTGC
2513 | HTGM
2514 | HTH
2515 | HTHT
2516 | HTLD
2517 | HTLF
2518 | HTY
2519 | HTZ
2520 | HUBB
2521 | HUBG
2522 | HUBS
2523 | HUD
2524 | HUGE
2525 | HUIZ
2526 | HUM
2527 | HUN
2528 | HURC
2529 | HURN
2530 | HUSA
2531 | HUSN
2532 | HUYA
2533 | HVT
2534 | HWBK
2535 | HWC
2536 | HWCC
2537 | HWKN
2538 | HWM
2539 | HX
2540 | HXL
2541 | HY
2542 | HYAC
2543 | HYB
2544 | HYI
2545 | HYLS
2546 | HYMC
2547 | HYRE
2548 | HYT
2549 | HYXE
2550 | HYZD
2551 | HZN
2552 | HZNP
2553 | HZO
2554 | IAA
2555 | IAC
2556 | IAE
2557 | IAF
2558 | IAG
2559 | IART
2560 | IBA
2561 | IBB
2562 | IBCP
2563 | IBIO
2564 | IBKC
2565 | IBKR
2566 | IBM
2567 | IBN
2568 | IBOC
2569 | IBP
2570 | IBTA
2571 | IBTB
2572 | IBTD
2573 | IBTE
2574 | IBTF
2575 | IBTG
2576 | IBTH
2577 | IBTI
2578 | IBTJ
2579 | IBTX
2580 | IBUY
2581 | ICAD
2582 | ICBK
2583 | ICCC
2584 | ICD
2585 | ICE
2586 | ICFI
2587 | ICHR
2588 | ICL
2589 | ICLK
2590 | ICLN
2591 | ICLR
2592 | ICMB
2593 | ICON
2594 | ICPT
2595 | ICUI
2596 | IDA
2597 | IDCC
2598 | IDE
2599 | IDEX
2600 | IDLB
2601 | IDN
2602 | IDRA
2603 | IDT
2604 | IDXG
2605 | IDXX
2606 | IDYA
2607 | IEA
2608 | IEC
2609 | IEF
2610 | IEI
2611 | IEP
2612 | IESC
2613 | IEUS
2614 | IEX
2615 | IFEU
2616 | IFF
2617 | IFGL
2618 | IFMK
2619 | IFN
2620 | IFRX
2621 | IFS
2622 | IFV
2623 | IGA
2624 | IGC
2625 | IGD
2626 | IGF
2627 | IGI
2628 | IGIB
2629 | IGMS
2630 | IGOV
2631 | IGR
2632 | IGSB
2633 | IGT
2634 | IHC
2635 | IHD
2636 | IHG
2637 | IHIT
2638 | IHRT
2639 | IHT
2640 | IID
2641 | IIF
2642 | III
2643 | IIIN
2644 | IIIV
2645 | IIM
2646 | IIN
2647 | IIPR
2648 | IIVI
2649 | IJT
2650 | IKNX
2651 | ILMN
2652 | ILPT
2653 | IMAB
2654 | IMAC
2655 | IMAX
2656 | IMBI
2657 | IMGN
2658 | IMH
2659 | IMKTA
2660 | IMMP
2661 | IMMR
2662 | IMMU
2663 | IMO
2664 | IMOS
2665 | IMRA
2666 | IMRN
2667 | IMTE
2668 | IMUX
2669 | IMV
2670 | IMVT
2671 | IMXI
2672 | INBK
2673 | INCY
2674 | INDB
2675 | INDO
2676 | INDY
2677 | INFI
2678 | INFN
2679 | INFO
2680 | INFR
2681 | INFU
2682 | INFY
2683 | ING
2684 | INGN
2685 | INGR
2686 | INMB
2687 | INMD
2688 | INN
2689 | INO
2690 | INOD
2691 | INOV
2692 | INPX
2693 | INS
2694 | INSE
2695 | INSG
2696 | INSI
2697 | INSM
2698 | INSP
2699 | INSU
2700 | INSW
2701 | INT
2702 | INTC
2703 | INTG
2704 | INTL
2705 | INTT
2706 | INTU
2707 | INUV
2708 | INVA
2709 | INVE
2710 | INVH
2711 | INWK
2712 | IO
2713 | IONS
2714 | IOR
2715 | IOSP
2716 | IOVA
2717 | IP
2718 | IPAR
2719 | IPDN
2720 | IPG
2721 | IPGP
2722 | IPHA
2723 | IPHI
2724 | IPI
2725 | IPKW
2726 | IPLDP
2727 | IPOC
2728 | IPWR
2729 | IQ
2730 | IQI
2731 | IQV
2732 | IR
2733 | IRBT
2734 | IRDM
2735 | IRET
2736 | IRIX
2737 | IRL
2738 | IRM
2739 | IRMD
2740 | IROQ
2741 | IRR
2742 | IRS
2743 | IRT
2744 | IRTC
2745 | IRWD
2746 | ISBC
2747 | ISD
2748 | ISDR
2749 | ISDS
2750 | ISDX
2751 | ISEE
2752 | ISEM
2753 | ISHG
2754 | ISIG
2755 | ISNS
2756 | ISR
2757 | ISRG
2758 | ISSC
2759 | ISTB
2760 | ISTR
2761 | IT
2762 | ITCB
2763 | ITCI
2764 | ITEQ
2765 | ITGR
2766 | ITI
2767 | ITIC
2768 | ITMR
2769 | ITP
2770 | ITRI
2771 | ITRM
2772 | ITRN
2773 | ITT
2774 | ITUB
2775 | ITW
2776 | IUS
2777 | IUSB
2778 | IUSG
2779 | IUSS
2780 | IUSV
2781 | IVAC
2782 | IVC
2783 | IVH
2784 | IVR
2785 | IVZ
2786 | IX
2787 | IXUS
2788 | IZEA
2789 | J
2790 | JACK
2791 | JAGX
2792 | JAKK
2793 | JAN
2794 | JAX
2795 | JAZZ
2796 | JBGS
2797 | JBHT
2798 | JBL
2799 | JBLU
2800 | JBSS
2801 | JBT
2802 | JCAP
2803 | JCE
2804 | JCI
2805 | JCO
2806 | JCOM
2807 | JCS
2808 | JCTCF
2809 | JD
2810 | JDD
2811 | JE
2812 | JEF
2813 | JELD
2814 | JEQ
2815 | JFIN
2816 | JFK
2817 | JFR
2818 | JG
2819 | JGH
2820 | JHG
2821 | JHI
2822 | JHS
2823 | JHX
2824 | JHY
2825 | JILL
2826 | JJSF
2827 | JKHY
2828 | JKI
2829 | JKS
2830 | JLL
2831 | JLS
2832 | JMIA
2833 | JMM
2834 | JMP
2835 | JNCE
2836 | JNJ
2837 | JNPR
2838 | JOB
2839 | JOBS
2840 | JOE
2841 | JOF
2842 | JOUT
2843 | JP
2844 | JPC
2845 | JPI
2846 | JPM
2847 | JPS
2848 | JQC
2849 | JRI
2850 | JRJC
2851 | JRO
2852 | JRS
2853 | JRSH
2854 | JRVR
2855 | JSD
2856 | JSMD
2857 | JSML
2858 | JT
2859 | JTA
2860 | JTD
2861 | JVA
2862 | JWN
2863 | JYNT
2864 | K
2865 | KAI
2866 | KALA
2867 | KALU
2868 | KALV
2869 | KAMN
2870 | KAR
2871 | KB
2872 | KBAL
2873 | KBH
2874 | KBR
2875 | KBSF
2876 | KBWB
2877 | KBWD
2878 | KBWP
2879 | KBWR
2880 | KBWY
2881 | KC
2882 | KDMN
2883 | KDP
2884 | KE
2885 | KELYA
2886 | KEN
2887 | KEP
2888 | KEQU
2889 | KERN
2890 | KEX
2891 | KEY
2892 | KEYS
2893 | KF
2894 | KFFB
2895 | KFRC
2896 | KFS
2897 | KFY
2898 | KGC
2899 | KGJI
2900 | KHC
2901 | KIDS
2902 | KIM
2903 | KIN
2904 | KINS
2905 | KIO
2906 | KIQ
2907 | KIRK
2908 | KKR
2909 | KL
2910 | KLAC
2911 | KLDO
2912 | KLIC
2913 | KLR
2914 | KLXE
2915 | KMB
2916 | KMDA
2917 | KMF
2918 | KMI
2919 | KMPR
2920 | KMT
2921 | KMX
2922 | KN
2923 | KNDI
2924 | KNL
2925 | KNOP
2926 | KNSA
2927 | KNSL
2928 | KNX
2929 | KO
2930 | KOD
2931 | KODK
2932 | KOF
2933 | KOP
2934 | KOPN
2935 | KOS
2936 | KOSS
2937 | KPTI
2938 | KR
2939 | KRA
2940 | KRC
2941 | KREF
2942 | KRG
2943 | KRKR
2944 | KRMA
2945 | KRMD
2946 | KRNT
2947 | KRNY
2948 | KRO
2949 | KROS
2950 | KRP
2951 | KRTX
2952 | KRUS
2953 | KRYS
2954 | KSM
2955 | KSS
2956 | KSU
2957 | KT
2958 | KTB
2959 | KTCC
2960 | KTF
2961 | KTOS
2962 | KTOV
2963 | KURA
2964 | KVHI
2965 | KW
2966 | KWEB
2967 | KWR
2968 | KXIN
2969 | KYN
2970 | KZIA
2971 | KZR
2972 | L
2973 | LAC
2974 | LACQ
2975 | LAD
2976 | LADR
2977 | LAIX
2978 | LAKE
2979 | LAMR
2980 | LANC
2981 | LAND
2982 | LARK
2983 | LASR
2984 | LATN
2985 | LAUR
2986 | LAWS
2987 | LAZ
2988 | LAZY
2989 | LB
2990 | LBAI
2991 | LBC
2992 | LBRDA
2993 | LBRDK
2994 | LBRT
2995 | LBTYA
2996 | LBTYK
2997 | LC
2998 | LCA
2999 | LCI
3000 | LCII
3001 | LCNB
3002 | LCTX
3003 | LCUT
3004 | LDEM
3005 | LDL
3006 | LDOS
3007 | LDP
3008 | LDSF
3009 | LE
3010 | LEA
3011 | LEAF
3012 | LECO
3013 | LEDS
3014 | LEE
3015 | LEG
3016 | LEGH
3017 | LEGN
3018 | LEGR
3019 | LEJU
3020 | LEN
3021 | LEO
3022 | LEU
3023 | LEVI
3024 | LFAC
3025 | LFC
3026 | LFUS
3027 | LFVN
3028 | LGC
3029 | LGHL
3030 | LGI
3031 | LGIH
3032 | LGL
3033 | LGND
3034 | LH
3035 | LHC
3036 | LHCG
3037 | LHX
3038 | LIFE
3039 | LII
3040 | LILA
3041 | LILAK
3042 | LIN
3043 | LINC
3044 | LIND
3045 | LINX
3046 | LIQT
3047 | LITB
3048 | LITE
3049 | LIVE
3050 | LIVN
3051 | LIVX
3052 | LIZI
3053 | LJPC
3054 | LKCO
3055 | LKFN
3056 | LKOR
3057 | LKQ
3058 | LL
3059 | LLIT
3060 | LLNW
3061 | LLY
3062 | LM
3063 | LMAT
3064 | LMB
3065 | LMBS
3066 | LMFA
3067 | LMHB
3068 | LMNL
3069 | LMNR
3070 | LMNX
3071 | LMPX
3072 | LMRK
3073 | LMT
3074 | LN
3075 | LNC
3076 | LND
3077 | LNDC
3078 | LNG
3079 | LNGR
3080 | LNN
3081 | LNT
3082 | LNTH
3083 | LOAK
3084 | LOAN
3085 | LOB
3086 | LOCO
3087 | LODE
3088 | LOGC
3089 | LOGI
3090 | LOGM
3091 | LOMA
3092 | LONE
3093 | LOOP
3094 | LOPE
3095 | LORL
3096 | LOV
3097 | LOVE
3098 | LOW
3099 | LPCN
3100 | LPG
3101 | LPI
3102 | LPL
3103 | LPLA
3104 | LPRO
3105 | LPSN
3106 | LPTH
3107 | LPTX
3108 | LPX
3109 | LQDA
3110 | LQDT
3111 | LRCX
3112 | LRGE
3113 | LRMR
3114 | LRN
3115 | LSBK
3116 | LSCC
3117 | LSI
3118 | LSTR
3119 | LSXMA
3120 | LSXMK
3121 | LTBR
3122 | LTC
3123 | LTHM
3124 | LTRN
3125 | LTRPA
3126 | LTRPB
3127 | LTRX
3128 | LUB
3129 | LULU
3130 | LUMO
3131 | LUNA
3132 | LUV
3133 | LVGO
3134 | LVHD
3135 | LVS
3136 | LW
3137 | LWAY
3138 | LX
3139 | LXFR
3140 | LXP
3141 | LXRX
3142 | LXU
3143 | LYB
3144 | LYFT
3145 | LYG
3146 | LYL
3147 | LYRA
3148 | LYTS
3149 | LYV
3150 | LZB
3151 | M
3152 | MA
3153 | MAA
3154 | MAC
3155 | MACK
3156 | MAG
3157 | MAGS
3158 | MAIN
3159 | MAN
3160 | MANH
3161 | MANT
3162 | MANU
3163 | MAR
3164 | MARA
3165 | MARK
3166 | MARPS
3167 | MAS
3168 | MASI
3169 | MAT
3170 | MATW
3171 | MATX
3172 | MAV
3173 | MAXR
3174 | MAYS
3175 | MBB
3176 | MBI
3177 | MBII
3178 | MBIN
3179 | MBIO
3180 | MBNKP
3181 | MBOT
3182 | MBRX
3183 | MBSD
3184 | MBT
3185 | MBUU
3186 | MBWM
3187 | MC
3188 | MCA
3189 | MCACU
3190 | MCB
3191 | MCBC
3192 | MCBS
3193 | MCC
3194 | MCD
3195 | MCEF
3196 | MCEP
3197 | MCF
3198 | MCFT
3199 | MCHI
3200 | MCHP
3201 | MCHX
3202 | MCI
3203 | MCK
3204 | MCN
3205 | MCO
3206 | MCR
3207 | MCRB
3208 | MCRI
3209 | MCS
3210 | MCY
3211 | MD
3212 | MDB
3213 | MDC
3214 | MDCA
3215 | MDGL
3216 | MDGS
3217 | MDIA
3218 | MDIV
3219 | MDJH
3220 | MDLA
3221 | MDLY
3222 | MDLZ
3223 | MDP
3224 | MDRX
3225 | MDT
3226 | MDU
3227 | MDWD
3228 | MEC
3229 | MED
3230 | MEDP
3231 | MEDS
3232 | MEET
3233 | MEI
3234 | MEIP
3235 | MELI
3236 | MEN
3237 | MEOH
3238 | MERC
3239 | MESA
3240 | MESO
3241 | MET
3242 | METC
3243 | METX
3244 | MFA
3245 | MFAC
3246 | MFC
3247 | MFD
3248 | MFG
3249 | MFGP
3250 | MFH
3251 | MFIN
3252 | MFL
3253 | MFM
3254 | MFNC
3255 | MFT
3256 | MFV
3257 | MG
3258 | MGA
3259 | MGEE
3260 | MGEN
3261 | MGF
3262 | MGI
3263 | MGIC
3264 | MGLN
3265 | MGM
3266 | MGNX
3267 | MGP
3268 | MGPI
3269 | MGRC
3270 | MGTA
3271 | MGTX
3272 | MGU
3273 | MGY
3274 | MGYR
3275 | MHD
3276 | MHE
3277 | MHF
3278 | MHH
3279 | MHI
3280 | MHK
3281 | MHLD
3282 | MHN
3283 | MHO
3284 | MIC
3285 | MICT
3286 | MIDD
3287 | MIE
3288 | MIK
3289 | MILN
3290 | MIME
3291 | MIN
3292 | MIND
3293 | MINI
3294 | MIRM
3295 | MIST
3296 | MITK
3297 | MITO
3298 | MITT
3299 | MIXT
3300 | MIY
3301 | MJCO
3302 | MKC
3303 | MKD
3304 | MKGI
3305 | MKL
3306 | MKSI
3307 | MKTX
3308 | MLAB
3309 | MLCO
3310 | MLHR
3311 | MLI
3312 | MLM
3313 | MLND
3314 | MLP
3315 | MLR
3316 | MLSS
3317 | MLVF
3318 | MMAC
3319 | MMC
3320 | MMD
3321 | MMI
3322 | MMLP
3323 | MMM
3324 | MMP
3325 | MMS
3326 | MMSI
3327 | MMT
3328 | MMU
3329 | MMX
3330 | MMYT
3331 | MN
3332 | MNCL
3333 | MNDO
3334 | MNK
3335 | MNKD
3336 | MNLO
3337 | MNOV
3338 | MNP
3339 | MNPR
3340 | MNR
3341 | MNRL
3342 | MNRO
3343 | MNSB
3344 | MNST
3345 | MNTA
3346 | MNTX
3347 | MO
3348 | MOBL
3349 | MOD
3350 | MODN
3351 | MOFG
3352 | MOGO
3353 | MOGU
3354 | MOH
3355 | MOHO
3356 | MOMO
3357 | MOR
3358 | MORF
3359 | MORN
3360 | MOS
3361 | MOSY
3362 | MOTS
3363 | MOV
3364 | MOXC
3365 | MPA
3366 | MPAA
3367 | MPB
3368 | MPC
3369 | MPLX
3370 | MPV
3371 | MPW
3372 | MPWR
3373 | MPX
3374 | MQT
3375 | MQY
3376 | MR
3377 | MRAM
3378 | MRC
3379 | MRCC
3380 | MRCY
3381 | MREO
3382 | MRIN
3383 | MRK
3384 | MRKR
3385 | MRLN
3386 | MRNA
3387 | MRNS
3388 | MRO
3389 | MRSN
3390 | MRTN
3391 | MRTX
3392 | MRUS
3393 | MRVL
3394 | MS
3395 | MSA
3396 | MSB
3397 | MSBF
3398 | MSBI
3399 | MSC
3400 | MSCI
3401 | MSD
3402 | MSEX
3403 | MSFT
3404 | MSGE
3405 | MSGN
3406 | MSGS
3407 | MSI
3408 | MSM
3409 | MSN
3410 | MSON
3411 | MSTR
3412 | MSVB
3413 | MT
3414 | MTA
3415 | MTB
3416 | MTBC
3417 | MTC
3418 | MTCH
3419 | MTD
3420 | MTDR
3421 | MTEM
3422 | MTEX
3423 | MTG
3424 | MTH
3425 | MTL
3426 | MTLS
3427 | MTN
3428 | MTNB
3429 | MTOR
3430 | MTP
3431 | MTR
3432 | MTRN
3433 | MTRX
3434 | MTSC
3435 | MTSI
3436 | MTSL
3437 | MTT
3438 | MTW
3439 | MTX
3440 | MTZ
3441 | MU
3442 | MUA
3443 | MUC
3444 | MUE
3445 | MUFG
3446 | MUH
3447 | MUI
3448 | MUJ
3449 | MUR
3450 | MUS
3451 | MUSA
3452 | MUX
3453 | MVBF
3454 | MVC
3455 | MVF
3456 | MVIS
3457 | MVO
3458 | MVT
3459 | MWA
3460 | MWK
3461 | MX
3462 | MXC
3463 | MXE
3464 | MXF
3465 | MXIM
3466 | MXL
3467 | MYC
3468 | MYD
3469 | MYE
3470 | MYF
3471 | MYGN
3472 | MYI
3473 | MYJ
3474 | MYL
3475 | MYN
3476 | MYO
3477 | MYOK
3478 | MYOS
3479 | MYOV
3480 | MYRG
3481 | MYSZ
3482 | MYT
3483 | MZA
3484 | NAC
3485 | NAD
3486 | NAII
3487 | NAK
3488 | NAKD
3489 | NAN
3490 | NARI
3491 | NAT
3492 | NATH
3493 | NATI
3494 | NATR
3495 | NAV
3496 | NAVB
3497 | NAVI
3498 | NAZ
3499 | NBAC
3500 | NBB
3501 | NBEV
3502 | NBH
3503 | NBHC
3504 | NBIX
3505 | NBL
3506 | NBLX
3507 | NBN
3508 | NBO
3509 | NBR
3510 | NBRV
3511 | NBSE
3512 | NBTB
3513 | NBW
3514 | NBY
3515 | NC
3516 | NCA
3517 | NCB
3518 | NCBS
3519 | NCLH
3520 | NCMI
3521 | NCNA
3522 | NCR
3523 | NCSM
3524 | NCTY
3525 | NCV
3526 | NCZ
3527 | NDAQ
3528 | NDLS
3529 | NDP
3530 | NDRA
3531 | NDSN
3532 | NE
3533 | NEA
3534 | NEE
3535 | NEM
3536 | NEN
3537 | NEO
3538 | NEOG
3539 | NEON
3540 | NEOS
3541 | NEP
3542 | NEPH
3543 | NEPT
3544 | NERV
3545 | NES
3546 | NESR
3547 | NET
3548 | NETE
3549 | NEU
3550 | NEV
3551 | NEW
3552 | NEWA
3553 | NEWR
3554 | NEWT
3555 | NEX
3556 | NEXA
3557 | NEXT
3558 | NFBK
3559 | NFE
3560 | NFG
3561 | NFH
3562 | NFIN
3563 | NFJ
3564 | NFLX
3565 | NFTY
3566 | NG
3567 | NGD
3568 | NGG
3569 | NGHC
3570 | NGL
3571 | NGM
3572 | NGS
3573 | NGVC
3574 | NGVT
3575 | NH
3576 | NHA
3577 | NHC
3578 | NHF
3579 | NHI
3580 | NHLD
3581 | NHS
3582 | NHTC
3583 | NI
3584 | NICE
3585 | NICK
3586 | NID
3587 | NIE
3588 | NIM
3589 | NINE
3590 | NIO
3591 | NIQ
3592 | NIU
3593 | NJR
3594 | NJV
3595 | NK
3596 | NKE
3597 | NKG
3598 | NKLA
3599 | NKSH
3600 | NKTR
3601 | NKX
3602 | NL
3603 | NLOK
3604 | NLS
3605 | NLSN
3606 | NLTX
3607 | NLY
3608 | NM
3609 | NMCI
3610 | NMFC
3611 | NMI
3612 | NMIH
3613 | NML
3614 | NMM
3615 | NMR
3616 | NMRD
3617 | NMRK
3618 | NMS
3619 | NMT
3620 | NMTR
3621 | NMY
3622 | NMZ
3623 | NNA
3624 | NNBR
3625 | NNDM
3626 | NNI
3627 | NNN
3628 | NNVC
3629 | NNY
3630 | NOA
3631 | NOAH
3632 | NOC
3633 | NODK
3634 | NOG
3635 | NOK
3636 | NOM
3637 | NOMD
3638 | NOV
3639 | NOVA
3640 | NOVN
3641 | NOVS
3642 | NOVSU
3643 | NOVT
3644 | NOW
3645 | NP
3646 | NPAUU
3647 | NPK
3648 | NPN
3649 | NPO
3650 | NPTN
3651 | NPV
3652 | NQP
3653 | NR
3654 | NRBO
3655 | NRC
3656 | NREF
3657 | NRG
3658 | NRIM
3659 | NRK
3660 | NRO
3661 | NRP
3662 | NRT
3663 | NRZ
3664 | NS
3665 | NSA
3666 | NSC
3667 | NSCO
3668 | NSEC
3669 | NSIT
3670 | NSL
3671 | NSP
3672 | NSPR
3673 | NSSC
3674 | NSTG
3675 | NSYS
3676 | NTAP
3677 | NTB
3678 | NTCO
3679 | NTCT
3680 | NTEC
3681 | NTES
3682 | NTG
3683 | NTGR
3684 | NTIC
3685 | NTIP
3686 | NTLA
3687 | NTN
3688 | NTNX
3689 | NTP
3690 | NTR
3691 | NTRA
3692 | NTRP
3693 | NTRS
3694 | NTUS
3695 | NTWK
3696 | NTZ
3697 | NUAN
3698 | NUE
3699 | NUM
3700 | NUO
3701 | NURO
3702 | NUS
3703 | NUV
3704 | NUVA
3705 | NUW
3706 | NVAX
3707 | NVCN
3708 | NVCR
3709 | NVDA
3710 | NVEC
3711 | NVEE
3712 | NVFY
3713 | NVG
3714 | NVGS
3715 | NVIV
3716 | NVMI
3717 | NVO
3718 | NVR
3719 | NVRO
3720 | NVS
3721 | NVST
3722 | NVT
3723 | NVTA
3724 | NVUS
3725 | NWBI
3726 | NWE
3727 | NWFL
3728 | NWGI
3729 | NWHM
3730 | NWL
3731 | NWLI
3732 | NWN
3733 | NWPX
3734 | NWS
3735 | NWSA
3736 | NX
3737 | NXC
3738 | NXE
3739 | NXGN
3740 | NXJ
3741 | NXN
3742 | NXP
3743 | NXPI
3744 | NXQ
3745 | NXR
3746 | NXRT
3747 | NXST
3748 | NXTC
3749 | NXTD
3750 | NXTG
3751 | NYCB
3752 | NYMT
3753 | NYMX
3754 | NYT
3755 | NYV
3756 | NZF
3757 | O
3758 | OAC
3759 | OAS
3760 | OBAS
3761 | OBCI
3762 | OBLG
3763 | OBLN
3764 | OBNK
3765 | OBSV
3766 | OC
3767 | OCC
3768 | OCCI
3769 | OCFC
3770 | OCFT
3771 | OCGN
3772 | OCN
3773 | OCSI
3774 | OCSL
3775 | OCUL
3776 | OCX
3777 | ODC
3778 | ODFL
3779 | ODP
3780 | ODT
3781 | OEC
3782 | OEG
3783 | OESX
3784 | OFC
3785 | OFED
3786 | OFG
3787 | OFIX
3788 | OFLX
3789 | OFS
3790 | OGE
3791 | OGEN
3792 | OGI
3793 | OGS
3794 | OHI
3795 | OI
3796 | OIA
3797 | OII
3798 | OIIM
3799 | OIS
3800 | OKE
3801 | OKTA
3802 | OLD
3803 | OLED
3804 | OLLI
3805 | OLN
3806 | OLP
3807 | OMAB
3808 | OMC
3809 | OMCL
3810 | OMER
3811 | OMEX
3812 | OMF
3813 | OMI
3814 | OMP
3815 | ON
3816 | ONB
3817 | ONCS
3818 | ONCT
3819 | ONCY
3820 | ONDK
3821 | ONE
3822 | ONEM
3823 | ONEQ
3824 | ONEW
3825 | ONTO
3826 | ONTX
3827 | ONVO
3828 | OOMA
3829 | OPBK
3830 | OPCH
3831 | OPES
3832 | OPGN
3833 | OPHC
3834 | OPI
3835 | OPK
3836 | OPNT
3837 | OPOF
3838 | OPP
3839 | OPRA
3840 | OPRT
3841 | OPRX
3842 | OPTN
3843 | OPTT
3844 | OPY
3845 | OR
3846 | ORA
3847 | ORAN
3848 | ORBC
3849 | ORC
3850 | ORCC
3851 | ORCL
3852 | ORGO
3853 | ORGS
3854 | ORI
3855 | ORIC
3856 | ORLY
3857 | ORMP
3858 | ORN
3859 | ORRF
3860 | ORTX
3861 | OSB
3862 | OSBC
3863 | OSG
3864 | OSIS
3865 | OSK
3866 | OSMT
3867 | OSN
3868 | OSPN
3869 | OSS
3870 | OSTK
3871 | OSUR
3872 | OSW
3873 | OTEL
3874 | OTEX
3875 | OTIC
3876 | OTIS
3877 | OTLK
3878 | OTTR
3879 | OUT
3880 | OVBC
3881 | OVID
3882 | OVLY
3883 | OVV
3884 | OXBR
3885 | OXFD
3886 | OXLC
3887 | OXM
3888 | OXSQ
3889 | OXY
3890 | OYST
3891 | OZK
3892 | PAA
3893 | PAAS
3894 | PAC
3895 | PACB
3896 | PACD
3897 | PACK
3898 | PACQ
3899 | PACW
3900 | PAE
3901 | PAG
3902 | PAGP
3903 | PAGS
3904 | PAHC
3905 | PAI
3906 | PAM
3907 | PANL
3908 | PANW
3909 | PAR
3910 | PARR
3911 | PASG
3912 | PATI
3913 | PATK
3914 | PAVM
3915 | PAYC
3916 | PAYS
3917 | PAYX
3918 | PB
3919 | PBA
3920 | PBCT
3921 | PBF
3922 | PBFS
3923 | PBFX
3924 | PBH
3925 | PBHC
3926 | PBI
3927 | PBIP
3928 | PBPB
3929 | PBR
3930 | PBT
3931 | PBTS
3932 | PBYI
3933 | PCAR
3934 | PCB
3935 | PCF
3936 | PCG
3937 | PCH
3938 | PCI
3939 | PCK
3940 | PCM
3941 | PCN
3942 | PCOM
3943 | PCPL
3944 | PCQ
3945 | PCRX
3946 | PCSB
3947 | PCTI
3948 | PCTY
3949 | PCVX
3950 | PCYG
3951 | PCYO
3952 | PD
3953 | PDBC
3954 | PDCE
3955 | PDCO
3956 | PDD
3957 | PDEX
3958 | PDFS
3959 | PDI
3960 | PDLB
3961 | PDLI
3962 | PDM
3963 | PDP
3964 | PDS
3965 | PDSB
3966 | PDT
3967 | PE
3968 | PEAK
3969 | PEB
3970 | PEBK
3971 | PEBO
3972 | PECK
3973 | PED
3974 | PEG
3975 | PEGA
3976 | PEI
3977 | PEIX
3978 | PEN
3979 | PENN
3980 | PEO
3981 | PEP
3982 | PER
3983 | PERI
3984 | PESI
3985 | PETQ
3986 | PETS
3987 | PETZ
3988 | PEY
3989 | PEZ
3990 | PFBC
3991 | PFBI
3992 | PFD
3993 | PFE
3994 | PFF
3995 | PFG
3996 | PFGC
3997 | PFHD
3998 | PFI
3999 | PFIE
4000 | PFIN
4001 | PFIS
4002 | PFL
4003 | PFLT
4004 | PFM
4005 | PFMT
4006 | PFN
4007 | PFNX
4008 | PFO
4009 | PFPT
4010 | PFS
4011 | PFSI
4012 | PFSW
4013 | PG
4014 | PGC
4015 | PGEN
4016 | PGJ
4017 | PGNY
4018 | PGP
4019 | PGR
4020 | PGRE
4021 | PGTI
4022 | PGZ
4023 | PH
4024 | PHAS
4025 | PHAT
4026 | PHCF
4027 | PHD
4028 | PHG
4029 | PHGE
4030 | PHI
4031 | PHIO
4032 | PHK
4033 | PHM
4034 | PHO
4035 | PHR
4036 | PHT
4037 | PHUN
4038 | PHX
4039 | PI
4040 | PIC
4041 | PICO
4042 | PID
4043 | PIE
4044 | PIH
4045 | PII
4046 | PIM
4047 | PINC
4048 | PINE
4049 | PING
4050 | PINS
4051 | PIO
4052 | PIPR
4053 | PIRS
4054 | PIXY
4055 | PIZ
4056 | PJT
4057 | PK
4058 | PKBK
4059 | PKE
4060 | PKG
4061 | PKI
4062 | PKO
4063 | PKOH
4064 | PKW
4065 | PKX
4066 | PLAB
4067 | PLAG
4068 | PLAN
4069 | PLAY
4070 | PLBC
4071 | PLC
4072 | PLCE
4073 | PLD
4074 | PLG
4075 | PLIN
4076 | PLL
4077 | PLM
4078 | PLMR
4079 | PLNT
4080 | PLOW
4081 | PLPC
4082 | PLRX
4083 | PLSE
4084 | PLT
4085 | PLUG
4086 | PLUS
4087 | PLW
4088 | PLX
4089 | PLXP
4090 | PLXS
4091 | PLYA
4092 | PLYM
4093 | PM
4094 | PMBC
4095 | PMD
4096 | PME
4097 | PMF
4098 | PML
4099 | PMM
4100 | PMO
4101 | PMOM
4102 | PMT
4103 | PMX
4104 | PNBK
4105 | PNC
4106 | PNF
4107 | PNFP
4108 | PNI
4109 | PNM
4110 | PNNT
4111 | PNQI
4112 | PNR
4113 | PNRG
4114 | PNTG
4115 | PNW
4116 | POAI
4117 | PODD
4118 | POL
4119 | POLA
4120 | POOL
4121 | POR
4122 | POST
4123 | POTX
4124 | POWI
4125 | POWL
4126 | PPBI
4127 | PPC
4128 | PPD
4129 | PPG
4130 | PPH
4131 | PPIH
4132 | PPL
4133 | PPR
4134 | PPSI
4135 | PPT
4136 | PQG
4137 | PRA
4138 | PRAA
4139 | PRAH
4140 | PRCP
4141 | PRDO
4142 | PRFT
4143 | PRFZ
4144 | PRGO
4145 | PRGS
4146 | PRGX
4147 | PRI
4148 | PRIM
4149 | PRK
4150 | PRLB
4151 | PRMW
4152 | PRN
4153 | PRNB
4154 | PRO
4155 | PROF
4156 | PROS
4157 | PROV
4158 | PRPH
4159 | PRPL
4160 | PRPO
4161 | PRQR
4162 | PRSC
4163 | PRSP
4164 | PRT
4165 | PRTA
4166 | PRTH
4167 | PRTK
4168 | PRTS
4169 | PRTY
4170 | PRU
4171 | PRVB
4172 | PRVL
4173 | PS
4174 | PSA
4175 | PSB
4176 | PSC
4177 | PSCC
4178 | PSCD
4179 | PSCE
4180 | PSCF
4181 | PSCH
4182 | PSCI
4183 | PSCM
4184 | PSCT
4185 | PSCU
4186 | PSEC
4187 | PSET
4188 | PSF
4189 | PSHG
4190 | PSL
4191 | PSM
4192 | PSMT
4193 | PSN
4194 | PSNL
4195 | PSO
4196 | PSTG
4197 | PSTI
4198 | PSTL
4199 | PSTV
4200 | PSV
4201 | PSX
4202 | PSXP
4203 | PT
4204 | PTC
4205 | PTCT
4206 | PTE
4207 | PTEN
4208 | PTF
4209 | PTGX
4210 | PTH
4211 | PTI
4212 | PTLA
4213 | PTMN
4214 | PTN
4215 | PTNR
4216 | PTON
4217 | PTR
4218 | PTSI
4219 | PTVCB
4220 | PTY
4221 | PUB
4222 | PUI
4223 | PUK
4224 | PULM
4225 | PUMP
4226 | PUYI
4227 | PVAC
4228 | PVAL
4229 | PVBC
4230 | PVG
4231 | PVH
4232 | PVL
4233 | PW
4234 | PWFL
4235 | PWOD
4236 | PWR
4237 | PXD
4238 | PXI
4239 | PXLW
4240 | PXS
4241 | PY
4242 | PYN
4243 | PYPD
4244 | PYPL
4245 | PYZ
4246 | PZC
4247 | PZG
4248 | PZN
4249 | PZZA
4250 | QABA
4251 | QADA
4252 | QAT
4253 | QCLN
4254 | QCOM
4255 | QCRH
4256 | QD
4257 | QDEL
4258 | QEP
4259 | QES
4260 | QFIN
4261 | QGEN
4262 | QIWI
4263 | QK
4264 | QLC
4265 | QLGN
4266 | QLYS
4267 | QMCO
4268 | QNST
4269 | QQEW
4270 | QQQ
4271 | SPY
4272 | QQQX
4273 | QQXT
4274 | QRHC
4275 | QRTEA
4276 | QRVO
4277 | QSR
4278 | QTEC
4279 | QTNT
4280 | QTRX
4281 | QTS
4282 | QTT
4283 | QTWO
4284 | QUAD
4285 | QUIK
4286 | QUMU
4287 | QUOT
4288 | QURE
4289 | QYLD
4290 | R
4291 | RA
4292 | RACE
4293 | RAD
4294 | RADA
4295 | RAIL
4296 | RAMP
4297 | RAND
4298 | RAPT
4299 | RARE
4300 | RAVE
4301 | RAVN
4302 | RBA
4303 | RBB
4304 | RBBN
4305 | RBC
4306 | RBCAA
4307 | RBCN
4308 | RBNC
4309 | RBS
4310 | RC
4311 | RCEL
4312 | RCG
4313 | RCI
4314 | RCII
4315 | RCKT
4316 | RCKY
4317 | RCL
4318 | RCM
4319 | RCMT
4320 | RCON
4321 | RCS
4322 | RCUS
4323 | RDCM
4324 | RDFN
4325 | RDHL
4326 | RDI
4327 | RDN
4328 | RDNT
4329 | RDUS
4330 | RDVT
4331 | RDVY
4332 | RDWR
4333 | RDY
4334 | RE
4335 | REAL
4336 | REDU
4337 | REED
4338 | REFR
4339 | REG
4340 | REGI
4341 | REGN
4342 | REI
4343 | REKR
4344 | RELL
4345 | RELV
4346 | RELX
4347 | RENN
4348 | REPH
4349 | REPL
4350 | RES
4351 | RESI
4352 | RESN
4353 | RETA
4354 | RETO
4355 | REV
4356 | REVG
4357 | REX
4358 | REXN
4359 | REXR
4360 | REYN
4361 | REZI
4362 | RF
4363 | RFAP
4364 | RFDI
4365 | RFEM
4366 | RFEU
4367 | RFI
4368 | RFIL
4369 | RFL
4370 | RFP
4371 | RGA
4372 | RGCO
4373 | RGEN
4374 | RGLD
4375 | RGLS
4376 | RGNX
4377 | RGP
4378 | RGR
4379 | RGS
4380 | RGT
4381 | RH
4382 | RHE
4383 | RHI
4384 | RHP
4385 | RIBT
4386 | RICK
4387 | RIF
4388 | RIG
4389 | RIGL
4390 | RILY
4391 | RING
4392 | RIO
4393 | RIOT
4394 | RIV
4395 | RJF
4396 | RKDA
4397 | RL
4398 | RLGT
4399 | RLGY
4400 | RLH
4401 | RLI
4402 | RLJ
4403 | RLMD
4404 | RM
4405 | RMAX
4406 | RMBI
4407 | RMBL
4408 | RMBS
4409 | RMCF
4410 | RMD
4411 | RMED
4412 | RMG
4413 | RMI
4414 | RMNI
4415 | RMR
4416 | RMT
4417 | RMTI
4418 | RNA
4419 | RNDM
4420 | RNDV
4421 | RNEM
4422 | RNET
4423 | RNG
4424 | RNGR
4425 | RNLC
4426 | RNMC
4427 | RNP
4428 | RNR
4429 | RNSC
4430 | RNST
4431 | RNWK
4432 | ROAD
4433 | ROBO
4434 | ROBT
4435 | ROCK
4436 | ROG
4437 | ROIC
4438 | ROK
4439 | ROKU
4440 | ROL
4441 | ROLL
4442 | ROP
4443 | ROSE
4444 | ROST
4445 | ROYT
4446 | RP
4447 | RPAI
4448 | RPAY
4449 | RPD
4450 | RPLA
4451 | RPM
4452 | RPRX
4453 | RPT
4454 | RPTX
4455 | RQI
4456 | RRBI
4457 | RRC
4458 | RRD
4459 | RRGB
4460 | RRR
4461 | RS
4462 | RSG
4463 | RSSS
4464 | RST
4465 | RTH
4466 | RTIX
4467 | RTLR
4468 | RTRX
4469 | RTW
4470 | RTX
4471 | RUBI
4472 | RUBY
4473 | RUHN
4474 | RUN
4475 | RUSHA
4476 | RUTH
4477 | RVI
4478 | RVLV
4479 | RVMD
4480 | RVNC
4481 | RVP
4482 | RVSB
4483 | RVT
4484 | RWLK
4485 | RWT
4486 | RXN
4487 | RY
4488 | RYAAY
4489 | RYAM
4490 | RYB
4491 | RYCE
4492 | RYI
4493 | RYN
4494 | RYTM
4495 | SA
4496 | SABR
4497 | SACH
4498 | SAFE
4499 | SAFM
4500 | SAFT
4501 | SAGE
4502 | SAH
4503 | SAIA
4504 | SAIC
4505 | SAIL
4506 | SAL
4507 | SALM
4508 | SALT
4509 | SAM
4510 | SAMA
4511 | SAMG
4512 | SAN
4513 | SAND
4514 | SANM
4515 | SANW
4516 | SAP
4517 | SAR
4518 | SASR
4519 | SATS
4520 | SAVA
4521 | SAVE
4522 | SB
4523 | SBAC
4524 | SBBP
4525 | SBBX
4526 | SBCF
4527 | SBE
4528 | SBFG
4529 | SBGI
4530 | SBH
4531 | SBI
4532 | SBLK
4533 | SBNY
4534 | SBOW
4535 | SBPH
4536 | SBR
4537 | SBRA
4538 | SBS
4539 | SBSI
4540 | SBSW
4541 | SBT
4542 | SBUX
4543 | SC
4544 | SCCO
4545 | SCD
4546 | SCHL
4547 | SCHN
4548 | SCHW
4549 | SCI
4550 | SCKT
4551 | SCL
4552 | SCM
4553 | SCON
4554 | SCOR
4555 | SCPH
4556 | SCPL
4557 | SCS
4558 | SCSC
4559 | SCU
4560 | SCVL
4561 | SCWX
4562 | SCX
4563 | SCYX
4564 | SCZ
4565 | SD
4566 | SDC
4567 | SDG
4568 | SDGR
4569 | SDPI
4570 | SDVY
4571 | SE
4572 | SEAC
4573 | SEAS
4574 | SEB
4575 | SECO
4576 | SEDG
4577 | SEE
4578 | SEED
4579 | SEEL
4580 | SEIC
4581 | SELB
4582 | SELF
4583 | SEM
4584 | SENEA
4585 | SENS
4586 | SERV
4587 | SESN
4588 | SF
4589 | SFBC
4590 | SFBS
4591 | SFE
4592 | SFET
4593 | SFIX
4594 | SFL
4595 | SFM
4596 | SFNC
4597 | SFST
4598 | SFTW
4599 | SFUN
4600 | SG
4601 | SGA
4602 | SGBX
4603 | SGC
4604 | SGEN
4605 | SGH
4606 | SGLB
4607 | SGMA
4608 | SGMO
4609 | SGMS
4610 | SGOC
4611 | SGRP
4612 | SGRY
4613 | SGU
4614 | SHAK
4615 | SHBI
4616 | SHEN
4617 | SHG
4618 | SHI
4619 | SHIP
4620 | SHLL
4621 | SHLO
4622 | SHLX
4623 | SHO
4624 | SHOO
4625 | SHOP
4626 | SHSP
4627 | SHV
4628 | SHW
4629 | SHY
4630 | SHYF
4631 | SI
4632 | SIBN
4633 | SIC
4634 | SID
4635 | SIEB
4636 | SIEN
4637 | SIF
4638 | SIFY
4639 | SIG
4640 | SIGA
4641 | SIGI
4642 | SILC
4643 | SILK
4644 | SILV
4645 | SIM
4646 | SIMO
4647 | SINA
4648 | SINO
4649 | SINT
4650 | SIRI
4651 | SITC
4652 | SITE
4653 | SITM
4654 | SIVB
4655 | SIX
4656 | SJ
4657 | SJI
4658 | SJM
4659 | SJR
4660 | SJT
4661 | SJW
4662 | SKM
4663 | SKOR
4664 | SKT
4665 | SKX
4666 | SKY
4667 | SKYS
4668 | SKYW
4669 | SKYY
4670 | SLAB
4671 | SLB
4672 | SLCA
4673 | SLCT
4674 | SLDB
4675 | SLF
4676 | SLG
4677 | SLGG
4678 | SLGL
4679 | SLGN
4680 | SLM
4681 | SLNO
4682 | SLP
4683 | SLQD
4684 | SLQT
4685 | SLRC
4686 | SLRX
4687 | SLS
4688 | SLVO
4689 | SM
4690 | SMAR
4691 | SMBC
4692 | SMBK
4693 | SMCI
4694 | SMCP
4695 | SMED
4696 | SMFG
4697 | SMG
4698 | SMH
4699 | SMIT
4700 | SMLP
4701 | SMM
4702 | SMMCU
4703 | SMMF
4704 | SMMT
4705 | SMP
4706 | SMPL
4707 | SMRT
4708 | SMSI
4709 | SMTC
4710 | SMTS
4711 | SMTX
4712 | SNA
4713 | SNAP
4714 | SNBR
4715 | SNCA
4716 | SNCR
4717 | SND
4718 | SNDE
4719 | SNDL
4720 | SNDR
4721 | SNDX
4722 | SNE
4723 | SNES
4724 | SNFCA
4725 | SNGX
4726 | SNLN
4727 | SNMP
4728 | SNN
4729 | SNOA
4730 | SNP
4731 | SNPS
4732 | SNR
4733 | SNSR
4734 | SNSS
4735 | SNUG
4736 | SNV
4737 | SNX
4738 | SNY
4739 | SO
4740 | SOCL
4741 | SOGO
4742 | SOHO
4743 | SOHU
4744 | SOI
4745 | SOL
4746 | SOLO
4747 | SOLY
4748 | SON
4749 | SONA
4750 | SONM
4751 | SONN
4752 | SONO
4753 | SOR
4754 | SOXX
4755 | SP
4756 | SPAQ
4757 | SPB
4758 | SPCB
4759 | SPCE
4760 | SPE
4761 | SPFI
4762 | SPG
4763 | SPGI
4764 | SPH
4765 | SPI
4766 | SPKE
4767 | SPLK
4768 | SPLP
4769 | SPN
4770 | SPNE
4771 | SPNS
4772 | SPOK
4773 | SPOT
4774 | SPPI
4775 | SPR
4776 | SPRO
4777 | SPRT
4778 | SPSC
4779 | SPT
4780 | SPTN
4781 | SPWH
4782 | SPWR
4783 | SPXC
4784 | SPXX
4785 | SQ
4786 | SQBG
4787 | SQLV
4788 | SQM
4789 | SQNS
4790 | SQQQ
4791 | SR
4792 | SRAX
4793 | SRC
4794 | SRCE
4795 | SRCL
4796 | SRDX
4797 | SRE
4798 | SRET
4799 | SREV
4800 | SRG
4801 | SRI
4802 | SRL
4803 | SRLP
4804 | SRNE
4805 | SRPT
4806 | SRRA
4807 | SRRK
4808 | SRT
4809 | SRTS
4810 | SRV
4811 | SSB
4812 | SSBI
4813 | SSD
4814 | SSKN
4815 | SSL
4816 | SSNC
4817 | SSNT
4818 | SSP
4819 | SSPK
4820 | SSRM
4821 | SSSS
4822 | SSTI
4823 | SSTK
4824 | SSY
4825 | SSYS
4826 | ST
4827 | STAA
4828 | STAF
4829 | STAG
4830 | STAR
4831 | STAY
4832 | STBA
4833 | STC
4834 | STCN
4835 | STE
4836 | STFC
4837 | STG
4838 | STIM
4839 | STK
4840 | STKL
4841 | STKS
4842 | STL
4843 | STLD
4844 | STM
4845 | STMP
4846 | STN
4847 | STNE
4848 | STNG
4849 | STOK
4850 | STON
4851 | STOR
4852 | STPP
4853 | STRA
4854 | STRL
4855 | STRM
4856 | STRO
4857 | STRS
4858 | STRT
4859 | STSA
4860 | STT
4861 | STWD
4862 | STX
4863 | STXB
4864 | STXS
4865 | STZ
4866 | SU
4867 | SUI
4868 | SUM
4869 | SUMR
4870 | SUN
4871 | SUNS
4872 | SUNW
4873 | SUP
4874 | SUPN
4875 | SUPV
4876 | SURF
4877 | SUSB
4878 | SUSC
4879 | SUSL
4880 | SUZ
4881 | SVBI
4882 | SVC
4883 | SVM
4884 | SVMK
4885 | SVRA
4886 | SVT
4887 | SVVC
4888 | SWAV
4889 | SWBI
4890 | SWCH
4891 | SWI
4892 | SWIR
4893 | SWK
4894 | SWKS
4895 | SWM
4896 | SWN
4897 | SWTX
4898 | SWX
4899 | SWZ
4900 | SXC
4901 | SXI
4902 | SXT
4903 | SXTC
4904 | SY
4905 | SYBT
4906 | SYBX
4907 | SYF
4908 | SYK
4909 | SYKE
4910 | SYN
4911 | SYNA
4912 | SYNC
4913 | SYNH
4914 | SYNL
4915 | SYPR
4916 | SYRS
4917 | SYX
4918 | SYY
4919 | SZC
4920 | T
4921 | TA
4922 | TAC
4923 | TACO
4924 | TACT
4925 | TAIT
4926 | TAK
4927 | TAL
4928 | TALO
4929 | TANH
4930 | TAOP
4931 | TAP
4932 | TARA
4933 | TARO
4934 | TAST
4935 | TAT
4936 | TATT
4937 | TAYD
4938 | TBBK
4939 | TBI
4940 | TBIO
4941 | TBK
4942 | TBLT
4943 | TBNK
4944 | TBPH
4945 | TC
4946 | TCBI
4947 | TCBK
4948 | TCCO
4949 | TCDA
4950 | TCF
4951 | TCFC
4952 | TCI
4953 | TCMD
4954 | TCO
4955 | TCOM
4956 | TCON
4957 | TCP
4958 | TCPC
4959 | TCRD
4960 | TCRR
4961 | TCS
4962 | TCX
4963 | TD
4964 | TDC
4965 | TDF
4966 | TDG
4967 | TDIV
4968 | TDOC
4969 | TDS
4970 | TDW
4971 | TDY
4972 | TEAF
4973 | TEAM
4974 | TECD
4975 | TECH
4976 | TECK
4977 | TEDU
4978 | TEF
4979 | TEI
4980 | TEL
4981 | TELA
4982 | TELL
4983 | TEN
4984 | TENB
4985 | TENX
4986 | TEO
4987 | TER
4988 | TERP
4989 | TESS
4990 | TEUM
4991 | TEVA
4992 | TEX
4993 | TFC
4994 | TFFP
4995 | TFII
4996 | TFSL
4997 | TFX
4998 | TG
4999 | TGA
5000 | TGB
5001 | TGC
5002 | TGH
5003 | TGI
5004 | TGLS
5005 | TGNA
5006 | TGP
5007 | TGS
5008 | TGT
5009 | TGTX
5010 | TH
5011 | THBR
5012 | THC
5013 | THCA
5014 | THCB
5015 | THFF
5016 | THG
5017 | THM
5018 | THMO
5019 | THO
5020 | THQ
5021 | THR
5022 | THRM
5023 | THS
5024 | THTX
5025 | THW
5026 | TIF
5027 | TIGO
5028 | TIGR
5029 | TILE
5030 | TIPT
5031 | TISI
5032 | TITN
5033 | TJX
5034 | TK
5035 | TKAT
5036 | TKC
5037 | TKR
5038 | TLC
5039 | TLF
5040 | TLGT
5041 | TLI
5042 | TLK
5043 | TLND
5044 | TLRD
5045 | TLRY
5046 | TLSA
5047 | TLT
5048 | TLYS
5049 | TM
5050 | TMBR
5051 | TMDI
5052 | TMDX
5053 | TME
5054 | TMHC
5055 | TMO
5056 | TMP
5057 | TMQ
5058 | TMST
5059 | TMUS
5060 | TNAV
5061 | TNC
5062 | TNDM
5063 | TNET
5064 | TNK
5065 | TNP
5066 | TNXP
5067 | TOL
5068 | TOPS
5069 | TORC
5070 | TOT
5071 | TOTA
5072 | TOUR
5073 | TOWN
5074 | TPB
5075 | TPC
5076 | TPCO
5077 | TPH
5078 | TPHS
5079 | TPIC
5080 | TPL
5081 | TPR
5082 | TPRE
5083 | TPTX
5084 | TPVG
5085 | TPX
5086 | TPZ
5087 | TQQQ
5088 | TR
5089 | TRC
5090 | TRCH
5091 | TREC
5092 | TREE
5093 | TREX
5094 | TRGP
5095 | TRHC
5096 | TRI
5097 | TRIB
5098 | TRIL
5099 | TRIP
5100 | TRMB
5101 | TRMD
5102 | TRMK
5103 | TRMT
5104 | TRN
5105 | TRNE
5106 | TRNO
5107 | TRNS
5108 | TROW
5109 | TROX
5110 | TRP
5111 | TRPX
5112 | TRQ
5113 | TRS
5114 | TRST
5115 | TRT
5116 | TRTN
5117 | TRTX
5118 | TRU
5119 | TRUE
5120 | TRUP
5121 | TRV
5122 | TRVG
5123 | TRVI
5124 | TRVN
5125 | TRWH
5126 | TRX
5127 | TRXC
5128 | TS
5129 | TSBK
5130 | TSC
5131 | TSCO
5132 | TSE
5133 | TSEM
5134 | TSI
5135 | TSLA
5136 | TSLX
5137 | TSM
5138 | TSN
5139 | TSQ
5140 | TSRI
5141 | TSU
5142 | TT
5143 | TTC
5144 | TTD
5145 | TTEC
5146 | TTEK
5147 | TTGT
5148 | TTI
5149 | TTM
5150 | TTMI
5151 | TTNP
5152 | TTOO
5153 | TTP
5154 | TTPH
5155 | TTTN
5156 | TTWO
5157 | TU
5158 | TUFN
5159 | TUP
5160 | TUR
5161 | TURN
5162 | TUSA
5163 | TUSK
5164 | TV
5165 | TVE
5166 | TVIX
5167 | TVTY
5168 | TW
5169 | TWI
5170 | TWIN
5171 | TWLO
5172 | TWMC
5173 | TWN
5174 | TWNK
5175 | TWO
5176 | TWOU
5177 | TWST
5178 | TWTR
5179 | TX
5180 | TXG
5181 | TXMD
5182 | TXN
5183 | TXRH
5184 | TXT
5185 | TY
5186 | TYG
5187 | TYHT
5188 | TYL
5189 | TYME
5190 | TZAC
5191 | TZOO
5192 | UA
5193 | UAA
5194 | UAE
5195 | UAL
5196 | UAMY
5197 | UAN
5198 | UAVS
5199 | UBA
5200 | UBCP
5201 | UBER
5202 | UBFO
5203 | UBOH
5204 | UBS
5205 | UBSI
5206 | UBX
5207 | UCBI
5208 | UCL
5209 | UCTT
5210 | UDR
5211 | UE
5212 | UEC
5213 | UEIC
5214 | UEPS
5215 | UFAB
5216 | UFCS
5217 | UFI
5218 | UFO
5219 | UFPI
5220 | UFPT
5221 | UFS
5222 | UG
5223 | UGI
5224 | UGLD
5225 | UGP
5226 | UHAL
5227 | UHS
5228 | UHT
5229 | UI
5230 | UIHC
5231 | UIS
5232 | UL
5233 | ULBI
5234 | ULH
5235 | ULTA
5236 | UMBF
5237 | UMC
5238 | UMH
5239 | UMPQ
5240 | UMRX
5241 | UN
5242 | UNB
5243 | UNF
5244 | UNFI
5245 | UNH
5246 | UNIT
5247 | UNM
5248 | UNP
5249 | UNTY
5250 | UNVR
5251 | UONE
5252 | UONEK
5253 | UPLD
5254 | UPS
5255 | UPWK
5256 | URBN
5257 | URG
5258 | URGN
5259 | URI
5260 | UROV
5261 | USA
5262 | USAC
5263 | USAK
5264 | USAP
5265 | USAS
5266 | USAU
5267 | USB
5268 | USCR
5269 | USDP
5270 | USEG
5271 | USFD
5272 | USIG
5273 | USIO
5274 | USLB
5275 | USLM
5276 | USLV
5277 | USM
5278 | USMC
5279 | USNA
5280 | USOI
5281 | USPH
5282 | USWS
5283 | USX
5284 | UTF
5285 | UTG
5286 | UTHR
5287 | UTI
5288 | UTL
5289 | UTMD
5290 | UTSI
5291 | UUU
5292 | UUUU
5293 | UVE
5294 | UVSP
5295 | UVV
5296 | UXIN
5297 | V
5298 | VAC
5299 | VAL
5300 | VALE
5301 | VALU
5302 | VAPO
5303 | VAR
5304 | VBF
5305 | VBFC
5306 | VBIV
5307 | VBLT
5308 | VBND
5309 | VBTX
5310 | VC
5311 | VCEL
5312 | VCF
5313 | VCIF
5314 | VCIT
5315 | VCLT
5316 | VCNX
5317 | VCRA
5318 | VCSH
5319 | VCTR
5320 | VCV
5321 | VCYT
5322 | VEC
5323 | VECO
5324 | VEDL
5325 | VEEV
5326 | VEL
5327 | VEON
5328 | VER
5329 | VERB
5330 | VERI
5331 | VERO
5332 | VERU
5333 | VERY
5334 | VET
5335 | VETS
5336 | VFC
5337 | VFF
5338 | VFL
5339 | VG
5340 | VGI
5341 | VGIT
5342 | VGLT
5343 | VGM
5344 | VGR
5345 | VGSH
5346 | VGZ
5347 | VHC
5348 | VHI
5349 | VIAC
5350 | VIAV
5351 | VICI
5352 | VICR
5353 | VIDI
5354 | VIE
5355 | VIGI
5356 | VIIX
5357 | VIOT
5358 | VIPS
5359 | VIR
5360 | VIRC
5361 | VIRT
5362 | VISL
5363 | VIST
5364 | VIV
5365 | VIVE
5366 | VIVO
5367 | VJET
5368 | VKI
5369 | VKQ
5370 | VKTX
5371 | VLGEA
5372 | VLO
5373 | VLRS
5374 | VLT
5375 | VLY
5376 | VMBS
5377 | VMC
5378 | VMD
5379 | VMI
5380 | VMM
5381 | VMO
5382 | VMW
5383 | VNCE
5384 | VNDA
5385 | VNE
5386 | VNET
5387 | VNO
5388 | VNOM
5389 | VNQI
5390 | VNRX
5391 | VNTR
5392 | VOC
5393 | VOD
5394 | VOLT
5395 | VONE
5396 | VONG
5397 | VONV
5398 | VOXX
5399 | VOYA
5400 | VPG
5401 | VPV
5402 | VRA
5403 | VRAY
5404 | VRCA
5405 | VREX
5406 | VRIG
5407 | VRM
5408 | VRNA
5409 | VRNS
5410 | VRNT
5411 | VRRM
5412 | VRS
5413 | VRSK
5414 | VRSN
5415 | VRT
5416 | VRTS
5417 | VRTU
5418 | VRTV
5419 | VRTX
5420 | VSAT
5421 | VSDA
5422 | VSEC
5423 | VSH
5424 | VSLR
5425 | VSMV
5426 | VST
5427 | VSTM
5428 | VSTO
5429 | VTA
5430 | VTC
5431 | VTGN
5432 | VTHR
5433 | VTIP
5434 | VTN
5435 | VTNR
5436 | VTR
5437 | VTSI
5438 | VTVT
5439 | VTWG
5440 | VTWO
5441 | VTWV
5442 | VUSE
5443 | VUZI
5444 | VVI
5445 | VVNT
5446 | VVPR
5447 | VVR
5448 | VVUS
5449 | VVV
5450 | VWOB
5451 | VXRT
5452 | VXUS
5453 | VYGR
5454 | VYMI
5455 | VZ
5456 | W
5457 | WAB
5458 | WABC
5459 | WAFD
5460 | WAFU
5461 | WAL
5462 | WALA
5463 | WASH
5464 | WAT
5465 | WATT
5466 | WB
5467 | WBA
5468 | WBAI
5469 | WBK
5470 | WBND
5471 | WBS
5472 | WBT
5473 | WCC
5474 | WCLD
5475 | WCN
5476 | WD
5477 | WDAY
5478 | WDC
5479 | WDFC
5480 | WDR
5481 | WEA
5482 | WEC
5483 | WEI
5484 | WELL
5485 | WEN
5486 | WERN
5487 | WES
5488 | WETF
5489 | WEX
5490 | WEYS
5491 | WF
5492 | WFC
5493 | WGO
5494 | WH
5495 | WHD
5496 | WHF
5497 | WHG
5498 | WHLM
5499 | WHLR
5500 | WHR
5501 | WIA
5502 | WIFI
5503 | WILC
5504 | WIMI
5505 | WINA
5506 | WINC
5507 | WING
5508 | WINS
5509 | WINT
5510 | WIRE
5511 | WISA
5512 | WIT
5513 | WIW
5514 | WIX
5515 | WK
5516 | WKHS
5517 | WLDN
5518 | WLFC
5519 | WLK
5520 | WLKP
5521 | WLL
5522 | WLTW
5523 | WM
5524 | WMB
5525 | WMC
5526 | WMG
5527 | WMGI
5528 | WMK
5529 | WMS
5530 | WMT
5531 | WNC
5532 | WNEB
5533 | WNS
5534 | WOOD
5535 | WOR
5536 | WORK
5537 | WOW
5538 | WPC
5539 | WPG
5540 | WPM
5541 | WPP
5542 | WPRT
5543 | WPX
5544 | WRB
5545 | WRE
5546 | WRI
5547 | WRK
5548 | WRLD
5549 | WRN
5550 | WRTC
5551 | WSBC
5552 | WSBF
5553 | WSC
5554 | WSFS
5555 | WSG
5556 | WSM
5557 | WSO
5558 | WSR
5559 | WST
5560 | WSTG
5561 | WSTL
5562 | WTBA
5563 | WTER
5564 | WTFC
5565 | WTI
5566 | WTM
5567 | WTRE
5568 | WTRG
5569 | WTRH
5570 | WTRU
5571 | WTS
5572 | WTT
5573 | WTTR
5574 | WU
5575 | WUBA
5576 | WVE
5577 | WVFC
5578 | WVVI
5579 | WW
5580 | WWD
5581 | WWE
5582 | WWR
5583 | WWW
5584 | WY
5585 | WYND
5586 | WYNN
5587 | WYY
5588 | X
5589 | XAIR
5590 | XAN
5591 | XBIO
5592 | XBIT
5593 | XCUR
5594 | XEC
5595 | XEL
5596 | XELA
5597 | XELB
5598 | XENE
5599 | XENT
5600 | XERS
5601 | XFLT
5602 | XFOR
5603 | XGN
5604 | XHR
5605 | XIN
5606 | XLNX
5607 | XLRN
5608 | XNCR
5609 | XNET
5610 | XOM
5611 | XOMA
5612 | XONE
5613 | XP
5614 | XPEL
5615 | XPER
5616 | XPL
5617 | XPO
5618 | XRAY
5619 | XRF
5620 | XRX
5621 | XSPA
5622 | XT
5623 | XTLB
5624 | XTNT
5625 | XXII
5626 | XYF
5627 | XYL
5628 | Y
5629 | YCBD
5630 | YELP
5631 | YETI
5632 | YEXT
5633 | YGYI
5634 | YI
5635 | YIN
5636 | YJ
5637 | YLCO
5638 | YLDE
5639 | YMAB
5640 | YNDX
5641 | YORW
5642 | YPF
5643 | YRCW
5644 | YRD
5645 | YTEN
5646 | YTRA
5647 | YUM
5648 | YUMC
5649 | YVR
5650 | YY
5651 | Z
5652 | ZAGG
5653 | ZBH
5654 | ZBRA
5655 | ZCMD
5656 | ZDGE
5657 | ZEAL
5658 | ZEN
5659 | ZEUS
5660 | ZG
5661 | ZGNX
5662 | ZI
5663 | ZION
5664 | ZIOP
5665 | ZIV
5666 | ZIXI
5667 | ZKIN
5668 | ZLAB
5669 | ZM
5670 | ZN
5671 | ZNGA
5672 | ZNH
5673 | ZNTL
5674 | ZOM
5675 | ZS
5676 | ZSAN
5677 | ZTO
5678 | ZTR
5679 | ZTS
5680 | ZUMZ
5681 | ZUO
5682 | ZVO
5683 | ZYME
5684 | ZYNE
5685 | ZYXI
5686 | NAIL
5687 | DPST
5688 | FVAC
5689 | OTRK
5690 | RKT
5691 | GLD
5692 | JAMF
5693 | NAIL
5694 | UUP
--------------------------------------------------------------------------------