From 3a663535ab7b0f13d00f6eda48b1ac23a3cc499b Mon Sep 17 00:00:00 2001 From: NolanM Date: Mon, 10 Jun 2024 16:02:10 -0400 Subject: [PATCH 01/12] Modify Readme --- README.md | 159 +++++++++++++++++++++++++++++++++- assets/High_Level_Design.png | Bin 0 -> 194974 bytes assets/Star_Schema_NolanM.png | Bin 0 -> 74861 bytes 3 files changed, 157 insertions(+), 2 deletions(-) create mode 100644 assets/High_Level_Design.png create mode 100644 assets/Star_Schema_NolanM.png diff --git a/README.md b/README.md index 7701d7e..060fb0e 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,157 @@ -# DeepLearning_Quant_Trading -The primary objective of this project is to develop and implement a Long Short-Term Memory (LSTM) deep learning model for quantitative trading. +# Deep Learning Quant Trading +The primary objective of this project is to develop and implement a Long Short-Term Memory (LSTM) deep learning model for quantitative trading. This model aims to leverage historical and real-time financial data to predict stock prices accurately, thereby enabling the execution of profitable trading strategies. The project will focus on integrating multiple data sources, cleaning and processing the data, training the LSTM model, and deploying it in a real-time trading environment. + +--- + +## I. Usage +### A. Set Up + +
1. Create Virtual Environment (Python 3.8) + +* If you want to create a new virtual enviroment, you can use the following command in the terminal of the project directory: + + * In Windows or Linux, you can use the following command: + + ```bash + python -m venv venv + ``` + + * Then, you can activate the virtual enviroment by using the following command: + + ```bash + venv\Scripts\activate + ``` + + * In MacOs, you can use the following command: + + ```bash + python3 -m venv venv + ``` + + * Then, you can activate the virtual enviroment by using the following command: + + ```bash + source venv/Scripts/activate + ``` + +* Make sure the virtual environment needed for project is activate with corresponding project directory, you can use the following command: + + * In Windows or Linux, you can use the following command: + + ```bash + venv\Scripts\activate + ``` + + * In MacOs, you can use the following command: + + ```bash + source venv/Scripts/activate + ``` + +
+
+ +
2. Install Dependencies +

+Install requirements.txt: Automatically installed dependencies that needed for the project: + + ```bash + pip install -r requirements.txt + ``` +

+
+ +### B. Set Up Documents +1. Spark: https://medium.com/@ansabiqbal/setting-up-apache-spark-pyspark-on-windows-11-machine-e16b7382624a +2. Kafka: [https://github.com/NolanMM/Notebook-Practice-NolanM/blob/master/Set Up Tool For Data/Windows11/Kafka/Set Up Kafka Instruction.ipynb](https://github.com/NolanMM/Notebook-Practice-NolanM/blob/master/Set%20Up%20Tool%20For%20Data/Windows11/Kafka/Set%20Up%20Kafka%20Instruction.ipynb) +3. PostgreSQL: https://medium.com/@Abhisek_Sahu/installing-postgresql-on-windows-for-sql-practices-671212203e9b +4. PyTorch: https://pytorch.org/get-started/locally/ + +--- + +## II. High Level Design +![image](assets\High_Level_Design.png) + +
Details + +### 1.Data Sources + +- **Reddit:** For extracting sentiment data related to stock mentions. +- **Yahoo Finance API:** For obtaining historical and real-time stock prices and financial data. +- **Alpha Vantage:** For additional financial data and technical indicators. +- **Stock News API:** For news articles and headlines related to stocks. + +### 2.Data Processing + +- **Kafka:** Used as a producer to extract data from various sources. +- **Apache Spark:** Used for data transformation and processing, both in batch and real-time. + +### 3.Data Storage + +- **PostgreSQL Database:** Centralized storage for processed data including stock prices, news, Reddit mentions, and predictions. + +### 4.Machine Learning + +- **PyTorch:** For building, training, and evaluating the LSTM deep learning model. + +### 5.Visualization + +- **Streamlit:** To visualize model predictions, trading performance, and generate interactive reports. + +### 6.Backup and Maintenance (Optional) + +- **PostgreSQL Cloud Backup:** For regular data and model backups to ensure data integrity and availability. +- **System Monitoring:** Continuous monitoring and maintenance of the system to handle issues and improve performance +
+ +## III. Database Schema +![image](assets\Star_Schema_NolanM.png) +
We applying star schema architecture database include + +### Central Fact Table + +- **DimStocks**: This is the central fact table containing information about stocks. It includes the following fields: + - **stock_id (PK)**: Primary Key, a unique identifier for each stock. + - **symbol**: The stock ticker symbol. + - **name**: The full name of the stock. + - **sector_id (FK)**: Foreign Key, links to the sector dimension. + - **industry_id (FK)**: Foreign Key, links to the industry dimension. + +### Dimension Tables + +1. **FactPrices**: Contains detailed pricing information for each stock. + - **price_id (Primary Key)**: Unique identifier for each price entry. + - **stock_id (FK - Stocks)**: Foreign Key, links to the central stock table. + - **date**: The date of the price record. + - **open, high, low, close**: The opening, highest, lowest, and closing prices of the stock. + - **volume**: The trading volume of the stock. + - **adjusted_close**: The adjusted closing price of the stock. +2. **FactNews**: Contains news articles and headlines related to stocks. + - **news_id (Primary Key)**: Unique identifier for each news entry. + - **stock_id (FK - Stocks)**: Foreign Key, links to the central stock table. + - **title**: The title of the news article. + - **source**: The source of the news article. + - **summary**: A summary of the news article. + - **published_date**: The publication date of the news article. + - **url**: The URL link to the full news article. +3. **FactRedditMentions**: Contains data from Reddit mentions related to stocks. + - **mention_id (Primary Key)**: Unique identifier for each Reddit mention. + - **stock_id (FK - Stocks)**: Foreign Key, links to the central stock table. + - **post_id**: The ID of the Reddit post. + - **timestamp**: The timestamp of the Reddit mention. + - **mentions**: The number of times the stock is mentioned in the post. + - **upvotes**: The number of upvotes the Reddit post received. + - **comments**: The number of comments on the Reddit post. +4. **FactStocksPredict**: Contains predicted stock prices generated by the LSTM model. + - **prediction_id (Primary Key)**: Unique identifier for each prediction entry. + - **stock_id (FK - Stocks)**: Foreign Key, links to the central stock table. + - **prediction_date**: The date of the prediction. + - **predicted_open, predicted_high, predicted_low, predicted_close**: Predicted opening, highest, lowest, and closing prices of the stock. + - **prediction_timestamp**: The timestamp when the prediction was made. + - **model_version**: The version of the model used for the prediction. + - **confidence_level**: The confidence level of the prediction. + +### **Note:** + +- **Centralized Fact Table**: The DimStocks table is at the center, and all dimension tables are connected to it via foreign keys. +
\ No newline at end of file diff --git a/assets/High_Level_Design.png b/assets/High_Level_Design.png new file mode 100644 index 0000000000000000000000000000000000000000..b3818e0b344627c05556e57e1d21f003a84db408 GIT binary patch literal 194974 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 literal 0 HcmV?d00001 diff --git a/assets/Star_Schema_NolanM.png b/assets/Star_Schema_NolanM.png new file mode 100644 index 0000000000000000000000000000000000000000..f0bab1605c6b9c24a282d153201d27abcbec3307 GIT binary patch literal 74861 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 bz4UE~LZZ(++s#SH-MDg5O*!|1>HYr$P5@Hq literal 0 HcmV?d00001 From 955221427771989676799011f25de657ed3b72f3 Mon Sep 17 00:00:00 2001 From: Minh Nguyen Date: Mon, 10 Jun 2024 16:03:49 -0400 Subject: [PATCH 02/12] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 060fb0e..ffd0c30 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ Install requirements.txt: Automatically installed dependencies that needed for t --- ## II. High Level Design -![image](assets\High_Level_Design.png) +![image](assets/High_Level_Design.png)
Details @@ -105,7 +105,7 @@ Install requirements.txt: Automatically installed dependencies that needed for t
## III. Database Schema -![image](assets\Star_Schema_NolanM.png) +![image](assets/Star_Schema_NolanM.png)
We applying star schema architecture database include ### Central Fact Table @@ -154,4 +154,4 @@ Install requirements.txt: Automatically installed dependencies that needed for t ### **Note:** - **Centralized Fact Table**: The DimStocks table is at the center, and all dimension tables are connected to it via foreign keys. -
\ No newline at end of file + From 02a4d3be9366d82127faa04ef44fa80787841094 Mon Sep 17 00:00:00 2001 From: NolanM Date: Mon, 17 Jun 2024 10:55:51 -0400 Subject: [PATCH 03/12] Add Code for Yahoo Data Retrieve --- .gitignore | 2 + BatchProcess/.env | 0 BatchProcess/BatchProcess.py | 0 BatchProcess/Consumer.py | 97 ++ .../ListSnP500/ListSnP500Collect.py | 23 + BatchProcess/DataSource/YahooFinance/.env | 18 + .../Workbook Yahoo Retrieve Data.ipynb | 1457 +++++++++++++++++ .../YahooFinance/YahooFinances_Services.py | 148 ++ .../YahooFinance/yahoo_finance_data.xlsx | Bin 0 -> 6041 bytes BatchProcess/Producer.py | 31 + Database/PostGreSQLInteraction.py | 50 + 11 files changed, 1826 insertions(+) create mode 100644 .gitignore create mode 100644 BatchProcess/.env create mode 100644 BatchProcess/BatchProcess.py create mode 100644 BatchProcess/Consumer.py create mode 100644 BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py create mode 100644 BatchProcess/DataSource/YahooFinance/.env create mode 100644 BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb create mode 100644 BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py create mode 100644 BatchProcess/DataSource/YahooFinance/yahoo_finance_data.xlsx create mode 100644 BatchProcess/Producer.py create mode 100644 Database/PostGreSQLInteraction.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..61d18e2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +myenv +venv diff --git a/BatchProcess/.env b/BatchProcess/.env new file mode 100644 index 0000000..e69de29 diff --git a/BatchProcess/BatchProcess.py b/BatchProcess/BatchProcess.py new file mode 100644 index 0000000..e69de29 diff --git a/BatchProcess/Consumer.py b/BatchProcess/Consumer.py new file mode 100644 index 0000000..491fbe0 --- /dev/null +++ b/BatchProcess/Consumer.py @@ -0,0 +1,97 @@ +from pyspark.sql import SparkSession +from pyspark.sql.functions import from_json, col, to_timestamp +from pyspark.sql.types import StructType, StructField, StringType +from dotenv import load_dotenv +import os + + +class KafkaSparkConsumerStreaming: + def __init__(self): + load_dotenv("../.env",override=True) + + # Load environment variables + self.kafka_v = os.getenv("KAFKA_VERSION") + self.kafka_server = os.getenv("KAFKA_SERVER") + self.kafka_topic = os.getenv("KAFKA_TOPIC") + + self.column_1_name = os.getenv("COLUMN_1") + self.column_2_name = os.getenv("COLUMN_2") + self.column_3_name = os.getenv("COLUMN_3") + + self.checkpoint_location = os.getenv("CHECKPOINT_LOCATION") + + self.postgres_v = os.getenv("POSTGRES_VERSION") + self.postgres_url = os.getenv("POSTGRES_URL") + self.postgres_user = os.getenv("POSTGRES_USER") + self.postgres_pass = os.getenv("POSTGRES_PASSWORD") + self.postgres_table = os.getenv("POSTGRES_TABLE") + self.format_file = os.getenv("FORMAT_FILE") + self._mode = os.getenv("MODE") + + self.config_ = f"{self.kafka_v},{self.postgres_v}" + + # Initialize Spark session with Kafka dependencies and PostgresSQL driver + self.spark = SparkSession.builder \ + .appName("KafkaSpark_Streaming") \ + .config("spark.jars.packages", self.config_) \ + .getOrCreate() + + # Define schema for incoming data + self.schema = StructType([ + StructField(self.column_1_name, StringType(), True), + StructField(self.column_2_name, StringType(), True), + StructField(self.column_3_name, StringType(), True) + ]) + + self.query = None + + def _write_streaming(self, df_, epoch_id) -> None: + df_.write \ + .mode(self._mode) \ + .format(self.format_file) \ + .option("url", f"{self.postgres_url}") \ + .option("driver", "org.postgresql.Driver") \ + .option("dbtable", self.postgres_table) \ + .option("user", self.postgres_user) \ + .option("password", self.postgres_pass) \ + .save() + + def start_streaming(self): + # Read data from Kafka + df = self.spark \ + .readStream \ + .format("kafka") \ + .option("kafka.bootstrap.servers", self.kafka_server) \ + .option("subscribe", self.kafka_topic) \ + .load() + + # Parse the value field + value_df = df.selectExpr("CAST(value AS STRING)") + + # Convert JSON string to DataFrame + json_df = value_df.select(from_json(col("value"), self.schema).alias("data")).select("data.*") + + # Convert event_time to timestamp + json_df = json_df.withColumn(self.column_3_name, to_timestamp(col(self.column_3_name))) + + self.query = json_df.writeStream \ + .foreachBatch(self._write_streaming) \ + .start() + + self.query.awaitTermination() + + def stop_streaming(self): + if self.query is not None: + self.query.stop() + print("Streaming query stopped successfully.") + else: + print("No streaming query to stop.") + + +# Create an instance of the class and start/stop streaming +if __name__ == "__main__": + kafka_spark_streaming = KafkaSparkConsumerStreaming() + try: + kafka_spark_streaming.start_streaming() + except KeyboardInterrupt: + kafka_spark_streaming.stop_streaming() diff --git a/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py b/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py new file mode 100644 index 0000000..d720d8f --- /dev/null +++ b/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py @@ -0,0 +1,23 @@ +import pandas as pd + +list_remove = ['GEV','SOLV','VLTO','BF.B','BRK.B'] + +class ListSAndP500: + def __init__(self): + """ + Initialize the ListSAndP500 class + + Attributes: + tickers_string (list): A list of stock symbols in string format + tickers_list (list): A list of stock symbols in list format + + """ + _tickers = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0] + _tickers = _tickers.Symbol.to_list() + self.tickers_string = [i.replace('.','-') for i in _tickers] + _tickers_list_transform_ = [i if i not in list_remove else False for i in _tickers] + self.tickers_list = [i for i in _tickers_list_transform_ if i] + +""" +Usage: list_of_symbols = ListSAndP500().tickers_list +""" \ No newline at end of file diff --git a/BatchProcess/DataSource/YahooFinance/.env b/BatchProcess/DataSource/YahooFinance/.env new file mode 100644 index 0000000..57f11e5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/.env @@ -0,0 +1,18 @@ +# Postgres Configuration +POSTGRES_VERSION="org.postgresql:postgresql:42.2.20" +POSTGRES_URL="jdbc:postgresql://localhost:5432/postgres" +POSTGRES_USER="postgres" +POSTGRES_PASSWORD="admin" +POSTGRES_TABLE="FactPrices" + +FORMAT_FILE="jdbc" +MODE="append" + +COLUMN_1="stock_id" +COLUMN_2="date" +COLUMN_3="open" +COLUMN_4="high" +COLUMN_5="low" +COLUMN_6="close" +COLUMN_7="volume" +COLUMN_8="adjusted_close" \ No newline at end of file diff --git a/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb new file mode 100644 index 0000000..6243d73 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb @@ -0,0 +1,1457 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 5, + "id": "4e86daf8-e0cb-4767-bb8a-f8cf46a10fbe", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.types import StructType, StructField, StringType\n", + "from pyspark.sql import SparkSession\n", + "from dotenv import load_dotenv\n", + "from datetime import datetime\n", + "import yfinance as yf\n", + "import pandas as pd\n", + "import os\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "postgres_v = os.getenv(\"POSTGRES_VERSION\")\n", + "postgres_url = os.getenv(\"POSTGRES_URL\")\n", + "postgres_user = os.getenv(\"POSTGRES_USER\")\n", + "postgres_pass = os.getenv(\"POSTGRES_PASSWORD\")\n", + "postgres_table = os.getenv(\"POSTGRES_TABLE\")\n", + "format_file = os.getenv(\"FORMAT_FILE\")\n", + "_mode = os.getenv(\"MODE\")\n", + "\n", + "config_ = postgres_v\n", + "\n", + "column_1_name = os.getenv(\"COLUMN_1\")\n", + "column_2_name = os.getenv(\"COLUMN_2\")\n", + "column_3_name = os.getenv(\"COLUMN_3\")\n", + "column_4_name = os.getenv(\"COLUMN_4\")\n", + "column_5_name = os.getenv(\"COLUMN_5\")\n", + "column_6_name = os.getenv(\"COLUMN_6\")\n", + "column_7_name = os.getenv(\"COLUMN_7\")\n", + "column_8_name = os.getenv(\"COLUMN_8\")\n", + "\n", + "list_remove = ['GEV','SOLV','VLTO','BF.B','BRK.B']\n", + "\n", + "class ListSAndP500:\n", + " def __init__(self):\n", + " \"\"\"\n", + " Initialize the ListSAndP500 class\n", + "\n", + " Attributes:\n", + " tickers_string (list): A list of stock symbols in string format\n", + " tickers_list (list): A list of stock symbols in list format\n", + "\n", + " \"\"\"\n", + " _tickers = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]\n", + " _tickers = _tickers.Symbol.to_list()\n", + " self.tickers_string = [i.replace('.','-') for i in _tickers]\n", + " _tickers_list_transform_ = [i if i not in list_remove else False for i in _tickers]\n", + " self.tickers_list = [i for i in _tickers_list_transform_ if i]\n", + " \n", + "list_of_symbols__ = ListSAndP500().tickers_list\n", + "\n", + "class YahooFinance:\n", + " def __init__(self, list_of_symbols, start, end):\n", + " self.schema = StructType([\n", + " StructField(column_1_name, StringType(), True),\n", + " StructField(column_2_name, StringType(), True),\n", + " StructField(column_3_name, StringType(), True),\n", + " StructField(column_4_name, StringType(), True),\n", + " StructField(column_5_name, StringType(), True),\n", + " StructField(column_6_name, StringType(), True),\n", + " StructField(column_7_name, StringType(), True),\n", + " StructField(column_8_name, StringType(), True)\n", + " ])\n", + "\n", + " self.symbols = list_of_symbols\n", + " self.interval = '1d'\n", + " self.start = start\n", + " self.end = end\n", + " self.results = self.process_data()\n", + "\n", + " def process_data(self):\n", + " \"\"\"\n", + " Process the historical stock data for the stock symbols\n", + " \"\"\"\n", + " data = self.get_data()\n", + " return self.transform_data(data)\n", + "\n", + " def get_data(self):\n", + " \"\"\"\n", + " Get historical stock data from Yahoo Finance API using yfinance library\n", + "\n", + " Returns:\n", + " DataFrame: A DataFrame containing historical stock data\n", + " \"\"\"\n", + " try:\n", + " data = yf.download(\n", + " self.symbols,\n", + " start=self.start,\n", + " end=self.end,\n", + " interval=self.interval,\n", + " ignore_tz=True,\n", + " threads=5,\n", + " timeout=60,\n", + " progress=True\n", + " )\n", + " return data\n", + " except Exception as e:\n", + " print(f\"Error downloading data: {e}\")\n", + " return None\n", + "\n", + " def transform_data(self, df):\n", + " \"\"\"\n", + " Transform the historical stock data into a format that can be stored in a database FactPrices table\n", + "\n", + " Args:\n", + " df (DataFrame): A DataFrame containing historical stock data\n", + "\n", + " Returns:\n", + " DataFrame: A DataFrame containing transformed historical stock data with the following columns:\n", + " - stock_id (str): The stock symbol\n", + " - date (str): The date of the stock data\n", + " - open (float): The opening price of the stock\n", + " - high (float): The highest price of the stock\n", + " - low (float): The lowest price of the stock\n", + " - close (float): The closing price of the stock\n", + " - volume (int): The volume of the stock\n", + " - adjusted_close (float): The adjusted closing price of the stock\n", + "\n", + " \"\"\"\n", + " # Reset the index to turn the MultiIndex into columns\n", + " df = df.reset_index()\n", + "\n", + " # Create a list to store transformed records\n", + " records = []\n", + "\n", + " # Iterate over each row and stock symbol\n", + " for index, row in df.iterrows():\n", + " date = row[('Date', '')]\n", + " for stock in self.symbols:\n", + " try:\n", + " record = {\n", + " column_1_name: stock,\n", + " column_2_name: date,\n", + " column_3_name: row[('Open', stock)],\n", + " column_4_name: row[('High', stock)],\n", + " column_5_name: row[('Low', stock)],\n", + " column_6_name: row[('Close', stock)],\n", + " column_7_name: row[('Volume', stock)],\n", + " column_8_name: row[('Adj Close', stock)]\n", + " }\n", + " records.append(record)\n", + " except KeyError as e:\n", + " print(f\"KeyError: {e} for stock: {stock} on date: {date}\")\n", + "\n", + " # Convert the list of records into a DataFrame\n", + " return pd.DataFrame(records)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "7a0cd6a5-3629-42ae-886d-03e872242276", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*********************100%%**********************] 498 of 498 completed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " stock_id date open high low close \\\n", + "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", + "1 AOS 2015-01-02 28.309999 28.415001 27.775000 28.004999 \n", + "2 ABT 2015-01-02 45.250000 45.450001 44.639999 44.900002 \n", + "3 ABBV 2015-01-02 65.440002 66.400002 65.440002 65.889999 \n", + "4 ACN 2015-01-02 89.669998 90.089996 88.430000 88.839996 \n", + "\n", + " volume adjusted_close \n", + "0 2531214.0 92.933624 \n", + "1 1540200.0 24.154337 \n", + "2 3216600.0 37.481434 \n", + "3 5086100.0 44.314434 \n", + "4 2021300.0 75.950920 \n" + ] + } + ], + "source": [ + "transformed_data = YahooFinance(list_of_symbols__, '2015-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", + "print(transformed_data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e3613f13-de97-4dae-b6c7-2b7408806ec0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1184742" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(transformed_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "id": "94ecfc50-b102-4561-b691-51d14a717ad4", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stock_iddateopenhighlowclosevolumeadjusted_close
0MMM2015-01-02137.717392138.026749136.061874137.1739202531214.092.933624
498MMM2015-01-05136.287628136.822739133.846161134.0802614416708.090.837677
996MMM2015-01-06134.464890134.924744131.889633132.6504974224272.089.869041
1494MMM2015-01-07133.695648134.013382132.892975133.6120453685235.090.520477
1992MMM2015-01-08134.322739136.864548134.214050136.8143773758908.092.689987
...........................
1182252MMM2024-06-10100.430000101.839996100.279999100.6600043507600.0100.660004
1182750MMM2024-06-11100.099998101.47000199.230003101.3200002831500.0101.320000
1183248MMM2024-06-12102.620003103.680000100.760002101.2099993704600.0101.209999
1183746MMM2024-06-13102.019997102.800003100.739998101.5400015034700.0101.540001
1184244MMM2024-06-14100.500000101.41999899.309998100.9000022685000.0100.900002
\n", + "

2379 rows × 8 columns

\n", + "
" + ], + "text/plain": [ + " stock_id date open high low close \\\n", + "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", + "498 MMM 2015-01-05 136.287628 136.822739 133.846161 134.080261 \n", + "996 MMM 2015-01-06 134.464890 134.924744 131.889633 132.650497 \n", + "1494 MMM 2015-01-07 133.695648 134.013382 132.892975 133.612045 \n", + "1992 MMM 2015-01-08 134.322739 136.864548 134.214050 136.814377 \n", + "... ... ... ... ... ... ... \n", + "1182252 MMM 2024-06-10 100.430000 101.839996 100.279999 100.660004 \n", + "1182750 MMM 2024-06-11 100.099998 101.470001 99.230003 101.320000 \n", + "1183248 MMM 2024-06-12 102.620003 103.680000 100.760002 101.209999 \n", + "1183746 MMM 2024-06-13 102.019997 102.800003 100.739998 101.540001 \n", + "1184244 MMM 2024-06-14 100.500000 101.419998 99.309998 100.900002 \n", + "\n", + " volume adjusted_close \n", + "0 2531214.0 92.933624 \n", + "498 4416708.0 90.837677 \n", + "996 4224272.0 89.869041 \n", + "1494 3685235.0 90.520477 \n", + "1992 3758908.0 92.689987 \n", + "... ... ... \n", + "1182252 3507600.0 100.660004 \n", + "1182750 2831500.0 101.320000 \n", + "1183248 3704600.0 101.209999 \n", + "1183746 5034700.0 101.540001 \n", + "1184244 2685000.0 100.900002 \n", + "\n", + "[2379 rows x 8 columns]" + ] + }, + "execution_count": 49, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "filtered_data = transformed_data[transformed_data['stock_id'] == list_of_symbols__[0]]\n", + "filtered_data" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "bd7367a7-8c9f-4a71-832b-26e0b3d469b2", + "metadata": {}, + "outputs": [], + "source": [ + "unique_dates = pd.DatetimeIndex(transformed_data['date'].unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "id": "1f3edde9-b968-47d2-8ad3-bf08f9f3870e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1075\n", + " missing_dates\n", + "0 2015-01-01\n", + "1 2015-01-03\n", + "2 2015-01-04\n", + "3 2015-01-10\n", + "4 2015-01-11\n", + "5 2015-01-17\n", + "6 2015-01-18\n", + "7 2015-01-19\n", + "8 2015-01-24\n", + "9 2015-01-25\n", + "10 2015-01-31\n", + "11 2015-02-01\n", + "12 2015-02-07\n", + "13 2015-02-08\n", + "14 2015-02-14\n", + "15 2015-02-15\n", + "16 2015-02-16\n", + "17 2015-02-21\n", + "18 2015-02-22\n", + "19 2015-02-28\n", + "3454\n" + ] + } + ], + "source": [ + "complete_dates = pd.date_range(start='2015-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", + "\n", + "missing_dates = complete_dates.difference(unique_dates)\n", + "\n", + "# Convert missing dates to a DataFrame for display\n", + "missing_dates_df = pd.DataFrame(missing_dates, columns=['missing_dates'])\n", + "\n", + "print(len(missing_dates_df))\n", + "print(missing_dates_df.head(20))\n", + "print(len(complete_dates))" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "id": "4b32d672-8b27-455a-a6f9-91b508244571", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[* 2%% ] 9 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$TYL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NFLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PODD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SLB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AJG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AVY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ALL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NEE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*** 7%% ] 33 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$KEYS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CBRE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AVGO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GPN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DHI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VRSK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$COP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$INCY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$STT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ADM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$REG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HRL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FAST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TGT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CHD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MHK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KIM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[***** 10%% ] 48 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$NVR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CRL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CMS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LOW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MMM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SJM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DLR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WEC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BALL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ECL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SPGI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SYK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$APD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SNA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[****** 12%% ] 60 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$CHTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TSCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VLO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ADI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SMCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TPR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PHM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KLAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BWA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[******** 17%% ] 83 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$ISRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MKTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ABBV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TMO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MCHP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SWK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DVA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IEX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SBUX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HIG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MPC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$APH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BAX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CDNS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[********** 20%% ] 102 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$MET: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CSGP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CMI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MCK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BKR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NOW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AIZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PAYC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ILMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AFL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ROP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MKC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MGM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IFF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IBM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[********** 21%% ] 106 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$TXN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BDX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SRE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[************ 24%% ] 118 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$GOOGL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PANW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WBD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AKAM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KDP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DUK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LLY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[************ 24%% ] 119 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$WFC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[************ 26%% ] 131 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$ORLY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LVS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GOOG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HLT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HCA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ELV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[************** 29%% ] 143 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$WYNN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NOC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EVRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$INTU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$F: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VTRS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GLW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CAG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$XOM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ULTA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[************** 29%% ] 144 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$NWS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*************** 31%% ] 152 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$TTWO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SBAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GRMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BMY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DFS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EOG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*************** 31%% ] 155 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$FE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RJF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[***************** 35%% ] 176 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$MOH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FANG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AXON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PNW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HOLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SWKS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KEY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JNPR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ZTS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JKHY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ACGL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TRV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SHW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[******************* 40%% ] 197 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$MTCH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CSCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EXPD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BRO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CHRW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SYF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MRO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NDAQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RVTY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ALGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DPZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TFX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AVB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NEM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EQR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AME: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ATO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PFE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[********************* 43%% ] 216 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$ADSK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$APTV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AXP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NDSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ADP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RSG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IRM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DTE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CPAY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$OKE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BIO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WDC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$USB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PEG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UNP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************47%% ] 232 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$CPRT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TSLA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$META: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GNRC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CTSH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NXPI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PRU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$V: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TFC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CFG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TJX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FDS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TMUS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************51%% ] 252 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$CCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$J: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ALLE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EFX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FSLR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PGR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EIX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$REGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$D: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$OXY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JBHT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$STX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VRTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CVS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************53%% ] 262 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$ROL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$C: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ADBE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DGX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BLDR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$INTC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MPWR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DRI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************57%%* ] 282 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$BKNG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PLD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WTW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LIN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$STLD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DECK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ED: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FICO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LYV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BLK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CDW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NVDA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HUBB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GWW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************61%%*** ] 305 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$DHR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PAYX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TER: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PNC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ICE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CAH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CMG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MAA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$COO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EXC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KMI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CRM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TECH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TDY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ESS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NWSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HSY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ETN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NSC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ALB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IVZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MSCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************65%%***** ] 324 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$QCOM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WBA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NTRS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ROST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AEP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SYY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SNPS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AWK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AIG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MSFT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$OMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HSIC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RHI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ITW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MLM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************68%%******* ] 340 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$YUM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PEP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DOV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TDG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CNP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RMD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MDLZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CVX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FTNT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PCG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JNJ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************73%%********* ] 364 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$EW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MTD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LRCX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$STE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TRMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TXT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ABT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CMA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ANET: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ORCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BXP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$POOL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ENPH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$O: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UPS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CME: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BBWI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$T: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************73%%********* ] 366 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$FMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************78%%*********** ] 387 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$FI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EXPE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CPT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GPC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PCAR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ETR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$XEL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LHX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TEL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$URI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BIIB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CBOE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EQT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$L: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HPQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************80%%************ ] 396 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$JPM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FITB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LYB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ANSS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FDX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LULU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HUM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************82%%************* ] 407 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$FFIV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IQV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$STZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EXR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TAP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PNR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PKG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LKQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************84%%************** ] 420 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$PTC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CTLT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EQIX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ODFL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NCLH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LNT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UDR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ROK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CTRA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WELL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LUV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************89%%***************** ] 443 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$MNST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EBAY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMZN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NTAP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$COF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NUE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BBY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FRT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ZBH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$IDXX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ARE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PFG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EMR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$NKE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CNC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$VRSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TRGP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CINF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$K: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DOC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************94%%******************* ] 466 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$CL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CTAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DXCM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CMCSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$EPAM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WAB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UHS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TROW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$RTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PPL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HII: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$WRB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MAR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PWR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$SCHW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$KMX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$COR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$DLTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CZR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MCD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$FCX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$ACN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************95%%******************** ] 475 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$DVN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MDT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PARA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AEE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$HBAN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MTB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[**********************99%%**********************] 494 of 498 completed" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$ZBRA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$LDOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$COST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AMCR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$UNH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$APA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$BK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AZO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$CPB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$A: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$XYL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$AAPL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$TT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$PSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MRK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$GILD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$JBL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*********************100%%**********************] 498 of 498 completed\n", + "\n", + "498 Failed downloads:\n", + "['TYL', 'NFLX', 'PODD', 'SLB', 'EMN', 'PH', 'AJG', 'AVY', 'ALL', 'NEE', 'KEYS', 'AMT', 'CBRE', 'AVGO', 'GPN', 'DHI', 'ES', 'VRSK', 'COP', 'INCY', 'STT', 'LEN', 'ADM', 'REG', 'BEN', 'HRL', 'FAST', 'NRG', 'TGT', 'CHD', 'MHK', 'KIM', 'NVR', 'CRL', 'CMS', 'LOW', 'MMM', 'IT', 'SJM', 'DLR', 'WEC', 'BALL', 'ECL', 'SPGI', 'SYK', 'APD', 'SNA', 'CHTR', 'TSCO', 'VLO', 'ADI', 'SMCI', 'TPR', 'WY', 'PHM', 'KLAC', 'BWA', 'ISRG', 'MKTX', 'ABBV', 'TMO', 'MCHP', 'SWK', 'DD', 'DVA', 'IEX', 'SBUX', 'HIG', 'MPC', 'APH', 'DE', 'JCI', 'KO', 'LH', 'BAX', 'MAS', 'CDNS', 'MET', 'CSGP', 'CMI', 'MCK', 'BKR', 'NOW', 'RCL', 'AIZ', 'PAYC', 'ILMN', 'HAS', 'AFL', 'ROP', 'MKC', 'MGM', 'IFF', 'AES', 'RL', 'IBM', 'TXN', 'BX', 'BDX', 'SRE', 'GOOGL', 'PANW', 'WBD', 'VTR', 'MA', 'AKAM', 'WST', 'KDP', 'DUK', 'BG', 'LLY', 'WFC', 'ORLY', 'LVS', 'GOOG', 'HLT', 'HCA', 'ELV', 'PG', 'MCO', 'GIS', 'DG', 'IP', 'WYNN', 'NOC', 'EVRG', 'INTU', 'VTRS', 'GLW', 'CAG', 'CSX', 'XOM', 'ULTA', 'NWS', 'TTWO', 'SBAC', 'GRMN', 'WMB', 'BMY', 'DFS', 'KMB', 'EOG', 'FE', 'RJF', 'MOH', 'FANG', 'HST', 'WM', 'AXON', 'WMT', 'RF', 'PNW', 'HOLX', 'CF', 'BA', 'CAT', 'SWKS', 'KEY', 'JNPR', 'ZTS', 'JKHY', 'ACGL', 'TRV', 'ON', 'SHW', 'MTCH', 'CSCO', 'EXPD', 'BRO', 'CHRW', 'SYF', 'MRO', 'NDAQ', 'RVTY', 'ALGN', 'MOS', 'DPZ', 'TFX', 'AVB', 'NEM', 'EQR', 'AME', 'ATO', 'EL', 'PFE', 'ADSK', 'APTV', 'EG', 'PPG', 'AXP', 'NDSN', 'ADP', 'RSG', 'IRM', 'DTE', 'GS', 'CPAY', 'OKE', 'BIO', 'WDC', 'USB', 'PEG', 'UNP', 'CPRT', 'TSLA', 'META', 'GNRC', 'EA', 'CTSH', 'NXPI', 'PRU', 'V', 'TFC', 'CFG', 'CCL', 'TJX', 'FDS', 'TMUS', 'CCI', 'J', 'ALLE', 'EFX', 'FSLR', 'PGR', 'EIX', 'GE', 'REGN', 'D', 'KR', 'IPG', 'OXY', 'JBHT', 'FIS', 'GL', 'STX', 'VRTX', 'HAL', 'CVS', 'ROL', 'C', 'ADBE', 'DGX', 'BLDR', 'GD', 'INTC', 'MPWR', 'CB', 'DRI', 'BKNG', 'GEN', 'PLD', 'WTW', 'LIN', 'STLD', 'DECK', 'ED', 'CLX', 'LMT', 'FICO', 'LYV', 'BLK', 'NI', 'CDW', 'NVDA', 'HUBB', 'GWW', 'DHR', 'PAYX', 'TER', 'PNC', 'ICE', 'CAH', 'CMG', 'MAA', 'COO', 'EXC', 'KMI', 'CRM', 'TECH', 'TDY', 'ESS', 'NWSA', 'HSY', 'ETN', 'NSC', 'ALB', 'VMC', 'IVZ', 'WAT', 'MSCI', 'QCOM', 'WBA', 'NTRS', 'ROST', 'AEP', 'PSX', 'SYY', 'DAL', 'SNPS', 'AWK', 'AIG', 'MSFT', 'DIS', 'OMC', 'HSIC', 'RHI', 'ITW', 'MLM', 'YUM', 'PEP', 'DOV', 'TDG', 'CNP', 'RMD', 'AMAT', 'MDLZ', 'CI', 'HES', 'CVX', 'UAL', 'FTNT', 'PCG', 'JNJ', 'MO', 'EW', 'MTD', 'LRCX', 'BSX', 'STE', 'TRMB', 'AMD', 'TXT', 'ABT', 'CMA', 'ANET', 'ORCL', 'CE', 'BXP', 'POOL', 'ENPH', 'O', 'UPS', 'CME', 'BBWI', 'T', 'FMC', 'HD', 'FI', 'EXPE', 'CPT', 'GPC', 'VZ', 'HON', 'PCAR', 'ETR', 'XEL', 'LHX', 'TEL', 'URI', 'BIIB', 'TSN', 'CBOE', 'MMC', 'EQT', 'SO', 'L', 'HPQ', 'JPM', 'FITB', 'BAC', 'LYB', 'ANSS', 'FDX', 'LULU', 'HUM', 'FFIV', 'IQV', 'STZ', 'EXR', 'AON', 'TAP', 'PNR', 'MU', 'PKG', 'LKQ', 'PTC', 'CTLT', 'EQIX', 'ODFL', 'NCLH', 'LNT', 'UDR', 'ROK', 'CTRA', 'WELL', 'LUV', 'MNST', 'EBAY', 'AMZN', 'NTAP', 'COF', 'NUE', 'BBY', 'FRT', 'ZBH', 'IDXX', 'ARE', 'PFG', 'EMR', 'NKE', 'CNC', 'VRSN', 'AAL', 'TRGP', 'CINF', 'K', 'AOS', 'DOC', 'CL', 'SPG', 'CTAS', 'DXCM', 'AMGN', 'CMCSA', 'EPAM', 'WAB', 'UHS', 'TROW', 'RTX', 'PPL', 'GM', 'HII', 'WRB', 'MAR', 'PWR', 'SCHW', 'KMX', 'COR', 'DLTR', 'CZR', 'MCD', 'FCX', 'ACN', 'DVN', 'BR', 'MDT', 'PARA', 'AEE', 'HBAN', 'MTB', 'ZBRA', 'LDOS', 'AMP', 'COST', 'AMCR', 'UNH', 'APA', 'BK', 'AZO', 'CPB', 'PM', 'A', 'XYL', 'AAPL', 'TT', 'PSA', 'MRK', 'GILD', 'JBL', 'MS', 'MSI']: YFPricesMissingError('$%ticker%: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)')\n", + "['CARR', 'HPE', 'QRVO', 'ETSY', 'FOXA', 'ABNB', 'DOW', 'PYPL', 'UBER', 'WRK', 'DAY', 'KHC', 'INVH', 'LW', 'VST', 'FTV', 'CTVA', 'VICI', 'MRNA', 'IR', 'KVUE', 'HWM', 'FOX', 'GEHC', 'CEG', 'OTIS']: YFChartError(\"%ticker%: Data doesn't exist for startDate = 1420088400, endDate = 1420088400\")\n", + "['F']: Y%ticker%PricesMissingError('$%ticker%: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)')\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "$MS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "$MSI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", + "Empty DataFrame\n", + "Columns: [(Adj Close, A), (Adj Close, AAL), (Adj Close, AAPL), (Adj Close, ABBV), (Adj Close, ABNB), (Adj Close, ABT), (Adj Close, ACGL), (Adj Close, ACN), (Adj Close, ADBE), (Adj Close, ADI), (Adj Close, ADM), (Adj Close, ADP), (Adj Close, ADSK), (Adj Close, AEE), (Adj Close, AEP), (Adj Close, AES), (Adj Close, AFL), (Adj Close, AIG), (Adj Close, AIZ), (Adj Close, AJG), (Adj Close, AKAM), (Adj Close, ALB), (Adj Close, ALGN), (Adj Close, ALL), (Adj Close, ALLE), (Adj Close, AMAT), (Adj Close, AMCR), (Adj Close, AMD), (Adj Close, AME), (Adj Close, AMGN), (Adj Close, AMP), (Adj Close, AMT), (Adj Close, AMZN), (Adj Close, ANET), (Adj Close, ANSS), (Adj Close, AON), (Adj Close, AOS), (Adj Close, APA), (Adj Close, APD), (Adj Close, APH), (Adj Close, APTV), (Adj Close, ARE), (Adj Close, ATO), (Adj Close, AVB), (Adj Close, AVGO), (Adj Close, AVY), (Adj Close, AWK), (Adj Close, AXON), (Adj Close, AXP), (Adj Close, AZO), (Adj Close, BA), (Adj Close, BAC), (Adj Close, BALL), (Adj Close, BAX), (Adj Close, BBWI), (Adj Close, BBY), (Adj Close, BDX), (Adj Close, BEN), (Adj Close, BG), (Adj Close, BIIB), (Adj Close, BIO), (Adj Close, BK), (Adj Close, BKNG), (Adj Close, BKR), (Adj Close, BLDR), (Adj Close, BLK), (Adj Close, BMY), (Adj Close, BR), (Adj Close, BRO), (Adj Close, BSX), (Adj Close, BWA), (Adj Close, BX), (Adj Close, BXP), (Adj Close, C), (Adj Close, CAG), (Adj Close, CAH), (Adj Close, CARR), (Adj Close, CAT), (Adj Close, CB), (Adj Close, CBOE), (Adj Close, CBRE), (Adj Close, CCI), (Adj Close, CCL), (Adj Close, CDNS), (Adj Close, CDW), (Adj Close, CE), (Adj Close, CEG), (Adj Close, CF), (Adj Close, CFG), (Adj Close, CHD), (Adj Close, CHRW), (Adj Close, CHTR), (Adj Close, CI), (Adj Close, CINF), (Adj Close, CL), (Adj Close, CLX), (Adj Close, CMA), (Adj Close, CMCSA), (Adj Close, CME), (Adj Close, CMG), ...]\n", + "Index: []\n", + "\n", + "[0 rows x 2988 columns]\n" + ] + } + ], + "source": [ + "data = yf.download(list_of_symbols__, start=\"2015-01-01\", end=\"2015-01-01\")\n", + "print(data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5c70e521-61d3-40eb-998f-cfdcd7c452f7", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py b/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py new file mode 100644 index 0000000..085fb4f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py @@ -0,0 +1,148 @@ +from ListSnP500.ListSnP500Collect import ListSAndP500 +from pyspark.sql.types import StructType, StructField, StringType +from pyspark.sql import SparkSession +from dotenv import load_dotenv +import yfinance as yf +import pandas as pd +import os + +load_dotenv(override=True) + +column_1_name = os.getenv("COLUMN_1") +column_2_name = os.getenv("COLUMN_2") +column_3_name = os.getenv("COLUMN_3") +column_4_name = os.getenv("COLUMN_4") +column_5_name = os.getenv("COLUMN_5") +column_6_name = os.getenv("COLUMN_6") +column_7_name = os.getenv("COLUMN_7") +column_8_name = os.getenv("COLUMN_8") + + +class YahooFinance: + def __init__(self, list_of_symbols, start, end): + """ + Initialize the YahooFinance class + + Args: + list_of_symbols (list): A list of stock symbols + start (str): The start date for the historical data (datetime string format: 'YYYY-MM-DD') + end (str): The end date for the historical data (datetime string format: 'YYYY-MM-DD') + + Attributes: + symbols (list): A list of stock symbols + interval (str): The interval for the historical data (default is '1d' for daily) + start (str): The start date for the historical data + end (str): The end date for the historical data + results (DataFrame): A DataFrame containing the transformed historical stock data for a call + query (None): A placeholder for the query object + + """ + self.spark = SparkSession.builder \ + .appName("Spark_YahooStreaming") \ + .config("spark.jars.packages") \ + .getOrCreate() + + self.schema = StructType([ + StructField(column_1_name, StringType(), True), + StructField(column_2_name, StringType(), True), + StructField(column_3_name, StringType(), True), + StructField(column_4_name, StringType(), True), + StructField(column_5_name, StringType(), True), + StructField(column_6_name, StringType(), True), + StructField(column_7_name, StringType(), True), + StructField(column_8_name, StringType(), True) + ]) + + self.symbols = list_of_symbols + self.interval = '1d' + self.start = start + self.end = end + self.results = self.process_data() + + def process_data(self): + """ + Process the historical stock data for the stock symbols + """ + data = self.get_data() + return self.transform_data(data) + + def get_data(self): + """ + Get historical stock data from Yahoo Finance API using yfinance library + + Returns: + DataFrame: A DataFrame containing historical stock data + """ + try: + data = yf.download( + self.symbols, + start=self.start, + end=self.end, + interval=self.interval, + ignore_tz=True, + threads=5, + timeout=60, + progress=True + ) + return data + except Exception as e: + print(f"Error downloading data: {e}") + return None + + def transform_data(self, df): + """ + Transform the historical stock data into a format that can be stored in a database FactPrices table + + Args: + df (DataFrame): A DataFrame containing historical stock data + + Returns: + DataFrame: A DataFrame containing transformed historical stock data with the following columns: + - stock_id (str): The stock symbol + - date (str): The date of the stock data + - open (float): The opening price of the stock + - high (float): The highest price of the stock + - low (float): The lowest price of the stock + - close (float): The closing price of the stock + - volume (int): The volume of the stock + - adjusted_close (float): The adjusted closing price of the stock + + """ + # Reset the index to turn the MultiIndex into columns + df = df.reset_index() + + # Create a list to store transformed records + records = [] + + # Iterate over each row and stock symbol + for index, row in df.iterrows(): + date = row[('Date', '')] + for stock in self.symbols: + try: + record = { + column_1_name: stock, + column_2_name: date, + column_3_name: row[('Open', stock)], + column_4_name: row[('High', stock)], + column_5_name: row[('Low', stock)], + column_6_name: row[('Close', stock)], + column_7_name: row[('Volume', stock)], + column_8_name: row[('Adj Close', stock)] + } + records.append(record) + except KeyError as e: + print(f"KeyError: {e} for stock: {stock} on date: {date}") + + # Convert the list of records into a DataFrame + return pd.DataFrame(records) + + +""" +Usage: + +# transformed_data = YahooFinance(['AAPL','MSFT','GOOGL'], '2024-06-01', '2024-06-09').results +# print(transformed_data.head()) +# list_of_symbols = ListSAndP500().tickers_list +# print(list_of_symbols) + +""" diff --git a/BatchProcess/DataSource/YahooFinance/yahoo_finance_data.xlsx b/BatchProcess/DataSource/YahooFinance/yahoo_finance_data.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..98f472473f512cdceb21c37366787d594edc1ec5 GIT binary patch literal 6041 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 Date: Tue, 18 Jun 2024 01:14:59 -0400 Subject: [PATCH 04/12] Upload sample dataset retrieve from yfinance --- .gitattributes | 1 + BatchProcess/DataSource/YahooFinance/dataset/Summary.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/A.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AAL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AAPL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ABBV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ABNB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ABT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ACGL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ACN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ADBE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ADI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ADM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ADP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ADSK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AEE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AEP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AES.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AFL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AIG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AIZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AJG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AKAM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ALB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ALGN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ALL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ALLE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMAT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMCR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AME.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMGN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AMZN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ANET.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ANSS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AON.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AOS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/APA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/APD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/APH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/APTV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ARE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ATO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AVB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AVGO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AVY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AWK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AXON.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AXP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/AZO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BAC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BALL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BAX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BBWI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BBY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BDX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BEN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BIIB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BIO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BKNG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BKR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BLDR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BLK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BMY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BRO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BSX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BWA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/BXP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/C.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CAG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CAH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CARR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CAT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CBOE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CBRE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CCI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CCL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CDNS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CDW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CEG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CFG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CHD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CHRW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CHTR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CINF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CLX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CMA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CMCSA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CME.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CMG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CMI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CMS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CNC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CNP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/COF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/COO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/COP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/COR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/COST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CPAY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CPB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CPRT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CPT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CRL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CRM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CSCO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CSGP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CSX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CTAS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CTLT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CTRA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CTSH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CTVA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CVS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CVX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/CZR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/D.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DAL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DAY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DECK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DFS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DGX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DHI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DHR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DIS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DLR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DLTR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DOC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DOV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DOW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DPZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DRI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DTE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DUK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DVA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DVN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/DXCM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EBAY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ECL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ED.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EFX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EIX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ELV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EMN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EMR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ENPH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EOG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EPAM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EQIX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EQR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EQT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ES.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ESS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ETN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ETR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ETSY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EVRG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EXC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/EXR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/F.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FANG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FAST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FCX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FDS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FDX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FFIV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FICO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FIS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FITB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FMC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FOX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FOXA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FRT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FSLR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FTNT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/FTV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GEHC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GEN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GILD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GIS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GLW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GNRC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOGL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GPC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GPN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GRMN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/GWW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HAL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HAS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HBAN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HCA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HES.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HIG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HII.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HLT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HOLX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HON.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HPE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HPQ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HRL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HSIC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HSY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HUBB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HUM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/HWM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IBM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ICE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IDXX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IEX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IFF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ILMN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/INCY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/INTC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/INTU.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/INVH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IPG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IQV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IRM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ISRG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ITW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/IVZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/J.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JBHT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JBL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JCI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JKHY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JNJ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JNPR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/JPM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/K.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KDP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KEY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KEYS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KHC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KIM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KLAC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KMB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KMI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KMX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/KVUE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/L.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LDOS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LEN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LHX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LIN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LKQ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LLY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LMT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LNT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LOW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LRCX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LULU.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LUV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LVS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LYB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/LYV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MAA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MAR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MAS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MCD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MCHP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MCK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MCO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MDLZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MDT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MET.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/META.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MGM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MHK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MKC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MKTX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MLM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MMC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MMM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MNST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MOH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MOS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MPC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MPWR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MRK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MRNA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MRO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MSCI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MSFT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MSI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MTB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MTCH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MTD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/MU.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NCLH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NDAQ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NDSN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NEE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NEM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NFLX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NKE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NOC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NOW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NRG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NSC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NTAP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NTRS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NUE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NVDA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NVR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NWS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NWSA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/NXPI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/O.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ODFL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/OKE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/OMC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ON.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ORCL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ORLY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/OTIS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/OXY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PANW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PARA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PCAR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PCG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PEG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PEP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PFE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PFG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PGR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PHM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PKG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PLD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PNC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PNR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PNW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PODD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/POOL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PPG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PPL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PRU.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PSA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PSX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PTC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PWR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/PYPL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/QCOM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/QRVO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RCL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/REG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/REGN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RHI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RJF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RMD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ROK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ROL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ROP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ROST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RSG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RTX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/RVTY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SBAC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SBUX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SCHW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SHW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SJM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SLB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SMCI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SNA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SNPS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SPG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SPGI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SRE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/STE.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/STLD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/STT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/STX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/STZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SWK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SWKS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SYF.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SYK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/SYY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/T.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TAP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TDG.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TDY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TECH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TEL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TER.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TFC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TFX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TGT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TJX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TMO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TMUS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TPR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TRGP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TRMB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TROW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TRV.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TSCO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TSLA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TSN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TTWO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TXN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TXT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/TYL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UAL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UBER.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UDR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UHS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ULTA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UNH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UNP.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/UPS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/URI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/USB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/V.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VICI.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VLO.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VMC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VRTX.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VTR.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VTRS.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/VZ.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WAB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WAT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WBA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WBD.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WDC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WEC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WELL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WFC.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WMB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WMT.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WRB.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WRK.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WST.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WTW.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WY.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/WYNN.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/XEL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/XOM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/XYL.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/YUM.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBH.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBRA.csv | 3 +++ BatchProcess/DataSource/YahooFinance/dataset/tickets/ZTS.csv | 3 +++ 500 files changed, 1498 insertions(+) create mode 100644 .gitattributes create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/Summary.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/A.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AAL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AAPL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ABBV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ABNB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ABT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ACGL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ACN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ADBE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ADI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ADM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ADP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ADSK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AEE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AEP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AES.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AFL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AIG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AIZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AJG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AKAM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ALB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ALGN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ALL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ALLE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMAT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMCR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AME.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMGN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AMZN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ANET.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ANSS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AON.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AOS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/APA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/APD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/APH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/APTV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ARE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ATO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AVB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AVGO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AVY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AWK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AXON.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AXP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/AZO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BAC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BALL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BAX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BBWI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BBY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BDX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BEN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BIIB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BIO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BKNG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BKR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BLDR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BLK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BMY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BRO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BSX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BWA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/BXP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/C.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CAG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CAH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CARR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CAT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CBOE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CBRE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CCI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CCL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CDNS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CDW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CEG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CFG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CHD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CHRW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CHTR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CINF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CLX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CMA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CMCSA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CME.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CMG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CMI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CMS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CNC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CNP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/COF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/COO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/COP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/COR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/COST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CPAY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CPB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CPRT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CPT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CRL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CRM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CSCO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CSGP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CSX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CTAS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CTLT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CTRA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CTSH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CTVA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CVS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CVX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/CZR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/D.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DAL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DAY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DECK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DFS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DGX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DHI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DHR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DIS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DLR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DLTR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DOC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DOV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DOW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DPZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DRI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DTE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DUK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DVA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DVN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/DXCM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EBAY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ECL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ED.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EFX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EIX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ELV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EMN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EMR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ENPH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EOG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EPAM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EQIX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EQR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EQT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ES.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ESS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ETN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ETR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ETSY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EVRG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EXC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/EXR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/F.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FANG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FAST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FCX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FDS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FDX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FFIV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FICO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FIS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FITB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FMC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FOX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FOXA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FRT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FSLR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FTNT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/FTV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GEHC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GEN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GILD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GIS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GLW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GNRC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOGL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GPC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GPN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GRMN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/GWW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HAL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HAS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HBAN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HCA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HES.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HIG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HII.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HLT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HOLX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HON.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HPE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HPQ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HRL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HSIC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HSY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HUBB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HUM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/HWM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IBM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ICE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IDXX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IEX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IFF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ILMN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/INCY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/INTC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/INTU.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/INVH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IPG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IQV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IRM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ISRG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ITW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/IVZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/J.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JBHT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JBL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JCI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JKHY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JNJ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JNPR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/JPM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/K.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KDP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KEY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KEYS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KHC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KIM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KLAC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KMB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KMI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KMX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/KVUE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/L.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LDOS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LEN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LHX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LIN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LKQ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LLY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LMT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LNT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LOW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LRCX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LULU.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LUV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LVS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LYB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/LYV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MAA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MAR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MAS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MCD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MCHP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MCK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MCO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MDLZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MDT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MET.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/META.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MGM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MHK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MKC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MKTX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MLM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MMC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MMM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MNST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MOH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MOS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MPC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MPWR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MRK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MRNA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MRO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MSCI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MSFT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MSI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MTB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MTCH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MTD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/MU.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NCLH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NDAQ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NDSN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NEE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NEM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NFLX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NKE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NOC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NOW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NRG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NSC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NTAP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NTRS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NUE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NVDA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NVR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NWS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NWSA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/NXPI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/O.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ODFL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/OKE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/OMC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ON.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ORCL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ORLY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/OTIS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/OXY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PANW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PARA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PCAR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PCG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PEG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PEP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PFE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PFG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PGR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PHM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PKG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PLD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PNC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PNR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PNW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PODD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/POOL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PPG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PPL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PRU.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PSA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PSX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PTC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PWR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/PYPL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/QCOM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/QRVO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RCL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/REG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/REGN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RHI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RJF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RMD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ROK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ROL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ROP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ROST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RSG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RTX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/RVTY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SBAC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SBUX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SCHW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SHW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SJM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SLB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SMCI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SNA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SNPS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SPG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SPGI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SRE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/STE.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/STLD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/STT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/STX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/STZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SWK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SWKS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SYF.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SYK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/SYY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/T.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TAP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TDG.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TDY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TECH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TEL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TER.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TFC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TFX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TGT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TJX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TMO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TMUS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TPR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TRGP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TRMB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TROW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TRV.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TSCO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TSLA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TSN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TTWO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TXN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TXT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/TYL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UAL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UBER.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UDR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UHS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ULTA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UNH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UNP.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/UPS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/URI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/USB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/V.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VICI.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VLO.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VMC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VRTX.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VTR.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VTRS.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/VZ.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WAB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WAT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WBA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WBD.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WDC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WEC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WELL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WFC.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WMB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WMT.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WRB.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WRK.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WST.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WTW.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WY.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/WYNN.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/XEL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/XOM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/XYL.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/YUM.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBH.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBRA.csv create mode 100644 BatchProcess/DataSource/YahooFinance/dataset/tickets/ZTS.csv diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..87e654b --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.csv filter=lfs diff=lfs merge=lfs -text diff --git a/BatchProcess/DataSource/YahooFinance/dataset/Summary.csv b/BatchProcess/DataSource/YahooFinance/dataset/Summary.csv new file mode 100644 index 0000000..0447365 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/Summary.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b9fb7696d381398616e7f09d5680e203c35484977b57c4945c81512328dafe0f +size 133793004 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/A.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/A.csv new file mode 100644 index 0000000..d951e63 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/A.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:437d6da363d96eb02641cec830895561122df25dfbb880cd66c2133496dd855d +size 284862 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAL.csv new file mode 100644 index 0000000..d4e992d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e49198e049178244f5253981b0b86434c62a2f093660b888658c69b315c7199 +size 292873 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAPL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAPL.csv new file mode 100644 index 0000000..3d9c4d2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AAPL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a571be416367ce53a2dd344797a9d8b884beda213d7353cb442c959fc97434ed +size 296595 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABBV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABBV.csv new file mode 100644 index 0000000..fc6698c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABBV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c0ded422e5c82747a8279d7d246e1204308594f7c99fa80008d4193caf33ec2 +size 290722 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABNB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABNB.csv new file mode 100644 index 0000000..d023847 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABNB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85a5fcc76de0880d5fa732805feea380d1d1cf23d068702aa85e3d8f2bd169e4 +size 151897 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABT.csv new file mode 100644 index 0000000..ab4e1e8 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ABT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20b33a081f5f65a35539f4b70c8946c6b34a7864dfc581dafa9744a56fabf2f6 +size 289103 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACGL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACGL.csv new file mode 100644 index 0000000..6ec367b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACGL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71fb66abe5e5f2a52f2539ba5055866f5ab4bcad9b9f9cb036e0735358352f04 +size 292942 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACN.csv new file mode 100644 index 0000000..ddf1bc3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ACN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdf23662efb7e1a30e9ad4f6f60453c8d3186c764fbefde7d01b7348949c5d2e +size 288397 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADBE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADBE.csv new file mode 100644 index 0000000..dfe6e99 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADBE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af43fe3a8ddcd2e9102159af3f5088cfdac087941db0a1cbad289f0e09b8717a +size 285794 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADI.csv new file mode 100644 index 0000000..9bbaffe --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d532d8983a0661592f5523531de786c07f781ba0e29429c0c59156c8fcd016b2 +size 290503 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADM.csv new file mode 100644 index 0000000..1197d91 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c7075195393c1499ff2b99b22d8efb91f261ab0f2483907b21b7cd319d10b0a +size 288435 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADP.csv new file mode 100644 index 0000000..24f75cb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bc7b0063e4fd840f33b18f672fb49590ace6120fea95d798244b5731ade76f6 +size 291368 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADSK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADSK.csv new file mode 100644 index 0000000..4252a2a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ADSK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfb9589cf1dd21c177119be930bb69dc6824ea80d9f78d6296dec144965be812 +size 290799 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEE.csv new file mode 100644 index 0000000..afbde1f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee55e528e3dc6331bca60a68c28c88ee4925f8262c11074ce887ca2fba3dfef +size 287136 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEP.csv new file mode 100644 index 0000000..33dc9c7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AEP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c350fd75ba4dc0948b0c9963dcf9dc26a55ceea6c3f956a575bec0d4f9e75cc7 +size 286262 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AES.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AES.csv new file mode 100644 index 0000000..7363a45 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AES.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:44a6dc4da55084dcac07bfb0f0526c134143efd102e5b7c6ba4ce1a217158d36 +size 294362 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AFL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AFL.csv new file mode 100644 index 0000000..02af30a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AFL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bfe9a2e4d4bb2caa2652c2c707f23c79231945df8d565d91d7f580cfe03713c +size 289744 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIG.csv new file mode 100644 index 0000000..75e3a67 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9251af7b7c4f6ffaf75395aa9c4d933be3b05d6cd7f131a86fa74ccccdc25fd6 +size 289620 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIZ.csv new file mode 100644 index 0000000..32f62c5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AIZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:815c649bd9b776abe974f400ddaca15597d0fa3e6d2bb655f60a6a76435469bb +size 288193 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AJG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AJG.csv new file mode 100644 index 0000000..9809b83 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AJG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa0a3badbb5bd98cc0e6954cd53f999500718df1f55500e35a7aabe1d3acb63e +size 288143 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AKAM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AKAM.csv new file mode 100644 index 0000000..a459645 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AKAM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb9092a252d0bf76f42721e4b46d17cb4bc08d41547500e860ac176d159af84e +size 287919 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALB.csv new file mode 100644 index 0000000..4207c1b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:993a758995c31f85435e2b230ec2d6702c415b4852bd0a51c9a438a1a5835e65 +size 285058 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALGN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALGN.csv new file mode 100644 index 0000000..ca8c266 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALGN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:568d3dcc01c068062bb583f251d3c80eeb32828d446892086a4342f24f55ee45 +size 284961 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALL.csv new file mode 100644 index 0000000..55f7511 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7502db9f96ff5594098b7b2d8b9b61d7f6902055bc3c3b1449f2a0585bf4d20 +size 289674 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALLE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALLE.csv new file mode 100644 index 0000000..24ccecf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ALLE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6104128baebf58354431ab45bd0d7243aa1f6d27856fe33a8007e0d3e7e4b36a +size 290593 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMAT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMAT.csv new file mode 100644 index 0000000..8e52186 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMAT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a911a4fa2e89a292b090685b0932672f94e6a06532cb3cf5b1d2862ace8816f +size 294586 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMCR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMCR.csv new file mode 100644 index 0000000..46a6502 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMCR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa0a83c9ea624f5f39734a59d4105bf9b32ed034a74686dff048046370778f2 +size 285092 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMD.csv new file mode 100644 index 0000000..53c9162 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3317744e2a045d5490fd9af8917aaa29c8fb5183811bca4ede3ffcb6df7a182b +size 292725 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AME.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AME.csv new file mode 100644 index 0000000..fe79362 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AME.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:491bce8993205e863184bc7a6b49ffc4c9c1bb7cfc3f7f1a9db86f4985d6dc88 +size 289234 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMGN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMGN.csv new file mode 100644 index 0000000..48dfb14 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMGN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b19b767a6d4ea703eb8381f371627e90c0f4a8afad3a0586eefa96cf5c280aff +size 293397 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMP.csv new file mode 100644 index 0000000..718c13b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a16934edd86b26bf54768da518c4c4cfbae95a96dadf5a90d315550a76d2e6f0 +size 290372 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMT.csv new file mode 100644 index 0000000..0ba4157 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69ec00e55505368a10e5d8127d88b8c891f7e64ad4626b379447d2bd455cd996 +size 290361 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMZN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMZN.csv new file mode 100644 index 0000000..c6aad31 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AMZN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b3ffdb973a189f4aa410ae668e92e1067d92f0621a43fbd96ceafcbe5e48d6c +size 294825 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANET.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANET.csv new file mode 100644 index 0000000..c0de88f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANET.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ba3752720f12ff17eb52e175d9451acf6481cadbdb7e17ade7f27516da33d4b +size 286714 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANSS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANSS.csv new file mode 100644 index 0000000..043922a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ANSS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ac985a00de8f8d02b9cee7be9a4a7d43398814bd5df723089c548989cb1af61 +size 287977 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AON.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AON.csv new file mode 100644 index 0000000..6ddf43c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AON.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee33c946f2de3f03c7d7cce9c8b2319817b94149a0ca2977cf8454f476694d93 +size 289202 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AOS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AOS.csv new file mode 100644 index 0000000..670ceef --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AOS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8079fc3925057f56d73d2c75df8388d7d40ae2812c240dae173ed0de9261ba05 +size 287633 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/APA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APA.csv new file mode 100644 index 0000000..64a7859 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcc853cbd5e7e394354c71d2b4af27033a3fd69484282db7da762e9212b3cbdc +size 291071 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/APD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APD.csv new file mode 100644 index 0000000..4a74319 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55f5cf84fa84621cd0017d3a9a3a55aa1d78b070aa464197795bb6e55ae7a363 +size 291531 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/APH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APH.csv new file mode 100644 index 0000000..92d7da3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2441b7b75127f5c117f30f26e88f1a43585ec03acaadc71d0939accd3faf2a8c +size 292813 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/APTV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APTV.csv new file mode 100644 index 0000000..b1f251e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/APTV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9837c7c94433726b2ea3af82b431b92fb373d522f3202ccc7a517af3000647e1 +size 289982 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ARE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ARE.csv new file mode 100644 index 0000000..d430281 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ARE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:260b8afe4ecb1c7e0f14171d7f8e399132589394940d395fcabb0e1c3dfacb46 +size 290545 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ATO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ATO.csv new file mode 100644 index 0000000..4283fcd --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ATO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fdb8d52c68abae6a8a52aaa5013d1075f65f63c7ca5f715ce5eb9e9c50ff4a3 +size 288249 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVB.csv new file mode 100644 index 0000000..367f5b1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f531e1de7d7f678460daa8c490453e9f21155f68ed1aac71c46ade6469da289 +size 291730 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVGO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVGO.csv new file mode 100644 index 0000000..66acf12 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVGO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a8b4193311dd901875cda534b0035c20b4db484c100c0d0dd458b259ba45fc3 +size 286216 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVY.csv new file mode 100644 index 0000000..532a589 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AVY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:014e618e5e0ce5b5846be83ca190cd2b108cfefb2121904eddd95fadcfd17861 +size 289600 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AWK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AWK.csv new file mode 100644 index 0000000..6d1b09b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AWK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d847f24f039f57b1f275384bd4ee5c0a75f30481ce9a24d0862160e23c4ad0e +size 288452 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXON.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXON.csv new file mode 100644 index 0000000..8b60234 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXON.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:480d5192325fc8dded891b4a037bb4c63e61eabbc410eeddb2e003d6c0ac7521 +size 287791 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXP.csv new file mode 100644 index 0000000..9685374 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AXP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e32e64530be613fe2c8dae0beee086574eb15b2b6ef10926662d5a36c853e18 +size 289172 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/AZO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AZO.csv new file mode 100644 index 0000000..26af2e4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/AZO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9aa7bc8a1fe96aef14f75bf2639078b1780ec9a31e48fb483586dc54408f5980 +size 275017 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BA.csv new file mode 100644 index 0000000..7ba520a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:812b3b95a4a2ae36517ac86fe0219a463d5e41f74564c5c3099fc35d59ac5be7 +size 284634 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAC.csv new file mode 100644 index 0000000..3629bcf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:542aa12228809ae9b5a36d598d39e38b203d58caa5e0304340dfec3c259617bc +size 295984 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BALL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BALL.csv new file mode 100644 index 0000000..dc20ade --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BALL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea835c15afcfea4fc5db72c3accab1611a033492ddaebde0d47a37bcaabe366b +size 289960 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAX.csv new file mode 100644 index 0000000..62dd328 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BAX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85148fb6b81054178c6c6d7c0bec3505c3d7b14a20e8b3d3ae646d09e1654817 +size 287111 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBWI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBWI.csv new file mode 100644 index 0000000..b6ff44c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBWI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a05f6d69feae39e04561bfb9e8ed87ec2beab2c70cd0aac720119153825aa521 +size 297079 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBY.csv new file mode 100644 index 0000000..63077ee --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BBY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6fb597a85cddb2c330242f0436115c55d9856d71e93fa6ca17af7a673fb1a999 +size 287250 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BDX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BDX.csv new file mode 100644 index 0000000..f133046 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BDX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d55cd84471136456752d959031abf44b8874fa3851474d6f1d69b7ecde5696dd +size 295896 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BEN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BEN.csv new file mode 100644 index 0000000..6f31d0c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BEN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:038d69e4a5a9a4e809512b880230cefd942044d139360b1bb1691888618efcdb +size 293386 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BG.csv new file mode 100644 index 0000000..e66970c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94965026be483391caf0f12d0ca392ca18f7b480c28fa4055607fcadfa61cb9c +size 283050 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIIB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIIB.csv new file mode 100644 index 0000000..f462709 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIIB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e2030c0055f4c6e10ae8b3cd3d0da9663e98ed36658279b3252fe81b4358aa0 +size 284866 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIO.csv new file mode 100644 index 0000000..78af4b5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BIO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fdf0c578b08131ea9afe10c9c39384d86524f61b978b42c70555bc4dfd487fc +size 283918 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BK.csv new file mode 100644 index 0000000..c32b67d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ab7f13ec1966273eb210c3c45e141d47e91440ec4ce568ce55369b980132a95 +size 288213 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKNG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKNG.csv new file mode 100644 index 0000000..2f4b727 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKNG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de2935606a69edfb100772c2849d37cb6b7b27fea072892a3ce26f16ebd50f69 +size 275644 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKR.csv new file mode 100644 index 0000000..ea9dbff --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BKR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f4757cd60f38e2b4c151b100fb1fac42737b4e9c89a33d39ba6d35ffb0a1ed3 +size 292638 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLDR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLDR.csv new file mode 100644 index 0000000..06a6a2d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLDR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:75680e6db23ca4173cbacb90420bd8423fba5cc421add4b7461575d5d34b7a0e +size 291637 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLK.csv new file mode 100644 index 0000000..b420163 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BLK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aed5b0d34a6568d43f5352c0a8fc1d15ac5b6572bcda1557b551439965d2b1f8 +size 279386 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BMY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BMY.csv new file mode 100644 index 0000000..3365785 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BMY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b0e319a545e4961700b4f65316ef622d70ee3fed0a939c08ac42393de269f67e +size 288824 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BR.csv new file mode 100644 index 0000000..6e6e1ee --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82706c824e8bb0a1f7705fe56d684c2d4039a61b4ca9f83e97d19539da00749c +size 287429 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BRO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BRO.csv new file mode 100644 index 0000000..ce53aca --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BRO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dbd17b96c850ddf4258e52432cf963e15199d7758528651b452881f004dfb912 +size 290070 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BSX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BSX.csv new file mode 100644 index 0000000..6a104d4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BSX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:136e4e4dc545015f831c34a291eb291ae803c29bb0842adb7505695031924e98 +size 291106 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BWA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BWA.csv new file mode 100644 index 0000000..879ee06 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BWA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8401018dd7fde5346a2ceb0cc05a7742f63dad2c6802aefe55e8bac0ee0b67f3 +size 294353 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BX.csv new file mode 100644 index 0000000..878f974 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:decee1b2cbad0dc6fb978c57aa9749105978de9e1a4e68290c3fd5724dc6d54c +size 286054 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/BXP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BXP.csv new file mode 100644 index 0000000..53ec403 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/BXP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:241bf3c8589b4cdf48010f3ddbc5091f60c57dcc9fa305f68883d0ebbd6c51c0 +size 290024 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/C.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/C.csv new file mode 100644 index 0000000..3193a76 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/C.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46ff4e1fce65fc54656b2bea2a8f69c383a82daad248ce7b0983ae56e8542646 +size 285804 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAG.csv new file mode 100644 index 0000000..1d74109 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b124a84812197c0df06dcc8e33d4db70883dbf842307203f6599831e1dffd1d7 +size 293690 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAH.csv new file mode 100644 index 0000000..4899c05 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2a45342cab65ccf5cf553ed4c5e76b8e1ad7b01ec312c47b1253a6893ea8a36 +size 287391 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CARR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CARR.csv new file mode 100644 index 0000000..9a4e179 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CARR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4684798bf144188c8d4b3ab7632243d4f630e6a3daea96ff48a99498ccbb7383 +size 170147 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAT.csv new file mode 100644 index 0000000..12b2ec6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CAT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d611fa792fe7ba9f4c7ad0609d1ae00feb902ccd5735a738a78e82e408c5a99e +size 288207 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CB.csv new file mode 100644 index 0000000..67249a1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1145037967069ef12d2f24a7032b7d107a0df73e05b28d3f4221881de45cbe1 +size 290252 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBOE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBOE.csv new file mode 100644 index 0000000..2d6d6cc --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBOE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a989aea726cd09f5af8e84e2207dcddd336e040f5f1693828ba627100ecfc17 +size 292580 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBRE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBRE.csv new file mode 100644 index 0000000..24d68d9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CBRE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b1e84f4aaa512156bd59155e3daf90ca98c473e18089db986a4f924579a6744 +size 289610 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCI.csv new file mode 100644 index 0000000..7bf3e70 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e767de05b2b2e86623e0e8fedbb72d1d2999d39c95d939857bfb3454bb380964 +size 289089 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCL.csv new file mode 100644 index 0000000..2e6946a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CCL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5babc9c7aae213d3f279f85baca39672568536e58b1b6a45d58ce338951b4a19 +size 291958 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDNS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDNS.csv new file mode 100644 index 0000000..b2d4e21 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDNS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7376dbdbbd3c2633ade5c8f1492b6b4ddaae1221aacd70a8ec4ff6f428ca0c58 +size 291473 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDW.csv new file mode 100644 index 0000000..2ced3f5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CDW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9062d83771bd08f90fa3d8bb3c7780ef9aa234cc324c57754d67c199f469e70 +size 288819 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CE.csv new file mode 100644 index 0000000..9face48 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f7637b76a6f2903c57f3342b133d0bfa3573b4c62dc7b44cbf5f0a812abf05d +size 286777 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CEG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CEG.csv new file mode 100644 index 0000000..6630a65 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CEG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2e231d25d75b8cc2c12d0de9ce655f0afd03c96b9b91e08ab9a2fa4ed19247f3 +size 124429 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CF.csv new file mode 100644 index 0000000..2870fb6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6c2757440f19495141e2627726739374334b4408fcc99d5a69a998ffaccc2c8 +size 286634 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CFG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CFG.csv new file mode 100644 index 0000000..064a52e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CFG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fb775e13863b732628b9159e4b34bff5729fba9fd7ae00456d2bab09236862e +size 291915 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHD.csv new file mode 100644 index 0000000..54a97af --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efb178c4e40f49ccf1dd7996ad679c3cc5c3ba1cab9b7796de7361961207340c +size 286528 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHRW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHRW.csv new file mode 100644 index 0000000..50d98cb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHRW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9937489c480a5ed9bc90ab2838c360b8c79ab93247f1fd75da9894802c1ada7e +size 287259 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHTR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHTR.csv new file mode 100644 index 0000000..44e9109 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CHTR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b783f086736ebec4612922239dd7bb6e80feee8f9e2e84e04cc6529561c9f299 +size 285634 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CI.csv new file mode 100644 index 0000000..c4b29ee --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b6f0068ec82e552e188c9a4e0ac9383e96330e40ee7edfd823940c4ae18de1fa +size 286656 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CINF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CINF.csv new file mode 100644 index 0000000..7892e7b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CINF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9135c0541f9c0cb18be0882398e9463b455ef4c37dbd25c0d1fe4673ff90cff2 +size 290130 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CL.csv new file mode 100644 index 0000000..81a69d0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e365a1a2c439a8c451156c03e2d357139b21993d5dcb217bef557e9b31f13f1 +size 282114 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CLX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CLX.csv new file mode 100644 index 0000000..4135d8c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CLX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:900d3c4d952fc2366b0e3f63566709448a8bb142e29eeea7d4be746e8012e175 +size 290893 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMA.csv new file mode 100644 index 0000000..a825537 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65afddec2b08493c0f76b2bb1a5adec46255f6ce1457617ee0549a63a94d005a +size 286744 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMCSA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMCSA.csv new file mode 100644 index 0000000..c167618 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMCSA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6261994a9bbebd7d3589fd0ffd80714bff78670adf3d6c25c9abf628b654f56b +size 298198 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CME.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CME.csv new file mode 100644 index 0000000..97cdfb6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CME.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:029efa8ce8dd052a4329a49c1f711a80b6b922d951eea19893212a3b2e1c0311 +size 291036 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMG.csv new file mode 100644 index 0000000..482a219 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4855885ed488197f83b1e6ff4694fa23b5fb044469a705ae71443105e0fe083f +size 270990 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMI.csv new file mode 100644 index 0000000..9267c82 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7560ce94a3a24479aee72970e606550f73b5015fff1e380e61690311764f87c3 +size 290880 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMS.csv new file mode 100644 index 0000000..ba93000 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CMS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e576ce03f4a24dd952ef14a0dd3abca341edc6509b182450ab38ce317dac1fc +size 289945 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNC.csv new file mode 100644 index 0000000..c0c8386 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c08934f82b86256d9a2a3d47387f1109f406ac2884495f2e09807d428fd04cd3 +size 286101 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNP.csv new file mode 100644 index 0000000..c0e7c82 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CNP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e520a50b30676b57ab4102d8d456cf41ccbd7910c811eb9c0ebbeec3456c409f +size 295010 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/COF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COF.csv new file mode 100644 index 0000000..1a525d5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ffbb2e95a9cf74a9a0718c21f21562a2806f05ddbb0898d19d0a220a342ca4f7 +size 287248 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/COO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COO.csv new file mode 100644 index 0000000..54abb1d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb355c215853a553bd8adb03bb5a7d5055f60b0074b808d6a3789ef1af3873ab +size 286021 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/COP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COP.csv new file mode 100644 index 0000000..8b3d790 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9223176affd985354d55c32bc46328a9b2a4d846a40fbe4e57875dc36aed81b +size 290131 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/COR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COR.csv new file mode 100644 index 0000000..98c303a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bdc6e7fbd302e4420d3afd191fc9495049c8dcf466de520760b0554e16118fcd +size 287535 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/COST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COST.csv new file mode 100644 index 0000000..6f7f5b9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/COST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b74509bf418688932cf6413a576c899ec41f72681e5f32b1e9160e15a63ad2ff +size 288301 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPAY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPAY.csv new file mode 100644 index 0000000..5110bf0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPAY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d2f0c20a51bbb6d8ad13c1d42c3dd1b283bf10ce4b4ed3f0394e6afb251a9ae +size 290106 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPB.csv new file mode 100644 index 0000000..7387ae5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a71be0e26238307926a52fdb533f97cf413bd27462f9a67b3601d5727ea9a50 +size 289993 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPRT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPRT.csv new file mode 100644 index 0000000..a3412e8 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPRT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b98744e8c5e36d17480b3feca4b23c8ac6d78650f13902269f9b270b4f2716b2 +size 292758 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPT.csv new file mode 100644 index 0000000..68e943c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CPT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:288828a8b65d139cda7770567a41ad336a91142a1a6d534f811a518501f5e227 +size 286854 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRL.csv new file mode 100644 index 0000000..24d9485 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92ac8dc2a3f95c54faf3e41e6d79208004b21158907b70f591f6c3c09b52cd26 +size 286336 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRM.csv new file mode 100644 index 0000000..3c261e1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CRM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:613ebf54a6fac48c0d7f112509bd502ba3ee39554773e389b52a837d659ce8f4 +size 286679 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSCO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSCO.csv new file mode 100644 index 0000000..6747e7a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSCO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5eea95c2df3a402730dbca3f3672bca2435f0cc449ddd3d3e6880f43bf7984ba +size 296302 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSGP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSGP.csv new file mode 100644 index 0000000..65ffeec --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSGP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3dd68e9cde9f96b8872e0d8fcc61eb6f85b2389b596d414f7e375e3903d030a +size 292514 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSX.csv new file mode 100644 index 0000000..d74fc16 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CSX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b30ed91e78a6d538753499da0bf15a366d481ebb673af30ad00b5837f200db5d +size 297312 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTAS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTAS.csv new file mode 100644 index 0000000..69f3b9b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTAS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7709df69e103542dd253955281a495c9c479bcc0a74cc810972a2467a5cc06f1 +size 288117 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTLT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTLT.csv new file mode 100644 index 0000000..890f76b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTLT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:26decd8f67ae340ad047b3db0b9434d202f93bb9d5ddaf72e51f7c8c88dfe41b +size 290609 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTRA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTRA.csv new file mode 100644 index 0000000..cb1e747 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTRA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6749176d3988ff89db8d041cc3331fd780dd5be5ea522cce37a763c0776470a8 +size 296896 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTSH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTSH.csv new file mode 100644 index 0000000..a97f2d4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTSH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c04cee87223b42f0da79ba3ee3ac687e0d5027b9552a28b15fbef61c9c9a4b9 +size 288452 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTVA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTVA.csv new file mode 100644 index 0000000..86eb80b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CTVA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abf60a11a62672a2a0d3dbdf7e6f591edcaa16c5b745dbfb2cdaf5e21e1ad2eb +size 190248 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVS.csv new file mode 100644 index 0000000..7407b06 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc5ecd7bfe3cc431232125ce49fda1dfa02726b6a398ffea2c4f1988ec544205 +size 285785 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVX.csv new file mode 100644 index 0000000..e636cd7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CVX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd024a32a9ace5e2611b1c23c5cc10a55cb2c74b2fa9e4891e118cd251b57a04 +size 292374 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/CZR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CZR.csv new file mode 100644 index 0000000..c7ac059 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/CZR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5ace0a9a27bd41e4bcd3924f167a657be0273c3da34eb180233028f078eb96f2 +size 281285 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/D.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/D.csv new file mode 100644 index 0000000..f880df4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/D.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f5af76950952bbb430f5115e4f406fdc18a237ba84a389633844706b244e6cc +size 280602 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAL.csv new file mode 100644 index 0000000..e1fbb1e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f0fc8d153b1061d9488c11ffda6199abd85f098d77840a26371b26039984fbb8 +size 289794 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAY.csv new file mode 100644 index 0000000..1ac471a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DAY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef42e2518bd948de67db36242ba2dc25b6e4e1aaa495c36461656a19b334598e +size 208559 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DD.csv new file mode 100644 index 0000000..61436c0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be5f9d04e81db481f777d378229c4074e82d3ee5beb453d74d265290b5e65257 +size 285911 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DE.csv new file mode 100644 index 0000000..93a0283 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d8878d4b105b4f250ff40fb24439cded1d2e12f49d0e22d6a488b89f8d29e93 +size 283902 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DECK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DECK.csv new file mode 100644 index 0000000..5cb1f5a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DECK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81c452175f0f657c5a45ebce0a5170a0c8a1f4a15c4f33b42086d1e4361a2880 +size 286618 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DFS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DFS.csv new file mode 100644 index 0000000..c7b8c2c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DFS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f541510baab3d63ea250333e74c6ee45e84fe750e9a67d254d404ecb370f5b4 +size 288264 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DG.csv new file mode 100644 index 0000000..f592e86 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c2e6054d05a2742850e52150848ead2e015e1b05dd1ed53ec03224b9c24c65 +size 286341 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DGX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DGX.csv new file mode 100644 index 0000000..fbd30d9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DGX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36e9db1f817fa54c02da9bc32455d7da05dd3503eba7206e10fabc33c8ed10a2 +size 289255 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHI.csv new file mode 100644 index 0000000..3ef61ca --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:588ec7834c1fdfe23b9d541f3637e0a5c6f96f3cd6fb4201cd3017685c7b3181 +size 290088 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHR.csv new file mode 100644 index 0000000..d859481 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DHR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ea5b0ab0a64d5bb665877fbc2e00b32064d34738b51aadc1026430329e189b8 +size 294430 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DIS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DIS.csv new file mode 100644 index 0000000..699a307 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DIS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7e2d8c8117377b47fc923a1e16dae3b8f7fa9dd979abaa5f312e900fe754af8 +size 291493 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLR.csv new file mode 100644 index 0000000..5a11d98 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:997d7a3ea1868c536e16b61fa38aba8b808de320493ae52ecc3b117425479f4e +size 289435 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLTR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLTR.csv new file mode 100644 index 0000000..66d82ec --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DLTR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:850e482e2e3279ad4789800ab84c4ddf27cb13daa38e02d36f669727a01c7545 +size 289343 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOC.csv new file mode 100644 index 0000000..f0ac683 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48172a27960da04290d61a6d11718f63413e3fad8c1be033b49b2cff8368e72c +size 294582 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOV.csv new file mode 100644 index 0000000..ff11b92 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:883cca39f5a1e0371df3e8104c8e4820cb773d0a924fd343f5176526884f2226 +size 291090 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOW.csv new file mode 100644 index 0000000..d184a65 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DOW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b577b406144bfa401243b02aaf72212b4fbf0a408bf70f814d2d0e916b67623 +size 190723 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DPZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DPZ.csv new file mode 100644 index 0000000..32d68c9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DPZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa9901c38b79a14bd6b8450b41cd0f143ad89d8ce282814320796116d5577c89 +size 285028 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DRI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DRI.csv new file mode 100644 index 0000000..b1dc667 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DRI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:23ff993d621608b87d5de8bf65702e3d367032eaa8cecb7f209bdc5246c5b54b +size 290089 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DTE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DTE.csv new file mode 100644 index 0000000..d54165a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DTE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae43657fe8305c6a01fd42b055244a0fabd28ed6c9b3852a1fbe4dfdbcc10fd6 +size 292433 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DUK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DUK.csv new file mode 100644 index 0000000..ff13ca4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DUK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5fbb46eb3863c56f47f6aa676beb3fd2ed053a6c15fe6950b74d3fbae1184887 +size 285004 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVA.csv new file mode 100644 index 0000000..4bded22 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:449d789c3f76ff23dabc1f731512ddcb45f6b3f0abd1ecd0d6518a4a4b9b2926 +size 284786 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVN.csv new file mode 100644 index 0000000..92fe208 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DVN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f33a424e64b21f57242593605aa5994c0bdb0f51f3121acd29ed0bfaf723bcf2 +size 291637 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/DXCM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DXCM.csv new file mode 100644 index 0000000..0ff8d45 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/DXCM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee4fef8d661a03c9245775f3bec7334ef09edb3673f32b180043a5ab7a45295d +size 290704 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EA.csv new file mode 100644 index 0000000..0e97787 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:854da4fd7e37a8d2c115fde726af7510a283c70b6189dab7f0e926d3e2474710 +size 287992 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EBAY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EBAY.csv new file mode 100644 index 0000000..b7cdc1c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EBAY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b732dc37a52c7d4e7a07f820cad8865303eec70b29894a6dfc05d889c541c9f9 +size 294706 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ECL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ECL.csv new file mode 100644 index 0000000..9b1b20f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ECL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c36508bf3aac0d932885e4aa52dd891e1f0294bd45a165555c3bee043cbf149 +size 291919 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ED.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ED.csv new file mode 100644 index 0000000..65263d1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ED.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b2ded68f576a614a18675d8cb981993853f6ba0904143c5dd13eb81a728de2f8 +size 282462 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EFX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EFX.csv new file mode 100644 index 0000000..6a522a9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EFX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98e435e03aab9a734ba856a561a75be283f8483ac66706e821eec70434632147 +size 290787 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EG.csv new file mode 100644 index 0000000..2a77a10 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb8fe0c8764bbfbcd013926f286e256bf402085a9373198e719580fb37e07358 +size 287038 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EIX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EIX.csv new file mode 100644 index 0000000..73fe234 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EIX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea554281e6d79d9a95a4d27875cdea33af7b84ab6261abffa88fc66fb555a2fb +size 287170 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EL.csv new file mode 100644 index 0000000..db64e3d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97636eba8aaa27758fddde74673a648839aeb193574044d7690d4981cbfc473d +size 286356 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ELV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ELV.csv new file mode 100644 index 0000000..4f474c7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ELV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea45037d2ecc8ffcc8dc7f788e334c5918f540ff61d090fad3482afae98ed113 +size 286956 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMN.csv new file mode 100644 index 0000000..2bcebed --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef791b625585208d183bfe044b94a10cfa87fcf788165ce0960cb1996cb95dd2 +size 285752 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMR.csv new file mode 100644 index 0000000..495c2d7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EMR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee2e30c5bb9abb52d307a03d892af75044835540e250ad18709054b93af5246b +size 287310 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ENPH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ENPH.csv new file mode 100644 index 0000000..866fdcf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ENPH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee95975d1a78cedb4045e33f7c1a430e7f82a13d72d6b4fade1428039bf4b35b +size 290502 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EOG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EOG.csv new file mode 100644 index 0000000..d5ccd32 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EOG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1285e93a1f240032a3de13f604758cebcf95b0303f79c4cc0d6a57ca9d6f702a +size 287677 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EPAM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EPAM.csv new file mode 100644 index 0000000..1e8621c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EPAM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccb7427b199aa6c64121903b4a6f5fee7cf1d9e650c09b53948688e0ed2ef279 +size 283528 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQIX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQIX.csv new file mode 100644 index 0000000..5747756 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQIX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3ee91b9e7ec140697203ffa1a0e6f4e476af07e3b2008df79286f38dab353385 +size 282619 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQR.csv new file mode 100644 index 0000000..743a999 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5a8d11ffd9960d22fb2d202901563a11b5d635d77be777c410c77f053618810 +size 286988 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQT.csv new file mode 100644 index 0000000..de7d3ab --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EQT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3a5e7da405e03cfb9b849b3e60747c032c1e91a29b6324a0bf176bfca3edb57b +size 294624 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ES.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ES.csv new file mode 100644 index 0000000..4f73ab3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ES.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f94112f2871cb565253751b579134979ad92af1a7b1ae2884b00767d15f10d4a +size 285803 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ESS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ESS.csv new file mode 100644 index 0000000..25198e5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ESS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61e333e62385554a530ab14c242126fc8b97226354a62f56444b6936d1eaf5e1 +size 288980 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETN.csv new file mode 100644 index 0000000..8ac4f4a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cdc478adeae82a56c7fd7cf8dc7940bf40c82c854fba5f76ff42766db701c53 +size 288528 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETR.csv new file mode 100644 index 0000000..2b80832 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fdbcd47fbfbb16f23f625959de2245a961b5d612ec34c67541c8d3eef4790f0 +size 288110 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETSY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETSY.csv new file mode 100644 index 0000000..8171137 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ETSY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7a29d03cef1a550aab9012f5f6929b70de410d00ec82fcdff070403c959e088 +size 283008 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EVRG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EVRG.csv new file mode 100644 index 0000000..ab93fa3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EVRG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:693c51fa9496fb8dc6e2e564258801d4cf0aac4e4b7399b70622bd20cbfdfcdc +size 291142 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EW.csv new file mode 100644 index 0000000..6d2f9b1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cab506f4bbbb0b9ca4322acd3ec153edba4c1747f4c81a1f51ae958b5a887ed +size 287282 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXC.csv new file mode 100644 index 0000000..6ad44a0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56323fde9ff458b2414cdaf5978b710a51ca45613b860545d415e6709a9cfc84 +size 297024 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPD.csv new file mode 100644 index 0000000..97a62f9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6148d76c3f4c8e8745ee314d12ee2c10dc54d34ac135c0df3dd7772b57fc1aa9 +size 290944 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPE.csv new file mode 100644 index 0000000..eb0da42 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXPE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8c688f789ac7287c73d3c824ce1863bb71fb9b6a7319c918da146b74bbdc2cee +size 292603 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXR.csv new file mode 100644 index 0000000..9327a04 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/EXR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d973d6c8a202c390293aa6693651b02a8e10e80f1784dfdcee6337676426a38d +size 287676 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/F.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/F.csv new file mode 100644 index 0000000..adb43d0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/F.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b885bd5a993b02b2bd49a26009e7d1dd4561a8fa176bc9d85c3313cf556afc85 +size 289980 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FANG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FANG.csv new file mode 100644 index 0000000..198278d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FANG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71584a65a260d01b1548f020fc17f562aa8a81810104d55dae72e5094e8cdd33 +size 290465 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FAST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FAST.csv new file mode 100644 index 0000000..6a63051 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FAST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6658c0bfc75f8f84461f69b93041830ef1a97668b98d40bf1d3c55b3fd2c040a +size 294809 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FCX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FCX.csv new file mode 100644 index 0000000..3fcf238 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FCX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e94c2056ca185f3988d1b78286200be36e7dcecb98f512af75acd29e705fc08 +size 295512 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDS.csv new file mode 100644 index 0000000..45a2e2f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e6efc1529f4546362bf99451bcc249dde938a457ed0c09b5bc985f11c3d1d901 +size 287690 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDX.csv new file mode 100644 index 0000000..1164476 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FDX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89b353c51b9d955cb4ebe5d9d86a03eda309f46db14ba772fea3ee22b6bfa320 +size 288706 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FE.csv new file mode 100644 index 0000000..4767c9a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dcf27d0daa39727f36aa112e1772a7d0216eb6b64c6c916aa8edfa7e96e5431e +size 289306 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FFIV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FFIV.csv new file mode 100644 index 0000000..5f3daa6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FFIV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a76926a41e2efde0e4628d07ffd242bf235846a1679ba27b25f6d6c44e2f5c6 +size 292011 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FI.csv new file mode 100644 index 0000000..956a127 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:10dfdf53bba8a16b1dd8dda9d983c1108e51b9c6e41fcdd7f95e98555db1653c +size 286875 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FICO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FICO.csv new file mode 100644 index 0000000..3928f49 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FICO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2262d34267fe642755283d5c8d97d683bc1cbff57940f219f93f6df45fc3aa98 +size 286137 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FIS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FIS.csv new file mode 100644 index 0000000..beeb664 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FIS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7996f09656410d207aa2d1b69018fbbb6a55991f01af892fc2e15afa7d387142 +size 288353 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FITB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FITB.csv new file mode 100644 index 0000000..827e24c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FITB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cae68456dc5c151a1a42a3440e301c5d267017651d24326fbe2157e9ebd8e6e0 +size 296559 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FMC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FMC.csv new file mode 100644 index 0000000..a3d0513 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FMC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efee6e9411cfc9352b4bba75d6123765e899b3aa7eb6f764b031517b8a85c72b +size 290167 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOX.csv new file mode 100644 index 0000000..427243d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b74facd7a2974a2794a9e1ce6e68805a47f6b69a9d6675877815935d443fc43b +size 193546 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOXA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOXA.csv new file mode 100644 index 0000000..6846d5e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FOXA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dba46c774bf78c812f2af7834f907fff9e0f9a7c03732017ba80095c39296f50 +size 195934 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FRT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FRT.csv new file mode 100644 index 0000000..d068032 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FRT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b8a332a0cbe19ef8f38f32d99477565a6f1df2d0b82d3c97d045ed9c1290110 +size 290008 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FSLR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FSLR.csv new file mode 100644 index 0000000..ba67f01 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FSLR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:640db2b675d26f17d70e80be6897bddf8548a3ad565cf6dd7d56f387c0da54f3 +size 288271 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTNT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTNT.csv new file mode 100644 index 0000000..8f11657 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTNT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78676ee86071cdbcf9c0043d74fbee05c76123c74665c4b3f16be8117750510a +size 295787 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTV.csv new file mode 100644 index 0000000..17a37a2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/FTV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89cbbeb4cac8dfa7a33e6b70025c7236d984758735670c488690c5bf8e07e9f7 +size 254872 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GD.csv new file mode 100644 index 0000000..c183861 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5adbf37ba369f1e0f6e02f5fd99706a03580f2a71ead8680a42f0fbe9b69b830 +size 288303 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GE.csv new file mode 100644 index 0000000..53daa3c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7ef24f4dac56a5f189d70e1eda1ffb932d293e69a137465f4813568426d1fee +size 294308 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEHC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEHC.csv new file mode 100644 index 0000000..38e2e88 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEHC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abe3998f541c628ac6f2ab12a614122eb6a256d9575f7f960615218f1b23974b +size 104569 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEN.csv new file mode 100644 index 0000000..cd14994 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GEN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82953fea3394abe66a253f7f19e9392fcccd35facd4f18137db4f7fded50bef2 +size 294798 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GILD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GILD.csv new file mode 100644 index 0000000..2328ff6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GILD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80c31cb5cbab69e3e37a34d8bbfe707c701dcab32d2ab363d4f846ccd706662e +size 287983 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GIS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GIS.csv new file mode 100644 index 0000000..29e005e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GIS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:508eb2b8c56989c10b4448054cab26596a987bbea39f94d020dba9539cf06c9e +size 288866 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GL.csv new file mode 100644 index 0000000..6c86c47 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:736b92812913bd5ed0ea892eba8c8470c37fd2bca931795ccb0e39cfced82ef4 +size 284091 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GLW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GLW.csv new file mode 100644 index 0000000..78aa72b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GLW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af9927f05446b7101f67ac39aaedab5d6aedc19c6f3cabd062450f0aaeda0d6d +size 292850 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GM.csv new file mode 100644 index 0000000..f2eb297 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:54e56542ca7a06f486c058e04d5cae1adf75626ae4e88441ad496d81ed0bf423 +size 289682 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GNRC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GNRC.csv new file mode 100644 index 0000000..3bc1989 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GNRC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d9145151d364a9c7c13e0faf8c5d44047b3793cd05bff9876ff3c6a0fe9e509f +size 287971 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOG.csv new file mode 100644 index 0000000..5383e79 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9472205243d949c4d5474881c7571460412b1cb569829716e16db21db9c54512 +size 297365 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOGL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOGL.csv new file mode 100644 index 0000000..109c4cc --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GOOGL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b22460a7f7cb7f3d598679b9800749d68bebb80a7055abc95d79cc562f3bcf51 +size 299195 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPC.csv new file mode 100644 index 0000000..1b92563 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b84f50cf397797eabf68c4548f8d456390fcdf88a468815ca7f6fd3f6cd762f4 +size 286970 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPN.csv new file mode 100644 index 0000000..85aacb4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GPN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b41efa24e050536cea633425c49e8a03bb7f765312c1c4aa2ee7bc53f7cdfe35 +size 290563 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GRMN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GRMN.csv new file mode 100644 index 0000000..4fbc819 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GRMN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:48a0a183fcef70e6c39ba3ca3ea6b45b82ad6f6db0e15c00573a7b8efe596d64 +size 290383 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GS.csv new file mode 100644 index 0000000..93f3539 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96408afd4a2f8068ace975328f6e85eb77ce916b25a1738ea772f5a1d45fcd74 +size 284546 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/GWW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GWW.csv new file mode 100644 index 0000000..95196e7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/GWW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd15080bd9d2a13d08a5c59ef9783745748d706ea6d3063402905892a9d47b14 +size 285171 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAL.csv new file mode 100644 index 0000000..a78a863 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36f40cef398e89757e3e6667d0a08ccdbcd3f1e4dcff37abd05745d67233af86 +size 292753 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAS.csv new file mode 100644 index 0000000..87781b9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HAS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4962b85f68be2ac09f0235df50075ee6b0a528098926047dbd5eeaef84b13d1 +size 284624 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HBAN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HBAN.csv new file mode 100644 index 0000000..e16f653 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HBAN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51865ad12105d8b4d1b037e5ec3cb008c11efd25a592ca0f1be36731d42e17f3 +size 297504 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HCA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HCA.csv new file mode 100644 index 0000000..368b47e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HCA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aacd44269e83584d008491105239002f87fe0bf7c01406fc7b27b2a3b40a0b21 +size 288274 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HD.csv new file mode 100644 index 0000000..f397ac3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71adbe1cecf642f51d5a4dd477f2d84cbdbab85c95acbc396a1861a440d96bb8 +size 286542 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HES.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HES.csv new file mode 100644 index 0000000..4b42aca --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HES.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab0ffcb1dc2e615098720f8321400f2498fd3b396d2335408ce2d9eda4a14998 +size 289702 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HIG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HIG.csv new file mode 100644 index 0000000..e2d8f01 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HIG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f11dad57af34831911af5e4f366455fbd26b31444fc82cbd7d56309d6e36a60f +size 288872 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HII.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HII.csv new file mode 100644 index 0000000..5e9c99c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HII.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47769d2f275f04adac22c117e77abb70840750da57c8f587560fdd15ef07b0a3 +size 290121 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HLT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HLT.csv new file mode 100644 index 0000000..0d75371 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HLT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abf69a0c7813870c134aca99c5c936a5163149ef332376816271d31154f6b2fd +size 290617 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HOLX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HOLX.csv new file mode 100644 index 0000000..2779149 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HOLX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3acfdb8ff378515abb17c209c9aa52c1faed268d98eed57d2178f2ba352ed726 +size 288477 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HON.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HON.csv new file mode 100644 index 0000000..97ec455 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HON.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6a5c8e0b11cc0d43892991a4cb294df570665bb23f01f565aaf8a98e69b96ac +size 294326 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPE.csv new file mode 100644 index 0000000..cf9ac94 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae1afd0836c882920d5f39c8a4bfe47dceb18bd73aef297c9fdd645e88d4b76d +size 277798 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPQ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPQ.csv new file mode 100644 index 0000000..9346132 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HPQ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d28e4fbc6b49c518ad0c1dd02efa2c8f4a3c041f8e2f658d42bbdb8584d5db32 +size 295883 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HRL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HRL.csv new file mode 100644 index 0000000..9ce20b6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HRL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8fbe9fcbff0f2ea3afc87fa3941eb1ddaf920b7cea6df3cd52ac7778525dc7a +size 290855 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSIC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSIC.csv new file mode 100644 index 0000000..13718d1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSIC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6bb22cff7c1eacdc06f9487389a5e5b618729d8569084b58e4f43ef4bca3d7ea +size 289012 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HST.csv new file mode 100644 index 0000000..9e18364 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4011c943fb3dac6fcd4de17099f52336fe4ec901a01b2a6d66be2685c1bb73c +size 296032 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSY.csv new file mode 100644 index 0000000..7fc81e6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HSY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6f9edb31814f8cf8ce811de67f9dafe7be59b67d82b3ebd2ee9d8ecaec83d9b +size 289132 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUBB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUBB.csv new file mode 100644 index 0000000..52202a9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUBB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d980e0cae339294e032c47f1baa3476925b5b8f8e235788dd73b558003db9cd2 +size 292809 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUM.csv new file mode 100644 index 0000000..0e640ec --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HUM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a43cacf666cc1f75b1cda8c2b9b211177e1c3ec7e128aaae605e20fc58d32ad +size 284542 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/HWM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HWM.csv new file mode 100644 index 0000000..f0d7767 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/HWM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:89797db5db0643c014a3fecf5d29d169b3d1a78b3b4c101f3365db9c1103c82c +size 248438 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IBM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IBM.csv new file mode 100644 index 0000000..2f4fc92 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IBM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39279b75b13a19d9b7a6e1fc7e21c3c87d79a96c89903cb876c3e5a5862d298f +size 297565 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ICE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ICE.csv new file mode 100644 index 0000000..d81f3ee --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ICE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdc9699adb3207873daa45f7b3fc9d0e51e69e651551ad72dba6268b35a9a0bf +size 290376 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IDXX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IDXX.csv new file mode 100644 index 0000000..03aec0c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IDXX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea5fc7508aae994d487757621b42f9849352d7377f849b500a59c794cba81aec +size 286684 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IEX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IEX.csv new file mode 100644 index 0000000..23c6cea --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IEX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce93c306fe81c54c6868aab0cce97c7ef4a58d38c5cddf1325f110cad7c711db +size 289791 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IFF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IFF.csv new file mode 100644 index 0000000..de93370 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IFF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27e62df0a15523982c72a5e689ab8aaf06d8592875a4723103f0cc034fa511ca +size 290527 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ILMN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ILMN.csv new file mode 100644 index 0000000..5313ea7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ILMN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c12eb3a1f7b1f98267b05927535eba7e3a0c54b8117d53cff9078b4a39403ce +size 286846 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/INCY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INCY.csv new file mode 100644 index 0000000..4057c20 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INCY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a3c7b8c3f6b961a19ad746c7732a975d17a4863f9289c7c640da56a15cfec0a +size 286695 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTC.csv new file mode 100644 index 0000000..25eb39e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecaed7dbae6a53a7937a4134e83860fbd88fba560030c413ba10ecac6b5e7d27 +size 294669 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTU.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTU.csv new file mode 100644 index 0000000..6f2098f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INTU.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:251d4e151123b4a391765d5b57ea64ccbb913fc88846a002a4c0861f77d24d5e +size 290086 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/INVH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INVH.csv new file mode 100644 index 0000000..6a05efd --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/INVH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76ab4a50d9e429c57c4992bc144d5e0b519a5628ed7745489fbbd2be1e4595e5 +size 246031 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IP.csv new file mode 100644 index 0000000..5c8114d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4778b6d32a0659184cdd605a50e3a6ce42bbc51337d900312d00817bdbf62b5 +size 290182 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IPG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IPG.csv new file mode 100644 index 0000000..2c2c0d1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IPG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c6b17f38ed393e84cbe27089c5c7bb2ec0bfc0b047c2605f2121ceb4ec41a49 +size 294443 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IQV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IQV.csv new file mode 100644 index 0000000..bf132fb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IQV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:55ddd1a80aca8d516ee1e3700f6d0e57945eee4be4e107ccfa0d435b61ff093a +size 287106 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IR.csv new file mode 100644 index 0000000..3b877d2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b0748801814f39ab8e3ea7d7537ff228b40ccd1a1478d9e22e7336bb5857f03 +size 232402 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IRM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IRM.csv new file mode 100644 index 0000000..e963bcb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IRM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4ef15b8d455f80f656002f06931aeea8769e238757052b55f73609e13f654548 +size 289572 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ISRG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ISRG.csv new file mode 100644 index 0000000..c9ab262 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ISRG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a51de7278c98ce1054b31674fac4dbecd839fa5706ee4928d80ac41a57455a4c +size 292808 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IT.csv new file mode 100644 index 0000000..8576a74 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cddf588eb609ec6e68688cd22436dff2ca94ebd0d877837e5af7593e61cb1f48 +size 284849 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ITW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ITW.csv new file mode 100644 index 0000000..6bc59f6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ITW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cfea1ed63612fa535d5e8ff8d71596335e3c6629b12d53ec751bc4c1fd1ba5e +size 291692 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/IVZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IVZ.csv new file mode 100644 index 0000000..64c78e1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/IVZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78394963df109792886ee0513d5eee406da8edf890d2f2ca6764d75fc83fe104 +size 294449 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/J.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/J.csv new file mode 100644 index 0000000..4fa4924 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/J.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:616922ccb0ec1bdaf7a29c5f6184fa54fcbb3b0c53e0bb9abed24b9a5886ded4 +size 283047 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBHT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBHT.csv new file mode 100644 index 0000000..379e7a6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBHT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fba7d3f5808c536e61834e91456753a626fe38d5467efeb3a379a766bd71c3b3 +size 291501 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBL.csv new file mode 100644 index 0000000..29502ee --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JBL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fefaa00ac823521425a11a4ff777f967dc680ccea4bc383a3745ca841dbae090 +size 291181 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JCI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JCI.csv new file mode 100644 index 0000000..76558c4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JCI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d0902dd28cac23e092a1b8eccfce211e7a855ec02b1011eca2a28c7e2c9acaf +size 290993 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JKHY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JKHY.csv new file mode 100644 index 0000000..7c9db2d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JKHY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:42f854b00de33ad5590d01dcab260db3338d36a60dbb5bc00b19eb0475846588 +size 292177 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNJ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNJ.csv new file mode 100644 index 0000000..24c2a52 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNJ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:560bd7a001b3dd2df861ea714ad34c8464766f5ddffba60d0e83ba0e4c470b7e +size 291904 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNPR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNPR.csv new file mode 100644 index 0000000..4ace051 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JNPR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c2e35928d0e40f7a4f251dc0f0f15be466097b1871b03f56488d6de7614aad1 +size 296564 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/JPM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JPM.csv new file mode 100644 index 0000000..a8dd2c2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/JPM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99e3f5f412fc4b36aee47a6c8160f11065c81a8f2084d431a3ad248e9dacf6d9 +size 292657 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/K.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/K.csv new file mode 100644 index 0000000..a9a2272 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/K.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9b9cf29bf374069dcf9a893d50ffa6aac772f7a1fa14cce2574b0f49131c7230 +size 287967 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KDP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KDP.csv new file mode 100644 index 0000000..d057099 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KDP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62ee6204da088700dff468efd67a21c809d93b536198e7a5517ba9ae9e9c0167 +size 290902 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEY.csv new file mode 100644 index 0000000..320b507 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3729d9b7e13f6fea7cbd8592d6c793755933e2b512ea247335916f3cc7b657e +size 296379 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEYS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEYS.csv new file mode 100644 index 0000000..2fb2fbd --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KEYS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:97e2c507754a2add26a3eaba9c87f3be04fb8a293663b9e1dac9650b1c733f06 +size 289509 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KHC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KHC.csv new file mode 100644 index 0000000..d720dd2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KHC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccbaf7da715ef08fe6ef05b4adfff255cba77e3b076dc1c00a3a3487b33d1b34 +size 277557 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KIM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KIM.csv new file mode 100644 index 0000000..e950c49 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KIM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:64bff1de20b5324535ef212f901fce3ed16cdb5983c1690bc968f853e868fee4 +size 295209 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KLAC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KLAC.csv new file mode 100644 index 0000000..0e5e8c2 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KLAC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1926137f6f10a86d500e6aad0a2dd49ccc7385570977ea0507dde9619cd13cb8 +size 289458 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMB.csv new file mode 100644 index 0000000..ba0623f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:162f4941e62b6991b60558c1967e8b5050726ba467f85e815af91a4c2dbc5e2e +size 293642 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMI.csv new file mode 100644 index 0000000..a674d2d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74f2a29d2b4a1d8068f2fefce192b6aabbbf276fd7b38eef45dbea16774a3701 +size 296148 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMX.csv new file mode 100644 index 0000000..0f71937 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KMX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c7b2406d9bab7d4f1ca01dfc0eb5403bdfcdc2c3554dd9d18362b8615814bf8 +size 285602 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KO.csv new file mode 100644 index 0000000..692ec10 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b683ab04edf6e3a5971aecfa70b573afd7080cb6cf97738e9354865c72c3775 +size 289108 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KR.csv new file mode 100644 index 0000000..fd40c3b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3cbb37772662d6495cf5d2b67f8660c1e8dd9b4267b479bee97f1d990625c739 +size 289546 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/KVUE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KVUE.csv new file mode 100644 index 0000000..694c96d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/KVUE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd2b937b830aaabf1ac805e836b9eb77852d56e8b27c0f51a11467d2347980ad +size 98207 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/L.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/L.csv new file mode 100644 index 0000000..d260b03 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/L.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c561254a0f0aae3523f9a5dcb3b31c87fd9f6513ad2e8eb7ba2ae2a8b5877dcc +size 284458 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LDOS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LDOS.csv new file mode 100644 index 0000000..c05e082 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LDOS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb0b10ecc77e22b5a8251865c73959d8f64b16194c0930dab80a4db7d512f7c3 +size 289864 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LEN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LEN.csv new file mode 100644 index 0000000..2540556 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LEN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4df2269e76c973980b04ea918baee14d458e984ad3ebb27ad9ac7509cc8b3dd0 +size 290205 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LH.csv new file mode 100644 index 0000000..919c90c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b167cd350549c55a0a5e742ecd1675b284a50bfd4a230371f0c2a7e15f5adabc +size 294337 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LHX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LHX.csv new file mode 100644 index 0000000..202ca66 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LHX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e523ada17c8d9da538218a3b9ec62c4310200d96935c0f3be014d2bae2778761 +size 288863 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LIN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LIN.csv new file mode 100644 index 0000000..6e647ed --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LIN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46192d300b97b0145c800ed28115c1274b32c6e494261f0b32da165087389d44 +size 290583 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LKQ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LKQ.csv new file mode 100644 index 0000000..d69f386 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LKQ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c97cff23b4795269a4ec4ed9647325356aa3ca927e3219fc458b591054602ee6 +size 291655 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LLY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LLY.csv new file mode 100644 index 0000000..c66e7e6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LLY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:165117d1a27c648ed277f4251719d0143bf0663c231a257ae5e38ca54354753e +size 285705 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LMT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LMT.csv new file mode 100644 index 0000000..91f863e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LMT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dab14a596a049afc5a4f60ed33bc58bbcc93b9e3ae3c0e2759bf49eb215c59e0 +size 283019 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LNT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LNT.csv new file mode 100644 index 0000000..88c3b99 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LNT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:823804b14205f0a8893a7983b79cda2bb16b146363a7599216dd15b7a6de6d9b +size 290789 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LOW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LOW.csv new file mode 100644 index 0000000..446543a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LOW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7214fda4ccea466ba92179384c451a5ae402827a62edc7ba48cc18b13a160b14 +size 288441 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LRCX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LRCX.csv new file mode 100644 index 0000000..594cd99 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LRCX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f210b276639863f97ef1c6f6b9ed707883e0fc7f1b0f1d9eee05c1304a34022e +size 285487 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LULU.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LULU.csv new file mode 100644 index 0000000..83766c4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LULU.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68bd9b86004fea1c1ba3e312e6e68f40d74868a0229b52275409a04b4575209a +size 285538 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LUV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LUV.csv new file mode 100644 index 0000000..553dc68 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LUV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:539e625e19fed91c462124e4531f9b55b2f867a48c2a5ea6996ad9f754feb7fd +size 290124 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LVS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LVS.csv new file mode 100644 index 0000000..0543f69 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LVS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5df05ed6a687643702264d51e8c94da78be0cbb82d96a79d48d4df3738a9448f +size 287620 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LW.csv new file mode 100644 index 0000000..5e3327d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1418b67f9cc5bc8314117bbcff920ab707ebbf8a152dc8ca5fa6158d66573681 +size 240520 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYB.csv new file mode 100644 index 0000000..c6c0285 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7c137e39779d8b8a540a7bd3c2c602544d78b9ac7a91ec76cbfd9720798577d +size 285512 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYV.csv new file mode 100644 index 0000000..787db00 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/LYV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:74c6b2cd6e22de487e776cb51ec9a593761d3696ec319ac3ed2403fc9ea3e372 +size 285810 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MA.csv new file mode 100644 index 0000000..80233a4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df28a0647ae831343e0f2f230fea1cdfe302a470d9a33373391f0a92d2a97512 +size 282914 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAA.csv new file mode 100644 index 0000000..099a366 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b56caf696f5a7f9995f805e56e6982fc7ea9fd93a3811db73321503734aaea9d +size 289623 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAR.csv new file mode 100644 index 0000000..43b4a9c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d218e2356aa59db881a57ce1b9561f446d7255a57e4ac9b728d534e5b832d47 +size 289671 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAS.csv new file mode 100644 index 0000000..393ba16 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MAS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa1bd6ce32673302d213188c763e1b4c775698743f4d15f3ca982c45142c9e94 +size 291548 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCD.csv new file mode 100644 index 0000000..22af97b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1cf4ad26fcf26230b7f6ccf6ed58d5488c6632b3d68c97956adac2204959f05a +size 289491 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCHP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCHP.csv new file mode 100644 index 0000000..b7f2287 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCHP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82f8dc94d42b5d7c7314c0468eac59210f78ff5e1819cd3115a80aa338390387 +size 291018 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCK.csv new file mode 100644 index 0000000..8614e1d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e23551bcfeff250af00ea31620b41f010dfe388309f6d1fd0f250f4a802e48bf +size 289256 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCO.csv new file mode 100644 index 0000000..969003e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MCO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68f186edb4c7984929781b204ec7e6d0aa8f848d8f8011b9fefb53b60b5eb69e +size 287881 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDLZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDLZ.csv new file mode 100644 index 0000000..7c56192 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDLZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0856a1b516cefb253f73277704ce04e7d73e9bb5dc1b351f8075cd5a6487e50 +size 292085 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDT.csv new file mode 100644 index 0000000..0859bdb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MDT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6dc48e5e2b2cdea10f0c4c149fc36b602233f7ddbf243b38f5303da79d216512 +size 285838 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MET.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MET.csv new file mode 100644 index 0000000..713a91f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MET.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:425b032502f5be09276c80dd5879b0140980f5ae36f33dc6df0d222ad366e530 +size 290954 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/META.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/META.csv new file mode 100644 index 0000000..00c1b91 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/META.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cf533a270ef18ff6cae75f64145fa487c4c8b3008d265020079ea6b0d266446 +size 293886 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MGM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MGM.csv new file mode 100644 index 0000000..959dc83 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MGM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d820e693d9ac619864eff1b529dc569fc4982762a83d1c4391ce8d76e9737533 +size 291927 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MHK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MHK.csv new file mode 100644 index 0000000..19bef38 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MHK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c2fca65161a1becda2ef61937ae26f51d93736f1bb6844bfb05eb4e3aaa877f +size 288341 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKC.csv new file mode 100644 index 0000000..3cdbfaf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78e8e44699c57e84a11df6aa5751c56340649572ee4e1a6a065e3234a1fb3c63 +size 286140 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKTX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKTX.csv new file mode 100644 index 0000000..38e0ef0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MKTX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:520e8ca509488a7bac500519f17df73fb23b09ba37aace9395c8a4f7d645259b +size 289178 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MLM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MLM.csv new file mode 100644 index 0000000..07fa995 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MLM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:abc7b7a3e4553cabdd59fd50aa8e46eff90cb2c867fe93bfa7c0c72c9471dbbc +size 287191 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMC.csv new file mode 100644 index 0000000..83ad1b1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:077f67ec9b79c2ccc56110975a018db77cfcf7181364d58254418dc552069002 +size 290282 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMM.csv new file mode 100644 index 0000000..d4dd388 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MMM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2b61cbf5e0a5b25c5d272ac713d2986858ba5149ba0659a4ff5ed6c58e88ad95 +size 297908 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MNST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MNST.csv new file mode 100644 index 0000000..da86c5a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MNST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc7e92c2f6ae0fe276f10952563c3ed461f83fc37d5f1fafce258cbec2c1cab9 +size 294410 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MO.csv new file mode 100644 index 0000000..4a0fe55 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a7b29aae47e9b08d528956384b14f302db12c6b4e465796cfc6a7d496090931 +size 286932 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOH.csv new file mode 100644 index 0000000..f1697e4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:228063e583535c0be04331dccebd765bf2a900a9c27f1be4840bc6eea4871945 +size 284787 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOS.csv new file mode 100644 index 0000000..72d678f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MOS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b296a2284799d9cd40c90faac5e5bd70a86e83653686d9c1f6a72f7ae5143e59 +size 292248 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPC.csv new file mode 100644 index 0000000..0b39bcc --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e920a16686ecaa0288cd2aaa411b439fa5a28438fdf0372711e31c253efb7fa8 +size 289571 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPWR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPWR.csv new file mode 100644 index 0000000..9c47db0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MPWR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d7f11690323426ad00e7d23b258b9675eeff51f5d66a3b0009288c1ee50182 +size 288078 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRK.csv new file mode 100644 index 0000000..9d875ed --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba13aea45b124b12e4e523cc76fde53b8fee5988838b612407a29d4dac424d64 +size 293140 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRNA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRNA.csv new file mode 100644 index 0000000..cd6ae80 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRNA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25baa553018ad21ffe5526c571376bdd47fdc6e50dcba192c50987f41238d271 +size 198278 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRO.csv new file mode 100644 index 0000000..170219a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MRO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:078fc574003ca660aa294fe64f4d9bd4a78162a2af15589444e73883103a0808 +size 295667 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MS.csv new file mode 100644 index 0000000..c0f3c16 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:61f7ae2b685550b3a79eceae2d38d0060eaa2f9678cb974ef6358548d4d69b9f +size 287571 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSCI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSCI.csv new file mode 100644 index 0000000..ead63a8 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSCI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc6a0943315b29b9c26a659d4c684f626b8df538bd11c82ed1bc9cb96359a310 +size 287079 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSFT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSFT.csv new file mode 100644 index 0000000..2e901eb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSFT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d905123b90b8be435d8700951c58645414a1e92a042dce704ec8fd68e1391cec +size 294210 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSI.csv new file mode 100644 index 0000000..a32e046 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MSI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:720bc62efc7e8dae00eea0c8f93e147b263f38328793876260af502c33ef3937 +size 288123 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTB.csv new file mode 100644 index 0000000..f0f5f69 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df3c07986ca527eadfd1e87e02d38340692e449c41177b6c1c92ff2832932569 +size 291941 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTCH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTCH.csv new file mode 100644 index 0000000..0ce9c1d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTCH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9ec9cc0f8ce638388d429966b5909b0fdec6e6eb0f08e83c330c0fc49f423d53 +size 291440 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTD.csv new file mode 100644 index 0000000..53a902d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MTD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d3084390c770a3c29337dff5b7c70fdd88b7761b59a9da2958f77775e93b7506 +size 280501 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/MU.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MU.csv new file mode 100644 index 0000000..9818939 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/MU.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fd62dc9ae64eda69ffb640bc4e9de9319f657195466b6496fd73dc28f2c6c85 +size 289013 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NCLH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NCLH.csv new file mode 100644 index 0000000..ede2d4a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NCLH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f185f9d6bff464449d88d0ddc7a211158f93d61500102cb7270f3ae67fe371d +size 293396 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDAQ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDAQ.csv new file mode 100644 index 0000000..f6e3dfb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDAQ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4e4137944026b6f7003b66b332a6aba4f89381a09d7ce925de486b25dc1648f +size 297506 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDSN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDSN.csv new file mode 100644 index 0000000..9de04f7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NDSN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e314206a31e4f07a31c83845abfa63444add6f16b14e2048995b7066c00621b5 +size 291884 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEE.csv new file mode 100644 index 0000000..ca92ea9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07d56786a46ded7ac6ddc93f9f5cbf87a660eca4531974100cd4da4ab8399deb +size 289103 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEM.csv new file mode 100644 index 0000000..16f8479 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NEM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e8a2b1d892e983e9c2cb0323218323ed0e58781095478e3ea9cbf707b90372e +size 291331 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NFLX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NFLX.csv new file mode 100644 index 0000000..60198e5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NFLX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec140f31e6a3a231b0b19c90e88f2e05431ea12212232b8362ad869327eaa8f8 +size 284307 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NI.csv new file mode 100644 index 0000000..fa4f6ec --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47718704f9952f9b50513376fbe2bbe0436682e36456b46a1e5cf84108dccf63 +size 293004 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NKE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NKE.csv new file mode 100644 index 0000000..875e506 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NKE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:832d7bb7476bbb44024fa2ef147003f234f96936730b73d862018b206a2bdd73 +size 288441 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOC.csv new file mode 100644 index 0000000..e96cdd0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:534b0590670ba0b77e8d12a286869ccb903382425f51a3bea68a8dd6897ae9f1 +size 284723 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOW.csv new file mode 100644 index 0000000..4477bf1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NOW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b59f4dc8c0e6266bcabf3301a198036a7851dd3fdde734fed4ca04dc205ec17 +size 278931 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NRG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NRG.csv new file mode 100644 index 0000000..4a03467 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NRG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56afd7c9ddea3b71e097a1c2c8d570d311106f4bb1a3e48c15d2c8157c447da0 +size 292059 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NSC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NSC.csv new file mode 100644 index 0000000..2ba28a1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NSC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35036b8577e497f8a3e2261b9a69af092b678bcd385eba6ceb10a5a8cdc5fa74 +size 290103 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTAP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTAP.csv new file mode 100644 index 0000000..8022dbf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTAP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e6f6e3f05ea86a05cab91b91b68d262e8f573bb6f88699f6ab69e7a12b536d6 +size 290831 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTRS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTRS.csv new file mode 100644 index 0000000..32bdc1c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NTRS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b53847850ab4f70ebf08394caf75ff18dccf921afab1561edd4f1fefb3202c1c +size 288651 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NUE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NUE.csv new file mode 100644 index 0000000..ab9adac --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NUE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd7a7af42a967043f1aff88b1c5dd1c9403403819d3626503c37bc873c69f495 +size 289099 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVDA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVDA.csv new file mode 100644 index 0000000..dbbcd75 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVDA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38e484b119721c7557084afa85e261b7158e6138325797316dd3e4af8984ed85 +size 303503 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVR.csv new file mode 100644 index 0000000..f685ada --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NVR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a11ec8423524c5a3184f0950c06eddc7719d43d390919ad0afe5f266c8ffe944 +size 248906 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWS.csv new file mode 100644 index 0000000..b369b4e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eec2a690801e6773ab87f4192b0adeec13046c6b074c0a8db9280c3ecd75ffe0 +size 290132 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWSA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWSA.csv new file mode 100644 index 0000000..58df13d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NWSA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fd2c302730dde2b991b0d641a66f4ae93f5356fecdf0ac23744f4a49d08ff11 +size 298044 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/NXPI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NXPI.csv new file mode 100644 index 0000000..9642f07 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/NXPI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7085b1bc9bb1b9b7dbfb7615fea411fa2ef591e4473b99da218ed2cbfd62297e +size 289133 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/O.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/O.csv new file mode 100644 index 0000000..c3226da --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/O.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b2275651ca233c769bf5fa511168bf1c9eb20fd69f652b8b0f17ea4242fe77c +size 286973 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ODFL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ODFL.csv new file mode 100644 index 0000000..7169718 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ODFL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49d871ed2d44825c6bed3732165c5fdeef206ba06c79d2c4030616d31b1a2fbc +size 295484 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/OKE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OKE.csv new file mode 100644 index 0000000..2394cd4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OKE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9671db7effb1434b7b56c9045bc2f19e9f888de5ca7403ec44311bd60bde60cd +size 288559 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/OMC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OMC.csv new file mode 100644 index 0000000..0022835 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OMC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0ae5890b1053d56958dca44a7f599a42a65df1bafbf2b757e8e18ec55073c014 +size 284915 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ON.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ON.csv new file mode 100644 index 0000000..7ddf0ce --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ON.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1851b04f602b0d6c9ce9042293a96dda66a4b0ae6a5b93bf1b237297765b992f +size 287020 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORCL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORCL.csv new file mode 100644 index 0000000..6b8772f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORCL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e77a110e5c888fd7936204fa4cb58cdde4a3f8c84a0159d469916310e25ebe66 +size 292845 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORLY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORLY.csv new file mode 100644 index 0000000..b72aff3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ORLY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1c110af46db4a442d4cd5168caea2fa3e4282c668ce6501020c4622081419ae +size 284619 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/OTIS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OTIS.csv new file mode 100644 index 0000000..077a6df --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OTIS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60a324dfa769442bc2bcf6ee043838f26ca9f879bbda0eab16b41211354700e3 +size 167969 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/OXY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OXY.csv new file mode 100644 index 0000000..bf3098e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/OXY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8eda009bff2a2ee0c7a5d4f1fd2df115c34868b5a992dd6f159255f51fa37884 +size 290003 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PANW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PANW.csv new file mode 100644 index 0000000..bc7fdb7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PANW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18e3a6558fe5aaadc0ddde7e4ae5ef7be3433db259ac9756fc1f81d797e4caea +size 292224 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PARA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PARA.csv new file mode 100644 index 0000000..b84d553 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PARA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92a7e93f460bfa9a3a2432e38e1e31c0c5e5cba1cea89ae2889fde5292cc0385 +size 293412 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYC.csv new file mode 100644 index 0000000..b48394d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15be66816facc1f668a73703fca1575802f282c718f232d3bb58c9e0aa916f63 +size 286953 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYX.csv new file mode 100644 index 0000000..9ddd67c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PAYX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98903bec3b93ad618e5b5a3c9052497be35a61dea17c8f11bbfd1a5506e914f2 +size 292259 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCAR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCAR.csv new file mode 100644 index 0000000..4f3ed6c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCAR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4eafa1b5498d1383ab856e0f60f75813b51c4a55a9ffc2611c121add63b38b3 +size 295182 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCG.csv new file mode 100644 index 0000000..2afd5c4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PCG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:063a229ead81ebfae330ef56860c58935bc0e8a210b99fca2437c296a4628af9 +size 292842 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEG.csv new file mode 100644 index 0000000..087dd44 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e7fe4afec7cfb16b16ace3465220ddaff630b1c563c4771931be47ec34bf5c3 +size 290587 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEP.csv new file mode 100644 index 0000000..a3a5c1c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PEP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b8c21a4749c2201607ca851e2a3f1e51550dadf532a7038158b32853395678d +size 292604 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFE.csv new file mode 100644 index 0000000..de7d0cf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e02d3d5ff700df8c48ac501e6485649169a37f9c0b846fbd2d1e4a75f88a69ec +size 296947 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFG.csv new file mode 100644 index 0000000..c83e611 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PFG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c38e15ef2a314b98dd5236454b2bf7e4144976ffbe5fa774b7d8dd3bdb60a40 +size 287638 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PG.csv new file mode 100644 index 0000000..ae23c3e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa251bb9089162ac4d4ec45f08abaeccddbb599538d2b956b94a24532dcccbdb +size 287848 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PGR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PGR.csv new file mode 100644 index 0000000..9db7ff6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PGR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:80ec47fa6f7c7c27ee5f7724bb52a1d3904ef238b9708834d2973b1a554d2efe +size 290029 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PH.csv new file mode 100644 index 0000000..5fe9a4e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d30f9592a861bab7bfd551fd860e545eb5f75fa1e2281d46d4c523510a233c6 +size 286684 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PHM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PHM.csv new file mode 100644 index 0000000..0ecf8df --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PHM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dcb0fc927f53b40d080d08a2ed0e58d4e1ea428f7fbd8bf77bf31ffc7a585cf +size 292660 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PKG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PKG.csv new file mode 100644 index 0000000..cef8bc8 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PKG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5c24b94260bebaf69187092f76e0b543700ebeca47b220f4e7da040582c77230 +size 288918 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PLD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PLD.csv new file mode 100644 index 0000000..4b89c71 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PLD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:157a85e7b36e5a5102659756b193ef8495ba6d91bbd89dcbd95907d2ec49e41e +size 290628 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PM.csv new file mode 100644 index 0000000..70154e7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0533836fe3ccc17105910ce8deb2892931335252b7e5b844832fe6ef2aa554dd +size 282548 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNC.csv new file mode 100644 index 0000000..2fa3eaa --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcc0fb07d62fa897f04e4feab1211402369fddb190b0f424f746095cab537a89 +size 291211 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNR.csv new file mode 100644 index 0000000..14293f7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7df7e9e323b7c692a5bcecbf4f997df8c750ae9e26c9ce0360ec5692eaa94fe +size 290967 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNW.csv new file mode 100644 index 0000000..426dcbf --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PNW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b9d88d6740eab96b4a6ffe133b938434d8712fd92a7e0b73497e6a090fc99fa +size 283659 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PODD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PODD.csv new file mode 100644 index 0000000..b3f98b9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PODD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b95422397063f2f0262160709d3fb4ce666af2edd868e17ee046524e1942b836 +size 287581 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/POOL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/POOL.csv new file mode 100644 index 0000000..513fc9e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/POOL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d493c408f80bfc89583218ad61b8da618f3f73e2e0b69aaa6e3b846cafccb2a +size 288611 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPG.csv new file mode 100644 index 0000000..06e2f3a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d4aff0aee97694e14ff61e2a1da2fc9b9d84e0087e7f1ce73096b585bad690d +size 292377 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPL.csv new file mode 100644 index 0000000..3a6dc3f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PPL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4c656e2dd4a1143129c7ec55d50813b57886e88abc9f6abc0e8b791d01c23b75 +size 293558 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PRU.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PRU.csv new file mode 100644 index 0000000..341a42d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PRU.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b75623014a9d72d423d9c60ecd2650aa268e51734ef237dff39a1863e1861af2 +size 287592 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSA.csv new file mode 100644 index 0000000..6e93362 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fe7123e6d031a3a2e14a2844271ab501ab1816fcccbbed34edf9c8b4a7b9d119 +size 288762 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSX.csv new file mode 100644 index 0000000..c0966ec --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PSX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32cd4059855dc3edac52b2c31421bf4e43e34366880f8679350ea1e9d7b04a27 +size 286134 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PTC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PTC.csv new file mode 100644 index 0000000..02145e0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PTC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9441dbd8154e1b766b0ce971ef252958d26d245a93eba736f062f629a0cc9c77 +size 286704 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PWR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PWR.csv new file mode 100644 index 0000000..a893405 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PWR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60b27c3ae4e1fd45923e0dc44950e95b5d55013f748a80c223571939ef8913ff +size 290703 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/PYPL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PYPL.csv new file mode 100644 index 0000000..afb1c93 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/PYPL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcd166131c9ea889782ea90f90e581c3c097136a2e197c6af1e22885f7f6e5e0 +size 277898 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/QCOM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/QCOM.csv new file mode 100644 index 0000000..68aa6b4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/QCOM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c00c2c45198f9bf70ac2e9f8884078b21527d1ec0f65d03cf4fa791ce2bf5202 +size 292502 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/QRVO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/QRVO.csv new file mode 100644 index 0000000..0a682bd --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/QRVO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d023b1597b4baccf77937fdc616e9f0f98ab44a5704be808dc8eef78ade81ac7 +size 287500 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RCL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RCL.csv new file mode 100644 index 0000000..7299bf0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RCL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f0104a9be0a57963cd8e5acba31e67dc8d72d0a08aaed377f3a685f98c81c68 +size 286244 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/REG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/REG.csv new file mode 100644 index 0000000..938b63d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/REG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:76614e571c23f99e47075d2723a731b340719416fb7cdb9472a3be35e53688ce +size 287077 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/REGN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/REGN.csv new file mode 100644 index 0000000..7e9c145 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/REGN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:703d12886de14560c50c3e9ac9bf6cfb128c51e25e60377ab99cc26a4cfc335d +size 277891 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RF.csv new file mode 100644 index 0000000..4e1e60f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2593d98814818c917a3709917bec5e1cd157761e24bd646fe8fd620d2a80f209 +size 292373 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RHI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RHI.csv new file mode 100644 index 0000000..de6f0a3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RHI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d8d5d354d683b503d80cd430ea63f09fd814ccec3204ae771dc45a468770d1a +size 287174 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RJF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RJF.csv new file mode 100644 index 0000000..38c6243 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RJF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47270b2f68061cdcfac7df314a73fc28a8ef94afd242cca455e97cfe33cfcde0 +size 291609 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RL.csv new file mode 100644 index 0000000..de873b9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:317bb373a0ff69c7da127f129ca669e3eb6041b02679a64cd98d6e9e0da8f7df +size 286278 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RMD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RMD.csv new file mode 100644 index 0000000..e2b6b2e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RMD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:953886262bdf1b902a1c3c56c0a5551e260c6ea122bdf1ab0c3d795bf2b2921b +size 287782 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROK.csv new file mode 100644 index 0000000..0864a2f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91c40a90c99e50de48d8b966a35b84b454fa4a475a112c944fb3fb6d7ed80c05 +size 289767 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROL.csv new file mode 100644 index 0000000..1bd7807 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:63f480d2adaa10c8b3a2e3a92f0942ae07a805887685893048cf58ff2cba65f7 +size 295404 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROP.csv new file mode 100644 index 0000000..2a24555 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0cb36eebde924f5bec7eec7fdf89fd423bb5d860b5d245a6f713cfbdfb657b3e +size 286364 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROST.csv new file mode 100644 index 0000000..4474891 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ROST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1889c968bdcae47d2abdd6bec263d8ddfbed01bce597ed7b66a0bf6aa738a836 +size 292575 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RSG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RSG.csv new file mode 100644 index 0000000..ca04078 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RSG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4785b7963100a7aa08a3b9cb62c776de69b4141c200b5d6188739482f6195ddb +size 289010 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RTX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RTX.csv new file mode 100644 index 0000000..021a1d5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RTX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:549a961cf473fb29b7e41c42e30568f41d66a15f63e51ab56336e157aa3a89f3 +size 288957 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/RVTY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RVTY.csv new file mode 100644 index 0000000..0a37a04 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/RVTY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7b56731853ef758769ad7412f9de1c60cb014e0ef50857c3c2639ebeba76f15 +size 289652 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBAC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBAC.csv new file mode 100644 index 0000000..8565045 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBAC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:207d2d66702dc02185f33ce95add37f977c1fbb65810e8395a42ec29349a7c9f +size 292441 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBUX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBUX.csv new file mode 100644 index 0000000..9acaa40 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SBUX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39f7ff0468ee8bb3c9f4b891d7c2b0c8ea2f959cf40d7384d1b5f6ec93484716 +size 290796 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SCHW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SCHW.csv new file mode 100644 index 0000000..64127b7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SCHW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e926b2d0e0a0d0c46313bd1b94e8444f2588ddd74cd26326fb8523f47d26d6d4 +size 291679 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SHW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SHW.csv new file mode 100644 index 0000000..2ba3ab9 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SHW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2384987d8f4f10651a15045c59582ad075da028ea80b4c06c110561fc7cef4e +size 291301 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SJM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SJM.csv new file mode 100644 index 0000000..f90edb7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SJM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8eb95900212e834e83a08ddbf9e7d031a5e3fbff9094a29d42fde7e29e591af +size 292472 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SLB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SLB.csv new file mode 100644 index 0000000..79cd47a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SLB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:483a19cbcb5c2998c1f6948af89ca35deb6da48dd68fe936549306aded46d70c +size 289430 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SMCI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SMCI.csv new file mode 100644 index 0000000..4526c0a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SMCI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:538e73f64f32d329f7b459cf7a9499c079545b7e4e1dfcc5a4137f5ba56592f5 +size 281215 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNA.csv new file mode 100644 index 0000000..946707d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c78462dd923ac9da7c5aea83c555104839fd87b287e13666774939edcb291312 +size 289809 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNPS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNPS.csv new file mode 100644 index 0000000..463b14c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SNPS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:62c9c50048d522148f86ed19bc2b5317d2c30b29242422ed4661497c66a82fd8 +size 286623 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SO.csv new file mode 100644 index 0000000..3953465 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1939876fbb11081a45258de3544aaa76c1476e5aabe93b095df1c9b35b8febd +size 286019 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPG.csv new file mode 100644 index 0000000..705d2d1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e023bed69df8fc7ea16ef99b2fba33ee7a4a8f9f3e8ddb55c36dc0a22313a466 +size 291472 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPGI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPGI.csv new file mode 100644 index 0000000..549f297 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SPGI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a8689ba08db8fc2435f081d15171fd042308b947e1b7687132246399ba0bea1 +size 290765 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SRE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SRE.csv new file mode 100644 index 0000000..d0b9fa5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SRE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f50e14e193c21824870e0b7ee7a492cc08326f7fa8169e64d0dd1847e9385ff +size 287690 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/STE.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STE.csv new file mode 100644 index 0000000..dcf78f1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STE.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:608556a23afddc6332d3ab58b7a612ba7f9dc989d558bee97f00857d0068a3d8 +size 288261 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/STLD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STLD.csv new file mode 100644 index 0000000..7d259e1 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STLD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4e08bc1f61c1dd0c7539b97a547095cb0f2a784cfeab24abb30b6c43ca0166c +size 294416 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/STT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STT.csv new file mode 100644 index 0000000..3e73270 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:125cd8ae7a2d2dfa78b3b5d64de8371f6d7eb3bf5d2ab735f3c980ed336902f3 +size 285657 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/STX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STX.csv new file mode 100644 index 0000000..53068bb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2d91511636cfbc5aef214001869ffd38904b2b4c05877062194a1026733289d +size 287864 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/STZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STZ.csv new file mode 100644 index 0000000..0b0308b --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/STZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:150a48a037b03f0158b3d54e7231ce30c387137a5e8b37336b7db7c200e9b751 +size 289277 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWK.csv new file mode 100644 index 0000000..468a030 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35cc4c3cb203c6f213026cb6627f70804bae61e06dc1d1d7df95e990ecf5ddf7 +size 290193 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWKS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWKS.csv new file mode 100644 index 0000000..f44c830 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SWKS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06b3600d3eff6633ef8a53501b3fe3218e00f107339fb4867b5a2af66776ce84 +size 289948 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYF.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYF.csv new file mode 100644 index 0000000..76c4255 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYF.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00770a1b46a4b80b2baa929526f901dc9bbe95c97b94687c2e84afe159fd685e +size 292108 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYK.csv new file mode 100644 index 0000000..19f2bc3 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a4b3e49578f1feec69f47c011879ce27e77f012d9529e565c3fbd5ea3d39c90 +size 288929 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYY.csv new file mode 100644 index 0000000..f47e0db --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/SYY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3de83f1ae71dc83cdb908341b9b36c004f658e7fd27526d8bb5a3c39075cd57 +size 286637 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/T.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/T.csv new file mode 100644 index 0000000..ea04373 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/T.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ca4cd6cc3ae665c1efbf3a410460ccbe2bcc6506a186b238aaef32ca4c330a3 +size 296427 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TAP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TAP.csv new file mode 100644 index 0000000..e77b874 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TAP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f841e0670ef036e8f7c8e0b1993c7984d3308f01d5826f6c76c3d289f42273e +size 287224 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDG.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDG.csv new file mode 100644 index 0000000..d7f1717 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDG.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:311ada9310efcec4d7259fc955390b70008092d0960b654cf2d8ea81ed87cf5d +size 281560 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDY.csv new file mode 100644 index 0000000..3feb102 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TDY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1b7c9991b5a5e1babf71014aadbae3ffd2ba35071dd595a3694cb1bf28dc34b5 +size 285281 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TECH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TECH.csv new file mode 100644 index 0000000..0280b9f --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TECH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27009d59e4a9df746937a0be3df702bb14e5836f122ff49968da7e7f8b20a3c9 +size 290901 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TEL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TEL.csv new file mode 100644 index 0000000..dc9ea65 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TEL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7a753afa44fe4c978a6378e708f8f756bc2bc97dae40c48ad4d79521c398ec2 +size 288400 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TER.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TER.csv new file mode 100644 index 0000000..8e533bb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TER.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:856729d8ce67db92b2da052258da3d12b2e8f33e33f6e7c3d0e871ec201f309c +size 290676 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFC.csv new file mode 100644 index 0000000..6eda9bb --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:525f379c4a5021956bdc57e0c0171a347f53f8a49420f22cc314f5e4d01b2b9f +size 290976 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFX.csv new file mode 100644 index 0000000..8abc578 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TFX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ca83c0c0a4161a2ba907ef35f295de9e640e91a4eb07ea8da60288af5f6eb79 +size 288702 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TGT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TGT.csv new file mode 100644 index 0000000..899d203 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TGT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:524db90c0dc8b3d8a33b8cb9891a74ce4cf6d24ffa2cc03b91a223c0a5e4415c +size 288784 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TJX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TJX.csv new file mode 100644 index 0000000..a5685cc --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TJX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3e62e991bea884a53e3c1cf453559742a4b5dcc50cb30bd289483e0104b2dd4a +size 289013 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMO.csv new file mode 100644 index 0000000..41cc6fc --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49900d905b9e7e387946f3513cc53978e4d3c7f4c517d28aac15fff36df54635 +size 285900 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMUS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMUS.csv new file mode 100644 index 0000000..054f974 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TMUS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ebe949b2ccdcd61650a157b018e829b9bcc0a624f8a208ed89ef05fc8588d822 +size 291723 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TPR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TPR.csv new file mode 100644 index 0000000..03c6d82 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TPR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:554c4aecdb303825535edf55f7cb64d07b2091f0a27c7421b481606252feb6d8 +size 291539 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRGP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRGP.csv new file mode 100644 index 0000000..05704aa --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRGP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d03545fa89dddc219b908e199afa2f87f4cbb413b917ac6a1e771e7976bf0807 +size 291253 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRMB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRMB.csv new file mode 100644 index 0000000..a5cc55c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRMB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32a0b0168fb613fe4d13d666436b91cf8b35952b79338cae62135be222d8af43 +size 290455 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TROW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TROW.csv new file mode 100644 index 0000000..2e97e99 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TROW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88e1a9bda5325c8cc5de565496bdccc77abe513e8ad96afa1767da09666600ba +size 292100 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRV.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRV.csv new file mode 100644 index 0000000..fe930e4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TRV.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1c95db4ae64e61e8d516137c1b5e14f1efda51b7f06288e2dabc4771568ae7f1 +size 293165 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSCO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSCO.csv new file mode 100644 index 0000000..cad3669 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSCO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3415b92e77736ce713c8795c57a4cf6ae7462504704bd658c0cf15f74ce859bb +size 289896 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSLA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSLA.csv new file mode 100644 index 0000000..3a9db0c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSLA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1e5c1d9a554ce7ce443d307af31545717328e2a45ab2ff2180481b1c44a7b0a +size 300654 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSN.csv new file mode 100644 index 0000000..35c61ca --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TSN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3bcd98e96eaf3979c7f1ff47bd2808a4f8a33372a7f7987cd1b644da8637deca +size 286592 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TT.csv new file mode 100644 index 0000000..3384fe7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc0768838ab91f4564b8cc88b0a2f1e35b1f5d6559c4baf79c3124f7692203d2 +size 289629 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TTWO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TTWO.csv new file mode 100644 index 0000000..0716dea --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TTWO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69c07e98a137c73721a5f4ad240a6333762050034d1a894571b965b65abb3412 +size 292744 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXN.csv new file mode 100644 index 0000000..d430e2a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a5e3cb678118bf17dbd1e68e4e5136c44cfae86a7bf8c3b8749601d751af7f4c +size 290446 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXT.csv new file mode 100644 index 0000000..002ecc6 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TXT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96043a8ab9c25438c1f8917789767a65d834a7d81f165a018328ef11b8888221 +size 286375 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/TYL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TYL.csv new file mode 100644 index 0000000..15d8198 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/TYL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14b344107922c5b43840f271b4592d4b1fb114d99c0e2e9f74ccdf775c4d562c +size 285853 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UAL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UAL.csv new file mode 100644 index 0000000..8228ab4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UAL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5072a9b6fe41cc4b926321d426a90de737d21159f06853aef1c1b8ede0336685 +size 287290 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UBER.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UBER.csv new file mode 100644 index 0000000..a8e7d64 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UBER.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8c64aca651ebc5bd19e6efe79d25dc127612460ea693dd89fb646ad5d9887f9 +size 189481 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UDR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UDR.csv new file mode 100644 index 0000000..3cd53ed --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UDR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d39685805fa20fefb7ea38a3b9267703b79bd1a6044996c10fbef1b25497f5cf +size 291821 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UHS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UHS.csv new file mode 100644 index 0000000..24a0619 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UHS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d77b3e952b0534aa6881fa3a9abc7957c59498ba55a046d2ea12952e2754f961 +size 292128 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ULTA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ULTA.csv new file mode 100644 index 0000000..1a45890 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ULTA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0c80a4498fc1ca358c261b2b9edc300fb214f01fae47663a2fbde8b0fe9f575e +size 285975 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNH.csv new file mode 100644 index 0000000..3714b09 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba20dea898ec8dd64d0f12bec51cd0c2dd961d9371b5343018c48b2588f3562f +size 286598 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNP.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNP.csv new file mode 100644 index 0000000..e0fdb2d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UNP.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:074739f708c02ad7cf857f0bf82f0a3545e0f2c8a1db9fbc8b59d96222691820 +size 291226 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/UPS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UPS.csv new file mode 100644 index 0000000..77ffc56 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/UPS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1803ff609e833a1a391488a6962331a4655e7f9e1f4dccda578cd6d6f0ed7cb1 +size 291627 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/URI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/URI.csv new file mode 100644 index 0000000..ef85aa5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/URI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b07f0f2e501372112bdf254255dafa1c50fa593290cf1796fe1e89aeecc8ba6 +size 285990 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/USB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/USB.csv new file mode 100644 index 0000000..1679d7a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/USB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90f49f4b4c629951682e4408120e858aa8236b172f7f9a860ec86d444aea7954 +size 290992 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/V.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/V.csv new file mode 100644 index 0000000..f190d14 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/V.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:20c0e1c4950cdfe0ff66a964be493f440d53000a45aadeeae15cd42e2cee76f7 +size 284164 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VICI.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VICI.csv new file mode 100644 index 0000000..2db7c17 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VICI.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed955533043ddfc99e9d295e35d5cff8dd8c98b461f514bf85cb78563984dc49 +size 224641 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VLO.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VLO.csv new file mode 100644 index 0000000..11c4af7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VLO.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f656d054aef1efcd4adf092d03f4e00b2ab56933432f9216262248d779e48ae +size 288025 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VMC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VMC.csv new file mode 100644 index 0000000..6263c24 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VMC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:915112e578c4ffd0f8161c46c945f0d97a26854cbbcc2b855967e8b91624ea1b +size 289788 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSK.csv new file mode 100644 index 0000000..6fa3214 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:28dc649772f5a745b9f0dda0146997bcbfdf5299d7e935fdd93b4189f924150f +size 291250 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSN.csv new file mode 100644 index 0000000..6b9e46c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRSN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f1a6a5a0cc5ffe647058dca25108eabe9b051ae57e46de7b085d930c20626ad +size 290756 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRTX.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRTX.csv new file mode 100644 index 0000000..7ad5568 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VRTX.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa69acab66b9b25e978e7f4f08b4a7c017ccb8fc1a2af5b753dd1a2e81fb0992 +size 288834 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VST.csv new file mode 100644 index 0000000..db81fa5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6cbf839e9c9aeefcc5b0c66eb6d7d65956e5b2579e3e36ad612231f340b526ec +size 250462 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTR.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTR.csv new file mode 100644 index 0000000..af18c85 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTR.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bf0a6381aa74a9c3a29f7cae8528d533191c4164b8d67ab14530ed10c7d15a4 +size 289079 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTRS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTRS.csv new file mode 100644 index 0000000..3b2d1d5 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VTRS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec1c48a3b8723e955c0305f8d1d0ec39850bcfbc09cba8048d3b442e066c416a +size 294369 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/VZ.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VZ.csv new file mode 100644 index 0000000..c218d34 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/VZ.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3c2abac27bab01cd77aceb90805fe94be4ecdcc511c01140a9d363db51263f0 +size 289749 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAB.csv new file mode 100644 index 0000000..da69e11 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66a09b8463c06e376b1b88539379880e6aa7cd79e79e38ea0126e727c74a7526 +size 283983 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAT.csv new file mode 100644 index 0000000..3d69183 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WAT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c2e913189d5dd8d007de706795d14e39bd8cd52b9645b51a6e0b6f84beb7c05f +size 288667 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBA.csv new file mode 100644 index 0000000..7a33f6c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca869fa92394400ebdb960dfe1aeba3f986867840a50117dc11807c0833b826c +size 288588 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBD.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBD.csv new file mode 100644 index 0000000..b42a11c --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WBD.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:18a9da6764a1f3ed6aa6b11a502ac5cbf5f6fa7edf2eeffcadc04c595e1a2055 +size 292791 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WDC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WDC.csv new file mode 100644 index 0000000..67facb7 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WDC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e4d029ae072a8ec1e36a4fb71f508d7fb044b4552698734646292852e43feb6 +size 286977 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WEC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WEC.csv new file mode 100644 index 0000000..75401fd --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WEC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b4301a9ba70f18ec6ce499d412f9da8cb536738e033d95c449b55d2378aa40dc +size 287231 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WELL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WELL.csv new file mode 100644 index 0000000..9336dc0 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WELL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93d91883b01485f5b1b44e3a326ca72e6c9e7b9a69af99ef922af3edcc015a30 +size 287827 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WFC.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WFC.csv new file mode 100644 index 0000000..c76d810 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WFC.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da561b933a2d3ae3b644c7e3337c354bebc856b85639bcc46463fbb2c1e3baed +size 293024 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WM.csv new file mode 100644 index 0000000..acca388 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac1938247b2c3a8497def8e1f6a3f9403b33f6627b61760e9b4a489864d1e7bf +size 287361 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMB.csv new file mode 100644 index 0000000..932f851 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1431e9aafd667767ef8ca3573105451d50c4c9e7f5368b997b92db452029012 +size 294199 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMT.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMT.csv new file mode 100644 index 0000000..e156f7e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WMT.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29fdf7fb81597653ccb1fa7fbeee7b6ab531f6506b3734307b0f7bb12143489e +size 297500 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRB.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRB.csv new file mode 100644 index 0000000..086f42a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRB.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d271a2ba40ed82cd3468cc645561377fe6c825e45035fa54824b86b0dd02e963 +size 292769 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRK.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRK.csv new file mode 100644 index 0000000..db30b83 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WRK.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cdaf6a8392955102ce252df9a788406382b3f152ec6a02adefe07325d5b38eb9 +size 279598 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WST.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WST.csv new file mode 100644 index 0000000..61d3717 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WST.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d23ff784aa7f9242f9eca5992a8ef552a673e3a767568dd14a5f857eaae48e78 +size 285895 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WTW.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WTW.csv new file mode 100644 index 0000000..71e515e --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WTW.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a53231bbea7b5eaab8f7b9e1a700a8886463d7d2d2e8b3fc97ed5c31429bb6a +size 291686 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WY.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WY.csv new file mode 100644 index 0000000..c1ffd93 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WY.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:204a66443a697af66eb928b9ccdc41c246a8936899c9fb1ba3678162f06ce58b +size 290228 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/WYNN.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WYNN.csv new file mode 100644 index 0000000..9330481 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/WYNN.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84369ad1ffb21c0c258e237f60de75170281c59f4a442044b7cba7ceb82c7752 +size 289071 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/XEL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XEL.csv new file mode 100644 index 0000000..f930231 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XEL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78a48831ae3cc9692a543a6c212e278aa9b1368573a3b8b329f29e939136c34b +size 289239 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/XOM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XOM.csv new file mode 100644 index 0000000..d499668 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XOM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b80f9f9638032b18608718d055bbbdfcd35f539b37946bd38ed90d188abf3bce +size 289779 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/XYL.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XYL.csv new file mode 100644 index 0000000..84cd00a --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/XYL.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:534b2f77b3a9b0d8a46d39eebde57ecac7094a17c0ae928f16f168ab2b979cd7 +size 287863 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/YUM.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/YUM.csv new file mode 100644 index 0000000..4bb9a50 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/YUM.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2cf881750226088d4bde8cf93d08459b28012a46472ef2a0855dd0512f6a9bd8 +size 291203 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBH.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBH.csv new file mode 100644 index 0000000..f9ac48d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBH.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:248e55b832052b4aa3b5da99c7ebb09ad933efaaf982817be2e2efce6d97b4f5 +size 297242 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBRA.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBRA.csv new file mode 100644 index 0000000..a06c6a4 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZBRA.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2ae6031fd293a9fdbdc311ec3fe9772e2bd46439148905e4047c4fd65a058233 +size 286648 diff --git a/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZTS.csv b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZTS.csv new file mode 100644 index 0000000..aa7bd2d --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/dataset/tickets/ZTS.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba4078234713cfc06ed2d14ded4ea8e606f44cd02721dea1e8f7ccb0ce57e8c3 +size 290197 From 8b0b6a0502bf32ec469fbf2854b0205278233e95 Mon Sep 17 00:00:00 2001 From: NolanM Date: Tue, 18 Jun 2024 01:21:34 -0400 Subject: [PATCH 05/12] Upload notebook yahoo finance --- ...kbook Yahoo Retrieve Data-checkpoint.ipynb | 331 +++++ .../Workbook Yahoo Retrieve Data.ipynb | 1206 +---------------- 2 files changed, 371 insertions(+), 1166 deletions(-) create mode 100644 BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb diff --git a/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb b/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb new file mode 100644 index 0000000..546c118 --- /dev/null +++ b/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb @@ -0,0 +1,331 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "id": "4e86daf8-e0cb-4767-bb8a-f8cf46a10fbe", + "metadata": {}, + "outputs": [], + "source": [ + "from pyspark.sql.types import StructType, StructField, StringType\n", + "from pyspark.sql import SparkSession\n", + "from dotenv import load_dotenv\n", + "from datetime import datetime\n", + "import yfinance as yf\n", + "import pandas as pd\n", + "import os\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "postgres_v = os.getenv(\"POSTGRES_VERSION\")\n", + "postgres_url = os.getenv(\"POSTGRES_URL\")\n", + "postgres_user = os.getenv(\"POSTGRES_USER\")\n", + "postgres_pass = os.getenv(\"POSTGRES_PASSWORD\")\n", + "postgres_table = os.getenv(\"POSTGRES_TABLE\")\n", + "format_file = os.getenv(\"FORMAT_FILE\")\n", + "_mode = os.getenv(\"MODE\")\n", + "\n", + "config_ = postgres_v\n", + "\n", + "column_1_name = os.getenv(\"COLUMN_1\")\n", + "column_2_name = os.getenv(\"COLUMN_2\")\n", + "column_3_name = os.getenv(\"COLUMN_3\")\n", + "column_4_name = os.getenv(\"COLUMN_4\")\n", + "column_5_name = os.getenv(\"COLUMN_5\")\n", + "column_6_name = os.getenv(\"COLUMN_6\")\n", + "column_7_name = os.getenv(\"COLUMN_7\")\n", + "column_8_name = os.getenv(\"COLUMN_8\")\n", + "\n", + "list_remove = ['GEV','SOLV','VLTO','BF.B','BRK.B']\n", + "\n", + "class ListSAndP500:\n", + " def __init__(self):\n", + " \"\"\"\n", + " Initialize the ListSAndP500 class\n", + "\n", + " Attributes:\n", + " tickers_string (list): A list of stock symbols in string format\n", + " tickers_list (list): A list of stock symbols in list format\n", + "\n", + " \"\"\"\n", + " _tickers = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0]\n", + " _tickers = _tickers.Symbol.to_list()\n", + " self.tickers_string = [i.replace('.','-') for i in _tickers]\n", + " _tickers_list_transform_ = [i if i not in list_remove else False for i in _tickers]\n", + " self.tickers_list = [i for i in _tickers_list_transform_ if i]\n", + " \n", + "list_of_symbols__ = ListSAndP500().tickers_list\n", + "\n", + "class YahooFinance:\n", + " def __init__(self, list_of_symbols, start, end):\n", + " self.schema = StructType([\n", + " StructField(column_1_name, StringType(), True),\n", + " StructField(column_2_name, StringType(), True),\n", + " StructField(column_3_name, StringType(), True),\n", + " StructField(column_4_name, StringType(), True),\n", + " StructField(column_5_name, StringType(), True),\n", + " StructField(column_6_name, StringType(), True),\n", + " StructField(column_7_name, StringType(), True),\n", + " StructField(column_8_name, StringType(), True)\n", + " ])\n", + "\n", + " self.symbols = list_of_symbols\n", + " self.interval = '1d'\n", + " self.start = start\n", + " self.end = end\n", + " self.results = self.process_data()\n", + "\n", + " def process_data(self):\n", + " \"\"\"\n", + " Process the historical stock data for the stock symbols\n", + " \"\"\"\n", + " data = self.get_data()\n", + " return self.transform_data(data)\n", + "\n", + " def get_data(self):\n", + " \"\"\"\n", + " Get historical stock data from Yahoo Finance API using yfinance library\n", + "\n", + " Returns:\n", + " DataFrame: A DataFrame containing historical stock data\n", + " \"\"\"\n", + " try:\n", + " data = yf.download(\n", + " self.symbols,\n", + " start=self.start,\n", + " end=self.end,\n", + " interval=self.interval,\n", + " ignore_tz=True,\n", + " threads=5,\n", + " timeout=60,\n", + " progress=True\n", + " )\n", + " return data\n", + " except Exception as e:\n", + " print(f\"Error downloading data: {e}\")\n", + " return None\n", + "\n", + " def transform_data(self, df):\n", + " \"\"\"\n", + " Transform the historical stock data into a format that can be stored in a database FactPrices table\n", + "\n", + " Args:\n", + " df (DataFrame): A DataFrame containing historical stock data\n", + "\n", + " Returns:\n", + " DataFrame: A DataFrame containing transformed historical stock data with the following columns:\n", + " - stock_id (str): The stock symbol\n", + " - date (str): The date of the stock data\n", + " - open (float): The opening price of the stock\n", + " - high (float): The highest price of the stock\n", + " - low (float): The lowest price of the stock\n", + " - close (float): The closing price of the stock\n", + " - volume (int): The volume of the stock\n", + " - adjusted_close (float): The adjusted closing price of the stock\n", + "\n", + " \"\"\"\n", + " # Reset the index to turn the MultiIndex into columns\n", + " df = df.reset_index()\n", + "\n", + " # Create a list to store transformed records\n", + " records = []\n", + "\n", + " # Iterate over each row and stock symbol\n", + " for index, row in df.iterrows():\n", + " date = row[('Date', '')]\n", + " for stock in self.symbols:\n", + " try:\n", + " record = {\n", + " column_1_name: stock,\n", + " column_2_name: date,\n", + " column_3_name: row[('Open', stock)],\n", + " column_4_name: row[('High', stock)],\n", + " column_5_name: row[('Low', stock)],\n", + " column_6_name: row[('Close', stock)],\n", + " column_7_name: row[('Volume', stock)],\n", + " column_8_name: row[('Adj Close', stock)]\n", + " }\n", + " records.append(record)\n", + " except KeyError as e:\n", + " print(f\"KeyError: {e} for stock: {stock} on date: {date}\")\n", + "\n", + " # Convert the list of records into a DataFrame\n", + " return pd.DataFrame(records)" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "7a0cd6a5-3629-42ae-886d-03e872242276", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[*********************100%%**********************] 498 of 498 completed\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " stock_id date open high low close \\\n", + "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", + "1 AOS 2015-01-02 28.309999 28.415001 27.775000 28.004999 \n", + "2 ABT 2015-01-02 45.250000 45.450001 44.639999 44.900002 \n", + "3 ABBV 2015-01-02 65.440002 66.400002 65.440002 65.889999 \n", + "4 ACN 2015-01-02 89.669998 90.089996 88.430000 88.839996 \n", + "\n", + " volume adjusted_close \n", + "0 2531214.0 92.933594 \n", + "1 1540200.0 24.154337 \n", + "2 3216600.0 37.481434 \n", + "3 5086100.0 44.314426 \n", + "4 2021300.0 75.950943 \n" + ] + } + ], + "source": [ + "transformed_data = YahooFinance(list_of_symbols__, '2015-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", + "print(transformed_data.head())" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e3613f13-de97-4dae-b6c7-2b7408806ec0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "1185240" + ] + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "len(transformed_data)" + ] + }, + { + "cell_type": "markdown", + "id": "59c52b0a-1f7f-4ec8-b976-a691e8c49f8f", + "metadata": {}, + "source": [ + "## Transform Data" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "94ecfc50-b102-4561-b691-51d14a717ad4", + "metadata": {}, + "outputs": [], + "source": [ + "total_data_dict = dict()\n", + "fileroute=\"./dataset/\"\n", + "fileroute_ticket=\"./dataset/tickets/\"\n", + "transformed_data.to_csv(fileroute + \"Summary.csv\", index=False, encoding='utf-8')\n", + "\n", + "for i in range(len(list_of_symbols__)):\n", + " filtered_data = transformed_data[transformed_data['stock_id'] == list_of_symbols__[i]]\n", + " filtered_data = filtered_data.reset_index()\n", + " total_data_dict[list_of_symbols__[i]] = filtered_data\n", + " filtered_data.to_csv(fileroute_ticket + list_of_symbols__[i] + \".csv\", index=False, encoding='utf-8')" + ] + }, + { + "cell_type": "markdown", + "id": "b85ff026-0996-47ca-ab1c-0d1552dd6936", + "metadata": {}, + "source": [ + "## Checking the missing data" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "bd7367a7-8c9f-4a71-832b-26e0b3d469b2", + "metadata": {}, + "outputs": [], + "source": [ + "unique_dates = pd.DatetimeIndex(transformed_data['date'].unique())" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "1f3edde9-b968-47d2-8ad3-bf08f9f3870e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "1077\n", + " missing_dates\n", + "0 2015-01-01\n", + "1 2015-01-03\n", + "2 2015-01-04\n", + "3 2015-01-10\n", + "4 2015-01-11\n", + "5 2015-01-17\n", + "6 2015-01-18\n", + "7 2015-01-19\n", + "8 2015-01-24\n", + "9 2015-01-25\n", + "10 2015-01-31\n", + "11 2015-02-01\n", + "12 2015-02-07\n", + "13 2015-02-08\n", + "14 2015-02-14\n", + "15 2015-02-15\n", + "16 2015-02-16\n", + "17 2015-02-21\n", + "18 2015-02-22\n", + "19 2015-02-28\n", + "3457\n" + ] + } + ], + "source": [ + "complete_dates = pd.date_range(start='2015-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", + "\n", + "missing_dates = complete_dates.difference(unique_dates)\n", + "\n", + "# Convert missing dates to a DataFrame for display\n", + "missing_dates_df = pd.DataFrame(missing_dates, columns=['missing_dates'])\n", + "\n", + "print(len(missing_dates_df))\n", + "print(missing_dates_df.head(20))\n", + "print(len(complete_dates))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb index 6243d73..546c118 100644 --- a/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb +++ b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "4e86daf8-e0cb-4767-bb8a-f8cf46a10fbe", "metadata": {}, "outputs": [], @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "7a0cd6a5-3629-42ae-886d-03e872242276", "metadata": {}, "outputs": [ @@ -178,11 +178,11 @@ "4 ACN 2015-01-02 89.669998 90.089996 88.430000 88.839996 \n", "\n", " volume adjusted_close \n", - "0 2531214.0 92.933624 \n", + "0 2531214.0 92.933594 \n", "1 1540200.0 24.154337 \n", "2 3216600.0 37.481434 \n", - "3 5086100.0 44.314434 \n", - "4 2021300.0 75.950920 \n" + "3 5086100.0 44.314426 \n", + "4 2021300.0 75.950943 \n" ] } ], @@ -193,17 +193,17 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "e3613f13-de97-4dae-b6c7-2b7408806ec0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1184742" + "1185240" ] }, - "execution_count": 7, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" } @@ -212,213 +212,44 @@ "len(transformed_data)" ] }, + { + "cell_type": "markdown", + "id": "59c52b0a-1f7f-4ec8-b976-a691e8c49f8f", + "metadata": {}, + "source": [ + "## Transform Data" + ] + }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 18, "id": "94ecfc50-b102-4561-b691-51d14a717ad4", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "\n", - "\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
stock_iddateopenhighlowclosevolumeadjusted_close
0MMM2015-01-02137.717392138.026749136.061874137.1739202531214.092.933624
498MMM2015-01-05136.287628136.822739133.846161134.0802614416708.090.837677
996MMM2015-01-06134.464890134.924744131.889633132.6504974224272.089.869041
1494MMM2015-01-07133.695648134.013382132.892975133.6120453685235.090.520477
1992MMM2015-01-08134.322739136.864548134.214050136.8143773758908.092.689987
...........................
1182252MMM2024-06-10100.430000101.839996100.279999100.6600043507600.0100.660004
1182750MMM2024-06-11100.099998101.47000199.230003101.3200002831500.0101.320000
1183248MMM2024-06-12102.620003103.680000100.760002101.2099993704600.0101.209999
1183746MMM2024-06-13102.019997102.800003100.739998101.5400015034700.0101.540001
1184244MMM2024-06-14100.500000101.41999899.309998100.9000022685000.0100.900002
\n", - "

2379 rows × 8 columns

\n", - "
" - ], - "text/plain": [ - " stock_id date open high low close \\\n", - "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", - "498 MMM 2015-01-05 136.287628 136.822739 133.846161 134.080261 \n", - "996 MMM 2015-01-06 134.464890 134.924744 131.889633 132.650497 \n", - "1494 MMM 2015-01-07 133.695648 134.013382 132.892975 133.612045 \n", - "1992 MMM 2015-01-08 134.322739 136.864548 134.214050 136.814377 \n", - "... ... ... ... ... ... ... \n", - "1182252 MMM 2024-06-10 100.430000 101.839996 100.279999 100.660004 \n", - "1182750 MMM 2024-06-11 100.099998 101.470001 99.230003 101.320000 \n", - "1183248 MMM 2024-06-12 102.620003 103.680000 100.760002 101.209999 \n", - "1183746 MMM 2024-06-13 102.019997 102.800003 100.739998 101.540001 \n", - "1184244 MMM 2024-06-14 100.500000 101.419998 99.309998 100.900002 \n", - "\n", - " volume adjusted_close \n", - "0 2531214.0 92.933624 \n", - "498 4416708.0 90.837677 \n", - "996 4224272.0 89.869041 \n", - "1494 3685235.0 90.520477 \n", - "1992 3758908.0 92.689987 \n", - "... ... ... \n", - "1182252 3507600.0 100.660004 \n", - "1182750 2831500.0 101.320000 \n", - "1183248 3704600.0 101.209999 \n", - "1183746 5034700.0 101.540001 \n", - "1184244 2685000.0 100.900002 \n", - "\n", - "[2379 rows x 8 columns]" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], + "source": [ + "total_data_dict = dict()\n", + "fileroute=\"./dataset/\"\n", + "fileroute_ticket=\"./dataset/tickets/\"\n", + "transformed_data.to_csv(fileroute + \"Summary.csv\", index=False, encoding='utf-8')\n", + "\n", + "for i in range(len(list_of_symbols__)):\n", + " filtered_data = transformed_data[transformed_data['stock_id'] == list_of_symbols__[i]]\n", + " filtered_data = filtered_data.reset_index()\n", + " total_data_dict[list_of_symbols__[i]] = filtered_data\n", + " filtered_data.to_csv(fileroute_ticket + list_of_symbols__[i] + \".csv\", index=False, encoding='utf-8')" + ] + }, + { + "cell_type": "markdown", + "id": "b85ff026-0996-47ca-ab1c-0d1552dd6936", + "metadata": {}, "source": [ - "filtered_data = transformed_data[transformed_data['stock_id'] == list_of_symbols__[0]]\n", - "filtered_data" + "## Checking the missing data" ] }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 13, "id": "bd7367a7-8c9f-4a71-832b-26e0b3d469b2", "metadata": {}, "outputs": [], @@ -428,7 +259,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 14, "id": "1f3edde9-b968-47d2-8ad3-bf08f9f3870e", "metadata": {}, "outputs": [ @@ -436,7 +267,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "1075\n", + "1077\n", " missing_dates\n", "0 2015-01-01\n", "1 2015-01-03\n", @@ -458,7 +289,7 @@ "17 2015-02-21\n", "18 2015-02-22\n", "19 2015-02-28\n", - "3454\n" + "3457\n" ] } ], @@ -474,963 +305,6 @@ "print(missing_dates_df.head(20))\n", "print(len(complete_dates))" ] - }, - { - "cell_type": "code", - "execution_count": 47, - "id": "4b32d672-8b27-455a-a6f9-91b508244571", - "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[* 2%% ] 9 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$TYL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NFLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PODD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SLB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AJG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AVY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ALL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NEE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[*** 7%% ] 33 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$KEYS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CBRE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AVGO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GPN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DHI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VRSK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$COP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$INCY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$STT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ADM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$REG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HRL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FAST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TGT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CHD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MHK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KIM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[***** 10%% ] 48 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$NVR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CRL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CMS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LOW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MMM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SJM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DLR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WEC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BALL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ECL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SPGI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SYK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$APD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SNA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[****** 12%% ] 60 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$CHTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TSCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VLO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ADI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SMCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TPR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PHM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KLAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BWA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[******** 17%% ] 83 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$ISRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MKTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ABBV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TMO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MCHP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SWK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DVA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IEX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SBUX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HIG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MPC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$APH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BAX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CDNS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[********** 20%% ] 102 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$MET: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CSGP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CMI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MCK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BKR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NOW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AIZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PAYC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ILMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AFL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ROP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MKC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MGM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IFF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IBM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[********** 21%% ] 106 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$TXN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BDX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SRE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[************ 24%% ] 118 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$GOOGL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PANW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WBD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AKAM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KDP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DUK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LLY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[************ 24%% ] 119 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$WFC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[************ 26%% ] 131 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$ORLY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LVS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GOOG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HLT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HCA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ELV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[************** 29%% ] 143 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$WYNN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NOC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EVRG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$INTU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$F: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VTRS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GLW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CAG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$XOM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ULTA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[************** 29%% ] 144 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$NWS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[*************** 31%% ] 152 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$TTWO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SBAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GRMN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BMY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DFS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EOG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[*************** 31%% ] 155 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$FE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RJF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[***************** 35%% ] 176 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$MOH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FANG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AXON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PNW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HOLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SWKS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KEY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JNPR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ZTS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JKHY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ACGL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TRV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SHW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[******************* 40%% ] 197 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$MTCH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CSCO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EXPD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BRO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CHRW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SYF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MRO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NDAQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RVTY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ALGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DPZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TFX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AVB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NEM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EQR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AME: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ATO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PFE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[********************* 43%% ] 216 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$ADSK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$APTV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AXP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NDSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ADP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RSG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IRM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DTE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CPAY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$OKE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BIO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WDC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$USB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PEG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UNP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************47%% ] 232 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$CPRT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TSLA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$META: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GNRC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CTSH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NXPI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PRU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$V: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TFC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CFG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TJX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FDS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TMUS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************51%% ] 252 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$CCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$J: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ALLE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EFX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FSLR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PGR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EIX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$REGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$D: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$OXY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JBHT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$STX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VRTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CVS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************53%% ] 262 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$ROL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$C: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ADBE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DGX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BLDR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$INTC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MPWR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DRI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************57%%* ] 282 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$BKNG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GEN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PLD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WTW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LIN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$STLD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DECK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ED: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CLX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LMT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FICO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LYV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BLK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CDW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NVDA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HUBB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GWW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************61%%*** ] 305 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$DHR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PAYX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TER: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PNC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ICE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CAH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CMG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MAA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$COO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EXC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KMI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CRM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TECH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TDY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ESS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NWSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HSY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ETN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NSC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ALB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IVZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MSCI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************65%%***** ] 324 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$QCOM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WBA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NTRS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ROST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AEP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SYY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SNPS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AWK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AIG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MSFT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DIS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$OMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HSIC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RHI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ITW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MLM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************68%%******* ] 340 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$YUM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PEP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DOV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TDG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CNP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RMD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMAT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MDLZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HES: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CVX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FTNT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PCG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JNJ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************73%%********* ] 364 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$EW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MTD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LRCX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BSX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$STE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TRMB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TXT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ABT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CMA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ANET: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ORCL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BXP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$POOL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ENPH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$O: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UPS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CME: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BBWI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$T: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************73%%********* ] 366 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$FMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************78%%*********** ] 387 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$FI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EXPE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CPT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GPC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PCAR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ETR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$XEL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LHX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TEL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$URI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BIIB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CBOE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MMC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EQT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$L: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HPQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************80%%************ ] 396 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$JPM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FITB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BAC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LYB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ANSS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FDX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LULU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HUM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************82%%************* ] 407 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$FFIV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IQV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$STZ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EXR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AON: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TAP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PNR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MU: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PKG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LKQ: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************84%%************** ] 420 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$PTC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CTLT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EQIX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ODFL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NCLH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LNT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UDR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ROK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CTRA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WELL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LUV: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************89%%***************** ] 443 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$MNST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EBAY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMZN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NTAP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$COF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NUE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BBY: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FRT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ZBH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$IDXX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ARE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PFG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EMR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$NKE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CNC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$VRSN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AAL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TRGP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CINF: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$K: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DOC: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************94%%******************* ] 466 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$CL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SPG: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CTAS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DXCM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMGN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CMCSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$EPAM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WAB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UHS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TROW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$RTX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PPL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HII: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$WRB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MAR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PWR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$SCHW: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$KMX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$COR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$DLTR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CZR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MCD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$FCX: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$ACN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************95%%******************** ] 475 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$DVN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MDT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PARA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AEE: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$HBAN: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MTB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[**********************99%%**********************] 494 of 498 completed" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$ZBRA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$LDOS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMP: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$COST: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AMCR: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$UNH: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$APA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$BK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AZO: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$CPB: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PM: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$A: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$XYL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$AAPL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$TT: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$PSA: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MRK: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$GILD: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$JBL: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "[*********************100%%**********************] 498 of 498 completed\n", - "\n", - "498 Failed downloads:\n", - "['TYL', 'NFLX', 'PODD', 'SLB', 'EMN', 'PH', 'AJG', 'AVY', 'ALL', 'NEE', 'KEYS', 'AMT', 'CBRE', 'AVGO', 'GPN', 'DHI', 'ES', 'VRSK', 'COP', 'INCY', 'STT', 'LEN', 'ADM', 'REG', 'BEN', 'HRL', 'FAST', 'NRG', 'TGT', 'CHD', 'MHK', 'KIM', 'NVR', 'CRL', 'CMS', 'LOW', 'MMM', 'IT', 'SJM', 'DLR', 'WEC', 'BALL', 'ECL', 'SPGI', 'SYK', 'APD', 'SNA', 'CHTR', 'TSCO', 'VLO', 'ADI', 'SMCI', 'TPR', 'WY', 'PHM', 'KLAC', 'BWA', 'ISRG', 'MKTX', 'ABBV', 'TMO', 'MCHP', 'SWK', 'DD', 'DVA', 'IEX', 'SBUX', 'HIG', 'MPC', 'APH', 'DE', 'JCI', 'KO', 'LH', 'BAX', 'MAS', 'CDNS', 'MET', 'CSGP', 'CMI', 'MCK', 'BKR', 'NOW', 'RCL', 'AIZ', 'PAYC', 'ILMN', 'HAS', 'AFL', 'ROP', 'MKC', 'MGM', 'IFF', 'AES', 'RL', 'IBM', 'TXN', 'BX', 'BDX', 'SRE', 'GOOGL', 'PANW', 'WBD', 'VTR', 'MA', 'AKAM', 'WST', 'KDP', 'DUK', 'BG', 'LLY', 'WFC', 'ORLY', 'LVS', 'GOOG', 'HLT', 'HCA', 'ELV', 'PG', 'MCO', 'GIS', 'DG', 'IP', 'WYNN', 'NOC', 'EVRG', 'INTU', 'VTRS', 'GLW', 'CAG', 'CSX', 'XOM', 'ULTA', 'NWS', 'TTWO', 'SBAC', 'GRMN', 'WMB', 'BMY', 'DFS', 'KMB', 'EOG', 'FE', 'RJF', 'MOH', 'FANG', 'HST', 'WM', 'AXON', 'WMT', 'RF', 'PNW', 'HOLX', 'CF', 'BA', 'CAT', 'SWKS', 'KEY', 'JNPR', 'ZTS', 'JKHY', 'ACGL', 'TRV', 'ON', 'SHW', 'MTCH', 'CSCO', 'EXPD', 'BRO', 'CHRW', 'SYF', 'MRO', 'NDAQ', 'RVTY', 'ALGN', 'MOS', 'DPZ', 'TFX', 'AVB', 'NEM', 'EQR', 'AME', 'ATO', 'EL', 'PFE', 'ADSK', 'APTV', 'EG', 'PPG', 'AXP', 'NDSN', 'ADP', 'RSG', 'IRM', 'DTE', 'GS', 'CPAY', 'OKE', 'BIO', 'WDC', 'USB', 'PEG', 'UNP', 'CPRT', 'TSLA', 'META', 'GNRC', 'EA', 'CTSH', 'NXPI', 'PRU', 'V', 'TFC', 'CFG', 'CCL', 'TJX', 'FDS', 'TMUS', 'CCI', 'J', 'ALLE', 'EFX', 'FSLR', 'PGR', 'EIX', 'GE', 'REGN', 'D', 'KR', 'IPG', 'OXY', 'JBHT', 'FIS', 'GL', 'STX', 'VRTX', 'HAL', 'CVS', 'ROL', 'C', 'ADBE', 'DGX', 'BLDR', 'GD', 'INTC', 'MPWR', 'CB', 'DRI', 'BKNG', 'GEN', 'PLD', 'WTW', 'LIN', 'STLD', 'DECK', 'ED', 'CLX', 'LMT', 'FICO', 'LYV', 'BLK', 'NI', 'CDW', 'NVDA', 'HUBB', 'GWW', 'DHR', 'PAYX', 'TER', 'PNC', 'ICE', 'CAH', 'CMG', 'MAA', 'COO', 'EXC', 'KMI', 'CRM', 'TECH', 'TDY', 'ESS', 'NWSA', 'HSY', 'ETN', 'NSC', 'ALB', 'VMC', 'IVZ', 'WAT', 'MSCI', 'QCOM', 'WBA', 'NTRS', 'ROST', 'AEP', 'PSX', 'SYY', 'DAL', 'SNPS', 'AWK', 'AIG', 'MSFT', 'DIS', 'OMC', 'HSIC', 'RHI', 'ITW', 'MLM', 'YUM', 'PEP', 'DOV', 'TDG', 'CNP', 'RMD', 'AMAT', 'MDLZ', 'CI', 'HES', 'CVX', 'UAL', 'FTNT', 'PCG', 'JNJ', 'MO', 'EW', 'MTD', 'LRCX', 'BSX', 'STE', 'TRMB', 'AMD', 'TXT', 'ABT', 'CMA', 'ANET', 'ORCL', 'CE', 'BXP', 'POOL', 'ENPH', 'O', 'UPS', 'CME', 'BBWI', 'T', 'FMC', 'HD', 'FI', 'EXPE', 'CPT', 'GPC', 'VZ', 'HON', 'PCAR', 'ETR', 'XEL', 'LHX', 'TEL', 'URI', 'BIIB', 'TSN', 'CBOE', 'MMC', 'EQT', 'SO', 'L', 'HPQ', 'JPM', 'FITB', 'BAC', 'LYB', 'ANSS', 'FDX', 'LULU', 'HUM', 'FFIV', 'IQV', 'STZ', 'EXR', 'AON', 'TAP', 'PNR', 'MU', 'PKG', 'LKQ', 'PTC', 'CTLT', 'EQIX', 'ODFL', 'NCLH', 'LNT', 'UDR', 'ROK', 'CTRA', 'WELL', 'LUV', 'MNST', 'EBAY', 'AMZN', 'NTAP', 'COF', 'NUE', 'BBY', 'FRT', 'ZBH', 'IDXX', 'ARE', 'PFG', 'EMR', 'NKE', 'CNC', 'VRSN', 'AAL', 'TRGP', 'CINF', 'K', 'AOS', 'DOC', 'CL', 'SPG', 'CTAS', 'DXCM', 'AMGN', 'CMCSA', 'EPAM', 'WAB', 'UHS', 'TROW', 'RTX', 'PPL', 'GM', 'HII', 'WRB', 'MAR', 'PWR', 'SCHW', 'KMX', 'COR', 'DLTR', 'CZR', 'MCD', 'FCX', 'ACN', 'DVN', 'BR', 'MDT', 'PARA', 'AEE', 'HBAN', 'MTB', 'ZBRA', 'LDOS', 'AMP', 'COST', 'AMCR', 'UNH', 'APA', 'BK', 'AZO', 'CPB', 'PM', 'A', 'XYL', 'AAPL', 'TT', 'PSA', 'MRK', 'GILD', 'JBL', 'MS', 'MSI']: YFPricesMissingError('$%ticker%: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)')\n", - "['CARR', 'HPE', 'QRVO', 'ETSY', 'FOXA', 'ABNB', 'DOW', 'PYPL', 'UBER', 'WRK', 'DAY', 'KHC', 'INVH', 'LW', 'VST', 'FTV', 'CTVA', 'VICI', 'MRNA', 'IR', 'KVUE', 'HWM', 'FOX', 'GEHC', 'CEG', 'OTIS']: YFChartError(\"%ticker%: Data doesn't exist for startDate = 1420088400, endDate = 1420088400\")\n", - "['F']: Y%ticker%PricesMissingError('$%ticker%: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)')\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "$MS: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "$MSI: possibly delisted; No price data found (1d 2015-01-01 -> 2015-01-01)\n", - "Empty DataFrame\n", - "Columns: [(Adj Close, A), (Adj Close, AAL), (Adj Close, AAPL), (Adj Close, ABBV), (Adj Close, ABNB), (Adj Close, ABT), (Adj Close, ACGL), (Adj Close, ACN), (Adj Close, ADBE), (Adj Close, ADI), (Adj Close, ADM), (Adj Close, ADP), (Adj Close, ADSK), (Adj Close, AEE), (Adj Close, AEP), (Adj Close, AES), (Adj Close, AFL), (Adj Close, AIG), (Adj Close, AIZ), (Adj Close, AJG), (Adj Close, AKAM), (Adj Close, ALB), (Adj Close, ALGN), (Adj Close, ALL), (Adj Close, ALLE), (Adj Close, AMAT), (Adj Close, AMCR), (Adj Close, AMD), (Adj Close, AME), (Adj Close, AMGN), (Adj Close, AMP), (Adj Close, AMT), (Adj Close, AMZN), (Adj Close, ANET), (Adj Close, ANSS), (Adj Close, AON), (Adj Close, AOS), (Adj Close, APA), (Adj Close, APD), (Adj Close, APH), (Adj Close, APTV), (Adj Close, ARE), (Adj Close, ATO), (Adj Close, AVB), (Adj Close, AVGO), (Adj Close, AVY), (Adj Close, AWK), (Adj Close, AXON), (Adj Close, AXP), (Adj Close, AZO), (Adj Close, BA), (Adj Close, BAC), (Adj Close, BALL), (Adj Close, BAX), (Adj Close, BBWI), (Adj Close, BBY), (Adj Close, BDX), (Adj Close, BEN), (Adj Close, BG), (Adj Close, BIIB), (Adj Close, BIO), (Adj Close, BK), (Adj Close, BKNG), (Adj Close, BKR), (Adj Close, BLDR), (Adj Close, BLK), (Adj Close, BMY), (Adj Close, BR), (Adj Close, BRO), (Adj Close, BSX), (Adj Close, BWA), (Adj Close, BX), (Adj Close, BXP), (Adj Close, C), (Adj Close, CAG), (Adj Close, CAH), (Adj Close, CARR), (Adj Close, CAT), (Adj Close, CB), (Adj Close, CBOE), (Adj Close, CBRE), (Adj Close, CCI), (Adj Close, CCL), (Adj Close, CDNS), (Adj Close, CDW), (Adj Close, CE), (Adj Close, CEG), (Adj Close, CF), (Adj Close, CFG), (Adj Close, CHD), (Adj Close, CHRW), (Adj Close, CHTR), (Adj Close, CI), (Adj Close, CINF), (Adj Close, CL), (Adj Close, CLX), (Adj Close, CMA), (Adj Close, CMCSA), (Adj Close, CME), (Adj Close, CMG), ...]\n", - "Index: []\n", - "\n", - "[0 rows x 2988 columns]\n" - ] - } - ], - "source": [ - "data = yf.download(list_of_symbols__, start=\"2015-01-01\", end=\"2015-01-01\")\n", - "print(data.head())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "5c70e521-61d3-40eb-998f-cfdcd7c452f7", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From 6ea85be59fa541c283dd425fc564a4a72fb7a9e8 Mon Sep 17 00:00:00 2001 From: NolanM Date: Sat, 22 Jun 2024 00:45:28 -0400 Subject: [PATCH 06/12] Upload The Batch Process and main page --- .env | 1 + .gitignore | 3 + 1_HomePage.py | 105 +++++ BatchProcess/DataSource/AlphaVantage/.env | 18 + .../Retrieve Data Alpha Vantage.ipynb | 56 +++ .../DataSource/Binance/Untitled.ipynb | 141 ++++++ .../btcusdt_data_alpha_vantage_daily.csv | 3 + .../ListSnP500/ListSnP500Collect.py | 14 +- ...kbook Yahoo Retrieve Data-checkpoint.ipynb | 404 +++++++++++++++--- .../Workbook Yahoo Retrieve Data.ipynb | 404 +++++++++++++++--- .../YahooFinance/YahooFinances_Services.py | 23 +- Database/.env | 6 + Database/PostGreSQLInteraction.py | 171 ++++++-- {BatchProcess => RealTimeProcess}/Consumer.py | 0 {BatchProcess => RealTimeProcess}/Producer.py | 0 .../BatchProcess.py => pages/2_Admin.py | 0 styles/main.css | 43 ++ 17 files changed, 1230 insertions(+), 162 deletions(-) create mode 100644 .env create mode 100644 1_HomePage.py create mode 100644 BatchProcess/DataSource/AlphaVantage/.env create mode 100644 BatchProcess/DataSource/AlphaVantage/Retrieve Data Alpha Vantage.ipynb create mode 100644 BatchProcess/DataSource/Binance/Untitled.ipynb create mode 100644 BatchProcess/DataSource/Binance/btcusdt_data_alpha_vantage_daily.csv create mode 100644 Database/.env rename {BatchProcess => RealTimeProcess}/Consumer.py (100%) rename {BatchProcess => RealTimeProcess}/Producer.py (100%) rename BatchProcess/BatchProcess.py => pages/2_Admin.py (100%) create mode 100644 styles/main.css diff --git a/.env b/.env new file mode 100644 index 0000000..003d94a --- /dev/null +++ b/.env @@ -0,0 +1 @@ +CSS_DIR="styles/main.css" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 61d18e2..aa0b59c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ myenv venv +.ipynb_checkpoints +/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints +__pycache__ diff --git a/1_HomePage.py b/1_HomePage.py new file mode 100644 index 0000000..3dd0530 --- /dev/null +++ b/1_HomePage.py @@ -0,0 +1,105 @@ +from datetime import datetime +import time + +import pandas as pd +from BatchProcess.DataSource.YahooFinance.YahooFinances_Services import YahooFinance +from BatchProcess.DataSource.ListSnP500.ListSnP500Collect import ListSAndP500 +from multiprocessing.pool import ThreadPool +from dotenv import load_dotenv +from pathlib import Path +import streamlit as st +import os + +from Database.PostGreSQLInteraction import StockDatabaseManager + +load_dotenv(override=True) +pool = ThreadPool(processes=6) + +current_dir = Path(__file__).parent if "__file__" in locals() else Path.cwd() +css_file = current_dir / os.getenv("CSS_DIR") +defaut_start_date = "2014-01-01" + +st.set_page_config(page_title="Home Page", page_icon=":house:") +st.sidebar.header("Quantitative Trading Project") +st.title("Welcome to the Home Page") +st.markdown( + """ + + """, unsafe_allow_html=True) + +# --- LOAD CSS --- +with open(css_file) as f: + st.markdown("".format(f.read()), unsafe_allow_html=True) + + +@st.cache_data(ttl=1800) +def retrieve_list_ticket(): + list_of_symbols__ = ListSAndP500().tickers_list + return list_of_symbols__ + + +PROCESS_TIME = 90 # seconds +_list_of_symbols = retrieve_list_ticket() + + +@st.cache_data(ttl=1800) +def retrieve_data_from_yahoo(list_of_symbols, date_from, date_to): + transformed_data = YahooFinance(list_of_symbols, date_from, date_to) + return transformed_data.process_data() + + +@st.cache_data(ttl=1800) +def update_datebase_func(list_of_symbols=retrieve_list_ticket(), date_from=defaut_start_date, date_to=datetime.now().strftime('%Y-%m-%d')): + st.write("Database Updated") + # Retrieve Data from yahoo finance + async_result = pool.apply_async( + retrieve_data_from_yahoo, args=(list_of_symbols, date_from, date_to,)) + bar = st.progress(0) + per = PROCESS_TIME / 100 + for i in range(100): + time.sleep(per) + bar.progress(i + 1) + df = async_result.get() + return df + + +@st.cache_data(ttl=1800) +def process_data_retrieve_from_database(df_in, list_of_symbols__): + total_data_dict = dict() + for i in range(len(list_of_symbols__)): + filtered_data = df_in[df_in['stock_id'] == list_of_symbols__[i]] + filtered_data = filtered_data.reset_index() + total_data_dict[list_of_symbols__[i]] = filtered_data + return total_data_dict + + +update_database = st.button("Update Database") +if update_database: + df_historical_yahoo = update_datebase_func( + list_of_symbols=_list_of_symbols) + total_data_dict_ = process_data_retrieve_from_database( + df_historical_yahoo, _list_of_symbols) + db_manager = StockDatabaseManager() + db_manager.create_schema_and_tables(_list_of_symbols) + for key, value in total_data_dict_.items(): + if isinstance(value, pd.DataFrame): + db_manager.insert_data(key, value) + all_data = db_manager.fetch_all_data() + for table, df in all_data.items(): + st.write(f"Data for table {table}:") + st.write(df.head(10)) + db_manager.close_connection() + st.write("Done") + # st.write(total_data_dict_) + + +List500, Historical_data, IndayData_RealTime, news, reddit_news = st.tabs( + ["List 500 S&P", "Historical data", "In Day Data", "Top News", "Reddit News"]) + +with List500: + st.write("List of 500 S&P") + st.write(_list_of_symbols) diff --git a/BatchProcess/DataSource/AlphaVantage/.env b/BatchProcess/DataSource/AlphaVantage/.env new file mode 100644 index 0000000..57f11e5 --- /dev/null +++ b/BatchProcess/DataSource/AlphaVantage/.env @@ -0,0 +1,18 @@ +# Postgres Configuration +POSTGRES_VERSION="org.postgresql:postgresql:42.2.20" +POSTGRES_URL="jdbc:postgresql://localhost:5432/postgres" +POSTGRES_USER="postgres" +POSTGRES_PASSWORD="admin" +POSTGRES_TABLE="FactPrices" + +FORMAT_FILE="jdbc" +MODE="append" + +COLUMN_1="stock_id" +COLUMN_2="date" +COLUMN_3="open" +COLUMN_4="high" +COLUMN_5="low" +COLUMN_6="close" +COLUMN_7="volume" +COLUMN_8="adjusted_close" \ No newline at end of file diff --git a/BatchProcess/DataSource/AlphaVantage/Retrieve Data Alpha Vantage.ipynb b/BatchProcess/DataSource/AlphaVantage/Retrieve Data Alpha Vantage.ipynb new file mode 100644 index 0000000..43b51b7 --- /dev/null +++ b/BatchProcess/DataSource/AlphaVantage/Retrieve Data Alpha Vantage.ipynb @@ -0,0 +1,56 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "de71fd75-6dc9-4a45-952e-81732c3d8e26", + "metadata": {}, + "outputs": [], + "source": [ + "from alpha_vantage.timeseries import TimeSeries\n", + "import pandas as pd\n", + "from dotenv import load_dotenv\n", + "import os\n", + "\n", + "load_dotenv(override=True)\n", + "\n", + "api_key = os.getenv('alpha_vantage_api')\n", + "\n", + "symbol = 'AAPL'\n", + "\n", + "# Initialize the TimeSeries object with API key\n", + "ts = TimeSeries(key=api_key, output_format='pandas')\n", + "\n", + "# Specify the function to get daily financial data\n", + "# 'Time Series (Daily)' returns daily data\n", + "data, meta_data = ts.get_daily(symbol=symbol, outputsize='full')\n", + "\n", + "# Extract and display the relevant information\n", + "df = data.rename(columns={'1. open': 'Open', '2. high': 'High', '3. low': 'Low', '4. close': 'Close', '5. volume': 'Volume'})\n", + "df.index = pd.to_datetime(df.index)\n", + "#df.to_csv(f'{symbol.lower()}_data_alpha_vantage_daily.csv')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/BatchProcess/DataSource/Binance/Untitled.ipynb b/BatchProcess/DataSource/Binance/Untitled.ipynb new file mode 100644 index 0000000..198affe --- /dev/null +++ b/BatchProcess/DataSource/Binance/Untitled.ipynb @@ -0,0 +1,141 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "id": "8013c201-9c54-4fdb-b23b-d161e7454cb6", + "metadata": {}, + "outputs": [], + "source": [ + "url = 'https://www.alphavantage.co/query?function=TIME_SERIES_INTRADAY&symbol=IBM&interval=5min&apikey=demo'\n", + "r = requests.get(url)\n", + "data = r.json()\n", + "\n", + "print(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0c7b6a09-63a2-4ff0-b71f-141378b40450", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Empty DataFrame\n", + "Columns: [1. open, 2. high, 3. low, 4. close, 5. volume]\n", + "Index: []\n" + ] + } + ], + "source": [ + "from alpha_vantage.timeseries import TimeSeries\n", + "import pandas as pd\n", + "\n", + "# Replace with your actual Alpha Vantage API key\n", + "\n", + "\n", + "ts = TimeSeries(key=api_key, output_format='pandas')\n", + "\n", + "symbol = 'AAPL' # Replace with your desired symbol\n", + "date_str = '2023-06-19' # Replace with your desired date\n", + "\n", + "# Fetch intraday data\n", + "data, meta_data = ts.get_intraday(symbol=symbol, interval='1d', outputsize='full')\n", + "\n", + "# Convert index to datetime\n", + "data.index = pd.to_datetime(data.index)\n", + "\n", + "# Filter data for the specific date\n", + "data = data[data.index.date == pd.to_datetime(date_str).date()]\n", + "\n", + "print(data)\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "a028f032-c284-45a4-a637-a11489b50df3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "{'Meta Data': {'1. Information': 'Daily Prices (open, high, low, close) and Volumes', '2. Symbol': 'IBM', '3. Last Refreshed': '2024-06-18', '4. Output Size': 'Compact', '5. Time Zone': 'US/Eastern'}, 'Time Series (Daily)': {'2024-06-18': {'1. open': '170.0000', '2. high': '170.7500', '3. low': '168.3800', '4. close': '170.5500', '5. volume': '3386442'}, '2024-06-17': {'1. open': '168.7600', '2. high': '169.7200', '3. low': '167.5000', '4. close': '169.5000', '5. volume': '3239815'}, '2024-06-14': {'1. open': '168.2900', '2. high': '169.4700', '3. low': '167.2300', '4. close': '169.2100', '5. volume': '2777717'}, '2024-06-13': {'1. open': '169.0100', '2. high': '169.5900', '3. low': '168.3350', '4. close': '169.1200', '5. volume': '3525717'}, '2024-06-12': {'1. open': '171.3500', '2. high': '172.4700', '3. low': '168.1010', '4. close': '169.0000', '5. volume': '3522698'}, '2024-06-11': {'1. open': '169.9800', '2. high': '170.0000', '3. low': '166.8100', '4. close': '169.3200', '5. volume': '2951251'}, '2024-06-10': {'1. open': '169.5500', '2. high': '170.7600', '3. low': '168.8800', '4. close': '170.3800', '5. volume': '3444684'}, '2024-06-07': {'1. open': '168.1800', '2. high': '171.3050', '3. low': '168.0600', '4. close': '170.0100', '5. volume': '3475495'}, '2024-06-06': {'1. open': '167.3800', '2. high': '168.4400', '3. low': '166.8000', '4. close': '168.2000', '5. volume': '2207263'}, '2024-06-05': {'1. open': '166.4100', '2. high': '167.7900', '3. low': '165.7800', '4. close': '167.3800', '5. volume': '3049377'}, '2024-06-04': {'1. open': '164.6000', '2. high': '166.4000', '3. low': '163.8800', '4. close': '165.8100', '5. volume': '2594203'}, '2024-06-03': {'1. open': '166.5400', '2. high': '166.7800', '3. low': '163.5300', '4. close': '165.2800', '5. volume': '2776058'}, '2024-05-31': {'1. open': '165.7000', '2. high': '166.9700', '3. low': '163.8400', '4. close': '166.8500', '5. volume': '4905002'}, '2024-05-30': {'1. open': '165.5600', '2. high': '166.7300', '3. low': '164.2300', '4. close': '165.6300', '5. volume': '3852963'}, '2024-05-29': {'1. open': '168.0000', '2. high': '168.6300', '3. low': '166.2100', '4. close': '167.0500', '5. volume': '4206576'}, '2024-05-28': {'1. open': '170.4400', '2. high': '171.0850', '3. low': '168.6500', '4. close': '169.6600', '5. volume': '2629645'}, '2024-05-24': {'1. open': '171.4800', '2. high': '172.0100', '3. low': '170.2100', '4. close': '170.8900', '5. volume': '2587829'}, '2024-05-23': {'1. open': '175.3900', '2. high': '175.4600', '3. low': '170.4350', '4. close': '170.6700', '5. volume': '3341335'}, '2024-05-22': {'1. open': '173.3900', '2. high': '174.9900', '3. low': '172.7600', '4. close': '173.6900', '5. volume': '3294900'}, '2024-05-21': {'1. open': '169.9400', '2. high': '174.9700', '3. low': '169.9400', '4. close': '173.4700', '5. volume': '6459800'}, '2024-05-20': {'1. open': '169.0000', '2. high': '170.1600', '3. low': '168.3800', '4. close': '169.9200', '5. volume': '2726261'}, '2024-05-17': {'1. open': '168.9700', '2. high': '169.1100', '3. low': '167.3300', '4. close': '169.0300', '5. volume': '2956387'}, '2024-05-16': {'1. open': '168.2600', '2. high': '169.6300', '3. low': '167.7900', '4. close': '168.9700', '5. volume': '3492267'}, '2024-05-15': {'1. open': '167.9400', '2. high': '168.3500', '3. low': '167.3400', '4. close': '168.2600', '5. volume': '4468823'}, '2024-05-14': {'1. open': '167.8600', '2. high': '168.1300', '3. low': '166.4800', '4. close': '167.3600', '5. volume': '2600967'}, '2024-05-13': {'1. open': '167.5000', '2. high': '168.0600', '3. low': '166.7600', '4. close': '167.5600', '5. volume': '2414859'}, '2024-05-10': {'1. open': '167.1300', '2. high': '168.0700', '3. low': '166.3200', '4. close': '167.1500', '5. volume': '2255370'}, '2024-05-09': {'1. open': '167.5000', '2. high': '167.5500', '3. low': '165.8800', '4. close': '166.2700', '5. volume': '4266616'}, '2024-05-08': {'1. open': '168.0100', '2. high': '170.2600', '3. low': '167.9000', '4. close': '169.9000', '5. volume': '3522011'}, '2024-05-07': {'1. open': '169.0000', '2. high': '169.2900', '3. low': '167.9400', '4. close': '168.3800', '5. volume': '3155260'}, '2024-05-06': {'1. open': '166.5000', '2. high': '168.6700', '3. low': '166.3800', '4. close': '168.6100', '5. volume': '4222266'}, '2024-05-03': {'1. open': '165.0000', '2. high': '166.6100', '3. low': '164.9200', '4. close': '165.7100', '5. volume': '3400405'}, '2024-05-02': {'1. open': '164.3500', '2. high': '164.8800', '3. low': '162.6200', '4. close': '164.6900', '5. volume': '3829853'}, '2024-05-01': {'1. open': '165.6900', '2. high': '166.2700', '3. low': '164.3000', '4. close': '164.4300', '5. volume': '4030960'}, '2024-04-30': {'1. open': '166.4900', '2. high': '166.7600', '3. low': '165.2605', '4. close': '166.2000', '5. volume': '6011634'}, '2024-04-29': {'1. open': '167.4000', '2. high': '168.2200', '3. low': '166.2250', '4. close': '167.4300', '5. volume': '5263342'}, '2024-04-26': {'1. open': '167.5000', '2. high': '167.8700', '3. low': '165.7300', '4. close': '167.1300', '5. volume': '8983796'}, '2024-04-25': {'1. open': '168.2000', '2. high': '172.4500', '3. low': '165.6600', '4. close': '168.9100', '5. volume': '16702150'}, '2024-04-24': {'1. open': '183.1700', '2. high': '184.2900', '3. low': '181.4000', '4. close': '184.1000', '5. volume': '7616643'}, '2024-04-23': {'1. open': '182.7300', '2. high': '184.6800', '3. low': '179.0000', '4. close': '182.1900', '5. volume': '5950229'}, '2024-04-22': {'1. open': '182.4500', '2. high': '183.3150', '3. low': '180.4500', '4. close': '181.9000', '5. volume': '3076451'}, '2024-04-19': {'1. open': '182.4300', '2. high': '182.8000', '3. low': '180.5700', '4. close': '181.5800', '5. volume': '3037990'}, '2024-04-18': {'1. open': '182.3500', '2. high': '183.4600', '3. low': '180.1700', '4. close': '181.4700', '5. volume': '2886733'}, '2024-04-17': {'1. open': '184.1600', '2. high': '184.6700', '3. low': '181.7800', '4. close': '183.1000', '5. volume': '3003033'}, '2024-04-16': {'1. open': '185.5900', '2. high': '185.7100', '3. low': '182.8600', '4. close': '183.7500', '5. volume': '4473654'}, '2024-04-15': {'1. open': '185.5700', '2. high': '187.4800', '3. low': '180.8800', '4. close': '181.2500', '5. volume': '3528140'}, '2024-04-12': {'1. open': '184.0000', '2. high': '185.1699', '3. low': '181.6850', '4. close': '182.2700', '5. volume': '3547378'}, '2024-04-11': {'1. open': '186.0400', '2. high': '186.7950', '3. low': '184.5800', '4. close': '185.9000', '5. volume': '2861736'}, '2024-04-10': {'1. open': '187.4200', '2. high': '187.9150', '3. low': '185.5200', '4. close': '186.0400', '5. volume': '3081915'}, '2024-04-09': {'1. open': '190.5400', '2. high': '191.2500', '3. low': '186.6600', '4. close': '189.3100', '5. volume': '2790673'}, '2024-04-08': {'1. open': '189.2400', '2. high': '190.2400', '3. low': '188.9118', '4. close': '189.8200', '5. volume': '2673611'}, '2024-04-05': {'1. open': '188.5900', '2. high': '190.3200', '3. low': '188.0200', '4. close': '189.1400', '5. volume': '2012428'}, '2024-04-04': {'1. open': '192.0000', '2. high': '193.2800', '3. low': '187.3400', '4. close': '187.9400', '5. volume': '2924438'}, '2024-04-03': {'1. open': '188.6000', '2. high': '191.3500', '3. low': '188.4850', '4. close': '190.9000', '5. volume': '2818910'}, '2024-04-02': {'1. open': '189.1400', '2. high': '189.8000', '3. low': '187.6000', '4. close': '188.8800', '5. volume': '2689711'}, '2024-04-01': {'1. open': '190.0000', '2. high': '190.4600', '3. low': '188.5200', '4. close': '189.8300', '5. volume': '2362586'}, '2024-03-28': {'1. open': '190.9400', '2. high': '191.9299', '3. low': '190.3400', '4. close': '190.9600', '5. volume': '3742169'}, '2024-03-27': {'1. open': '189.6000', '2. high': '190.9600', '3. low': '188.6000', '4. close': '190.8000', '5. volume': '3693305'}, '2024-03-26': {'1. open': '189.0200', '2. high': '190.0000', '3. low': '188.5000', '4. close': '188.5000', '5. volume': '4229535'}, '2024-03-25': {'1. open': '190.2600', '2. high': '190.8200', '3. low': '188.7500', '4. close': '188.7900', '5. volume': '3718289'}, '2024-03-22': {'1. open': '192.0000', '2. high': '192.9850', '3. low': '190.5100', '4. close': '190.8400', '5. volume': '3988398'}, '2024-03-21': {'1. open': '193.0000', '2. high': '193.3700', '3. low': '190.0100', '4. close': '191.9000', '5. volume': '6013561'}, '2024-03-20': {'1. open': '192.8700', '2. high': '193.9800', '3. low': '191.3100', '4. close': '193.9600', '5. volume': '3238643'}, '2024-03-19': {'1. open': '191.4900', '2. high': '193.5800', '3. low': '190.2800', '4. close': '193.3400', '5. volume': '5317341'}, '2024-03-18': {'1. open': '191.7000', '2. high': '193.2300', '3. low': '190.3200', '4. close': '191.6900', '5. volume': '5410562'}, '2024-03-15': {'1. open': '191.9900', '2. high': '193.0573', '3. low': '190.7000', '4. close': '191.0700', '5. volume': '8828184'}, '2024-03-14': {'1. open': '196.9500', '2. high': '197.7480', '3. low': '192.1200', '4. close': '193.4300', '5. volume': '4102202'}, '2024-03-13': {'1. open': '197.5500', '2. high': '198.1000', '3. low': '195.3200', '4. close': '196.7000', '5. volume': '3960737'}, '2024-03-12': {'1. open': '192.4600', '2. high': '199.1800', '3. low': '192.1500', '4. close': '197.7800', '5. volume': '5862512'}, '2024-03-11': {'1. open': '195.0900', '2. high': '195.3800', '3. low': '190.8800', '4. close': '191.7300', '5. volume': '4712688'}, '2024-03-08': {'1. open': '196.0600', '2. high': '197.7700', '3. low': '194.3800', '4. close': '195.9500', '5. volume': '3943113'}, '2024-03-07': {'1. open': '197.5800', '2. high': '198.7300', '3. low': '196.1400', '4. close': '196.5400', '5. volume': '4604458'}, '2024-03-06': {'1. open': '193.5000', '2. high': '198.1300', '3. low': '192.9600', '4. close': '196.1600', '5. volume': '6945818'}, '2024-03-05': {'1. open': '192.0000', '2. high': '193.9400', '3. low': '190.5700', '4. close': '191.9500', '5. volume': '5653641'}, '2024-03-04': {'1. open': '187.7600', '2. high': '193.8980', '3. low': '187.6000', '4. close': '193.0600', '5. volume': '7938266'}, '2024-03-01': {'1. open': '185.4900', '2. high': '188.3800', '3. low': '185.1800', '4. close': '188.2000', '5. volume': '4018354'}, '2024-02-29': {'1. open': '186.1500', '2. high': '186.8495', '3. low': '184.6900', '4. close': '185.0300', '5. volume': '6458487'}, '2024-02-28': {'1. open': '184.6300', '2. high': '185.3700', '3. low': '183.5500', '4. close': '185.3000', '5. volume': '3216345'}, '2024-02-27': {'1. open': '184.1600', '2. high': '185.1300', '3. low': '182.6200', '4. close': '184.8700', '5. volume': '3641378'}, '2024-02-26': {'1. open': '185.6000', '2. high': '186.1250', '3. low': '184.0600', '4. close': '184.1300', '5. volume': '4620815'}, '2024-02-23': {'1. open': '184.9000', '2. high': '186.4550', '3. low': '184.5700', '4. close': '185.7200', '5. volume': '3433800'}, '2024-02-22': {'1. open': '182.4500', '2. high': '184.5500', '3. low': '181.9300', '4. close': '184.2100', '5. volume': '5078398'}, '2024-02-21': {'1. open': '182.5600', '2. high': '183.0300', '3. low': '178.7500', '4. close': '179.7000', '5. volume': '4728473'}, '2024-02-20': {'1. open': '187.6400', '2. high': '188.7700', '3. low': '183.0600', '4. close': '183.4400', '5. volume': '4247181'}, '2024-02-16': {'1. open': '186.6300', '2. high': '188.9500', '3. low': '185.9452', '4. close': '187.6400', '5. volume': '4842840'}, '2024-02-15': {'1. open': '183.6200', '2. high': '186.9800', '3. low': '183.6200', '4. close': '186.8700', '5. volume': '4714301'}, '2024-02-14': {'1. open': '185.0000', '2. high': '185.0000', '3. low': '182.2600', '4. close': '183.5700', '5. volume': '3173391'}, '2024-02-13': {'1. open': '184.2800', '2. high': '184.7700', '3. low': '182.3600', '4. close': '183.7000', '5. volume': '4290453'}, '2024-02-12': {'1. open': '185.9000', '2. high': '186.4800', '3. low': '184.0300', '4. close': '186.1600', '5. volume': '4724021'}, '2024-02-09': {'1. open': '184.4400', '2. high': '187.1800', '3. low': '183.8500', '4. close': '186.3400', '5. volume': '5064641'}, '2024-02-08': {'1. open': '182.6300', '2. high': '184.5500', '3. low': '181.4900', '4. close': '184.3600', '5. volume': '5161185'}, '2024-02-07': {'1. open': '183.3400', '2. high': '184.0200', '3. low': '182.6250', '4. close': '183.7400', '5. volume': '4841188'}, '2024-02-06': {'1. open': '183.5500', '2. high': '184.6800', '3. low': '183.0400', '4. close': '183.4100', '5. volume': '3338196'}, '2024-02-05': {'1. open': '185.5100', '2. high': '185.7800', '3. low': '183.2550', '4. close': '183.4200', '5. volume': '4379602'}, '2024-02-02': {'1. open': '187.1000', '2. high': '187.3900', '3. low': '185.6150', '4. close': '185.7900', '5. volume': '4055411'}, '2024-02-01': {'1. open': '183.6300', '2. high': '187.5100', '3. low': '182.7100', '4. close': '186.9000', '5. volume': '4669444'}, '2024-01-31': {'1. open': '187.0500', '2. high': '187.6500', '3. low': '183.1400', '4. close': '183.6600', '5. volume': '8876055'}, '2024-01-30': {'1. open': '187.7100', '2. high': '188.6500', '3. low': '186.7700', '4. close': '187.8700', '5. volume': '4575058'}, '2024-01-29': {'1. open': '187.4600', '2. high': '189.4600', '3. low': '186.0500', '4. close': '187.1400', '5. volume': '6107908'}, '2024-01-26': {'1. open': '191.3100', '2. high': '192.3896', '3. low': '186.1600', '4. close': '187.4200', '5. volume': '9895941'}}}\n" + ] + } + ], + "source": [ + "import requests\n", + "api_key = 'E51I8SW56CK2Z1NQ'\n", + "# replace the \"demo\" apikey below with your own key from https://www.alphavantage.co/support/#api-key\n", + "url = 'https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=IBM&apikey=E51I8SW56CK2Z1NQ'\n", + "r = requests.get(url)\n", + "data = r.json()\n", + "\n", + "print(data)" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "10abdb81-2011-4363-8d03-2124b4e30166", + "metadata": {}, + "outputs": [], + "source": [ + "from alpha_vantage.timeseries import TimeSeries\n", + "import pandas as pd\n", + "\n", + "# Replace 'YOUR_API_KEY' with your Alpha Vantage API key\n", + "api_key = \"E51I8SW56CK2Z1NQ\"\n", + "\n", + "# Set the symbol for the financial instrument you're interested in (e.g., 'BTCUSDT' for Bitcoin/US Dollar)\n", + "symbol = 'BTCUSDT'\n", + "\n", + "# Initialize the TimeSeries object with your API key\n", + "ts = TimeSeries(key=api_key, output_format='pandas')\n", + "\n", + "# Specify the function to get daily financial data\n", + "# 'Time Series (Daily)' returns daily data\n", + "data, meta_data = ts.get_daily(symbol=symbol, outputsize='full')\n", + "\n", + "# Extract and display the relevant information\n", + "df = data.rename(columns={'1. open': 'Open', '2. high': 'High', '3. low': 'Low', '4. close': 'Close', '5. volume': 'Volume'})\n", + "df.index = pd.to_datetime(df.index)\n", + "df.to_csv(f'{symbol.lower()}_data_alpha_vantage_daily.csv')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1d7f876a-bf74-447f-bba7-2315b8ee7616", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.8.0" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/BatchProcess/DataSource/Binance/btcusdt_data_alpha_vantage_daily.csv b/BatchProcess/DataSource/Binance/btcusdt_data_alpha_vantage_daily.csv new file mode 100644 index 0000000..2c62af7 --- /dev/null +++ b/BatchProcess/DataSource/Binance/btcusdt_data_alpha_vantage_daily.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f13a501ee1996d32e5f9253141f46a6a295b240deef0490f04561a067ae04b6b +size 76530 diff --git a/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py b/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py index d720d8f..7015fc1 100644 --- a/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py +++ b/BatchProcess/DataSource/ListSnP500/ListSnP500Collect.py @@ -1,6 +1,7 @@ import pandas as pd -list_remove = ['GEV','SOLV','VLTO','BF.B','BRK.B'] +list_remove = ['GEV', 'SOLV', 'VLTO', 'BF.B', 'BRK.B'] + class ListSAndP500: def __init__(self): @@ -12,12 +13,15 @@ def __init__(self): tickers_list (list): A list of stock symbols in list format """ - _tickers = pd.read_html('https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0] + _tickers = pd.read_html( + 'https://en.wikipedia.org/wiki/List_of_S%26P_500_companies')[0] _tickers = _tickers.Symbol.to_list() - self.tickers_string = [i.replace('.','-') for i in _tickers] - _tickers_list_transform_ = [i if i not in list_remove else False for i in _tickers] + self.tickers_string = [i.replace('.', '-') for i in _tickers] + _tickers_list_transform_ = [ + i if i not in list_remove else False for i in _tickers] self.tickers_list = [i for i in _tickers_list_transform_ if i] + """ Usage: list_of_symbols = ListSAndP500().tickers_list -""" \ No newline at end of file +""" diff --git a/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb b/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb index 546c118..986c0f4 100644 --- a/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb +++ b/BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints/Workbook Yahoo Retrieve Data-checkpoint.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "id": "4e86daf8-e0cb-4767-bb8a-f8cf46a10fbe", "metadata": {}, "outputs": [], @@ -65,8 +65,8 @@ " StructField(column_4_name, StringType(), True),\n", " StructField(column_5_name, StringType(), True),\n", " StructField(column_6_name, StringType(), True),\n", - " StructField(column_7_name, StringType(), True),\n", - " StructField(column_8_name, StringType(), True)\n", + " StructField(column_7_name, StringType(), True)\n", + " #StructField(column_8_name, StringType(), True)\n", " ])\n", "\n", " self.symbols = list_of_symbols\n", @@ -142,8 +142,8 @@ " column_4_name: row[('High', stock)],\n", " column_5_name: row[('Low', stock)],\n", " column_6_name: row[('Close', stock)],\n", - " column_7_name: row[('Volume', stock)],\n", - " column_8_name: row[('Adj Close', stock)]\n", + " column_7_name: row[('Volume', stock)]\n", + " #column_8_name: row[('Adj Close', stock)]\n", " }\n", " records.append(record)\n", " except KeyError as e:\n", @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "7a0cd6a5-3629-42ae-886d-03e872242276", "metadata": {}, "outputs": [ @@ -171,39 +171,39 @@ "output_type": "stream", "text": [ " stock_id date open high low close \\\n", - "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", - "1 AOS 2015-01-02 28.309999 28.415001 27.775000 28.004999 \n", - "2 ABT 2015-01-02 45.250000 45.450001 44.639999 44.900002 \n", - "3 ABBV 2015-01-02 65.440002 66.400002 65.440002 65.889999 \n", - "4 ACN 2015-01-02 89.669998 90.089996 88.430000 88.839996 \n", + "0 MMM 2014-01-02 115.426422 116.220734 115.058525 115.493309 \n", + "1 AOS 2014-01-02 26.965000 26.990000 26.535000 26.660000 \n", + "2 ABT 2014-01-02 38.090000 38.400002 38.000000 38.230000 \n", + "3 ABBV 2014-01-02 52.119999 52.330002 51.520000 51.980000 \n", + "4 ACN 2014-01-02 81.500000 81.919998 81.089996 81.129997 \n", "\n", - " volume adjusted_close \n", - "0 2531214.0 92.933594 \n", - "1 1540200.0 24.154337 \n", - "2 3216600.0 37.481434 \n", - "3 5086100.0 44.314426 \n", - "4 2021300.0 75.950943 \n" + " volume \n", + "0 3650312.0 \n", + "1 1297000.0 \n", + "2 4967500.0 \n", + "3 4569100.0 \n", + "4 2405400.0 \n" ] } ], "source": [ - "transformed_data = YahooFinance(list_of_symbols__, '2015-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", + "transformed_data = YahooFinance(list_of_symbols__, '2014-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", "print(transformed_data.head())" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "id": "e3613f13-de97-4dae-b6c7-2b7408806ec0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1185240" + "1311732" ] }, - "execution_count": 8, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -212,6 +212,304 @@ "len(transformed_data)" ] }, + { + "cell_type": "code", + "execution_count": 19, + "id": "69e16637-f9d7-4656-80b6-5f03f6f29c38", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stock_iddateopenhighlowclosevolume
1311581NVR2024-06-207507.5698247562.2998057422.3300787514.87988322500.0
1311303BKNG2024-06-203995.0000004004.3999023961.2800293972.080078211600.0
1311337CMG2024-06-203445.5800783445.5800783188.0000003214.419922844100.0
1311285AZO2024-06-202979.4699713029.8798832979.4699713008.229980287400.0
1311308AVGO2024-06-201803.4599611804.7500001722.2199711734.5600596595500.0
1311546MTD2024-06-201466.7700201470.7299801452.2700201456.589966119400.0
1311424FICO2024-06-201428.2500001428.6099851401.6700441412.760010138300.0
1311680TDG2024-06-201347.8699951349.0000001325.2600101329.670044208400.0
1311516LRCX2024-06-201091.9200441093.3900151050.2199711061.3100591461200.0
1311583ORLY2024-06-201059.5000001083.2399901059.5000001080.569946724300.0
1311628REGN2024-06-201038.4399411046.2900391028.0000001044.390015590500.0
1311659SMCI2024-06-20961.2899781014.020020900.320007917.64001513347900.0
1311375DECK2024-06-201008.0999761012.450012980.000000989.440002381700.0
1311708GWW2024-06-20921.809998927.710022913.630005915.289978186400.0
1311401LLY2024-06-20893.000000905.450012870.130005885.9899903357900.0
1311365COST2024-06-20871.309998873.849976860.559998862.4400021941100.0
1311511KLAC2024-06-20863.369995864.190002826.549988829.5900271281900.0
1311557MPWR2024-06-20846.000000848.450012819.630005825.330017649900.0
1311300BLK2024-06-20782.020020784.049988777.520020782.830017496800.0
1311409EQIX2024-06-20773.000000774.809998762.340027763.599976369600.0
\n", + "
" + ], + "text/plain": [ + " stock_id date open high low \\\n", + "1311581 NVR 2024-06-20 7507.569824 7562.299805 7422.330078 \n", + "1311303 BKNG 2024-06-20 3995.000000 4004.399902 3961.280029 \n", + "1311337 CMG 2024-06-20 3445.580078 3445.580078 3188.000000 \n", + "1311285 AZO 2024-06-20 2979.469971 3029.879883 2979.469971 \n", + "1311308 AVGO 2024-06-20 1803.459961 1804.750000 1722.219971 \n", + "1311546 MTD 2024-06-20 1466.770020 1470.729980 1452.270020 \n", + "1311424 FICO 2024-06-20 1428.250000 1428.609985 1401.670044 \n", + "1311680 TDG 2024-06-20 1347.869995 1349.000000 1325.260010 \n", + "1311516 LRCX 2024-06-20 1091.920044 1093.390015 1050.219971 \n", + "1311583 ORLY 2024-06-20 1059.500000 1083.239990 1059.500000 \n", + "1311628 REGN 2024-06-20 1038.439941 1046.290039 1028.000000 \n", + "1311659 SMCI 2024-06-20 961.289978 1014.020020 900.320007 \n", + "1311375 DECK 2024-06-20 1008.099976 1012.450012 980.000000 \n", + "1311708 GWW 2024-06-20 921.809998 927.710022 913.630005 \n", + "1311401 LLY 2024-06-20 893.000000 905.450012 870.130005 \n", + "1311365 COST 2024-06-20 871.309998 873.849976 860.559998 \n", + "1311511 KLAC 2024-06-20 863.369995 864.190002 826.549988 \n", + "1311557 MPWR 2024-06-20 846.000000 848.450012 819.630005 \n", + "1311300 BLK 2024-06-20 782.020020 784.049988 777.520020 \n", + "1311409 EQIX 2024-06-20 773.000000 774.809998 762.340027 \n", + "\n", + " close volume \n", + "1311581 7514.879883 22500.0 \n", + "1311303 3972.080078 211600.0 \n", + "1311337 3214.419922 844100.0 \n", + "1311285 3008.229980 287400.0 \n", + "1311308 1734.560059 6595500.0 \n", + "1311546 1456.589966 119400.0 \n", + "1311424 1412.760010 138300.0 \n", + "1311680 1329.670044 208400.0 \n", + "1311516 1061.310059 1461200.0 \n", + "1311583 1080.569946 724300.0 \n", + "1311628 1044.390015 590500.0 \n", + "1311659 917.640015 13347900.0 \n", + "1311375 989.440002 381700.0 \n", + "1311708 915.289978 186400.0 \n", + "1311401 885.989990 3357900.0 \n", + "1311365 862.440002 1941100.0 \n", + "1311511 829.590027 1281900.0 \n", + "1311557 825.330017 649900.0 \n", + "1311300 782.830017 496800.0 \n", + "1311409 763.599976 369600.0 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transformed_data_today = transformed_data.sort_values(by=['date', 'high','volume'],ascending=False)\n", + "transformed_data_today_highest = transformed_data_today.head(20)\n", + "transformed_data_today_highest" + ] + }, { "cell_type": "markdown", "id": "59c52b0a-1f7f-4ec8-b976-a691e8c49f8f", @@ -222,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "94ecfc50-b102-4561-b691-51d14a717ad4", "metadata": {}, "outputs": [], @@ -249,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "id": "bd7367a7-8c9f-4a71-832b-26e0b3d469b2", "metadata": {}, "outputs": [], @@ -259,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "id": "1f3edde9-b968-47d2-8ad3-bf08f9f3870e", "metadata": {}, "outputs": [ @@ -267,34 +565,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "1077\n", - " missing_dates\n", - "0 2015-01-01\n", - "1 2015-01-03\n", - "2 2015-01-04\n", - "3 2015-01-10\n", - "4 2015-01-11\n", - "5 2015-01-17\n", - "6 2015-01-18\n", - "7 2015-01-19\n", - "8 2015-01-24\n", - "9 2015-01-25\n", - "10 2015-01-31\n", - "11 2015-02-01\n", - "12 2015-02-07\n", - "13 2015-02-08\n", - "14 2015-02-14\n", - "15 2015-02-15\n", - "16 2015-02-16\n", - "17 2015-02-21\n", - "18 2015-02-22\n", - "19 2015-02-28\n", - "3457\n" + "284\n", + " missing_dates\n", + "264 2024-04-21\n", + "265 2024-04-27\n", + "266 2024-04-28\n", + "267 2024-05-04\n", + "268 2024-05-05\n", + "269 2024-05-11\n", + "270 2024-05-12\n", + "271 2024-05-18\n", + "272 2024-05-19\n", + "273 2024-05-25\n", + "274 2024-05-26\n", + "275 2024-05-27\n", + "276 2024-06-01\n", + "277 2024-06-02\n", + "278 2024-06-08\n", + "279 2024-06-09\n", + "280 2024-06-15\n", + "281 2024-06-16\n", + "282 2024-06-19\n", + "283 2024-06-20\n", + "902\n" ] } ], "source": [ - "complete_dates = pd.date_range(start='2015-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", + "complete_dates = pd.date_range(start='2022-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", "\n", "missing_dates = complete_dates.difference(unique_dates)\n", "\n", @@ -302,9 +600,17 @@ "missing_dates_df = pd.DataFrame(missing_dates, columns=['missing_dates'])\n", "\n", "print(len(missing_dates_df))\n", - "print(missing_dates_df.head(20))\n", + "print(missing_dates_df.tail(20))\n", "print(len(complete_dates))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59f13b03-07db-402f-acdc-24f93047b48d", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb index 546c118..986c0f4 100644 --- a/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb +++ b/BatchProcess/DataSource/YahooFinance/Workbook Yahoo Retrieve Data.ipynb @@ -2,7 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 6, + "execution_count": 1, "id": "4e86daf8-e0cb-4767-bb8a-f8cf46a10fbe", "metadata": {}, "outputs": [], @@ -65,8 +65,8 @@ " StructField(column_4_name, StringType(), True),\n", " StructField(column_5_name, StringType(), True),\n", " StructField(column_6_name, StringType(), True),\n", - " StructField(column_7_name, StringType(), True),\n", - " StructField(column_8_name, StringType(), True)\n", + " StructField(column_7_name, StringType(), True)\n", + " #StructField(column_8_name, StringType(), True)\n", " ])\n", "\n", " self.symbols = list_of_symbols\n", @@ -142,8 +142,8 @@ " column_4_name: row[('High', stock)],\n", " column_5_name: row[('Low', stock)],\n", " column_6_name: row[('Close', stock)],\n", - " column_7_name: row[('Volume', stock)],\n", - " column_8_name: row[('Adj Close', stock)]\n", + " column_7_name: row[('Volume', stock)]\n", + " #column_8_name: row[('Adj Close', stock)]\n", " }\n", " records.append(record)\n", " except KeyError as e:\n", @@ -155,7 +155,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 3, "id": "7a0cd6a5-3629-42ae-886d-03e872242276", "metadata": {}, "outputs": [ @@ -171,39 +171,39 @@ "output_type": "stream", "text": [ " stock_id date open high low close \\\n", - "0 MMM 2015-01-02 137.717392 138.026749 136.061874 137.173920 \n", - "1 AOS 2015-01-02 28.309999 28.415001 27.775000 28.004999 \n", - "2 ABT 2015-01-02 45.250000 45.450001 44.639999 44.900002 \n", - "3 ABBV 2015-01-02 65.440002 66.400002 65.440002 65.889999 \n", - "4 ACN 2015-01-02 89.669998 90.089996 88.430000 88.839996 \n", + "0 MMM 2014-01-02 115.426422 116.220734 115.058525 115.493309 \n", + "1 AOS 2014-01-02 26.965000 26.990000 26.535000 26.660000 \n", + "2 ABT 2014-01-02 38.090000 38.400002 38.000000 38.230000 \n", + "3 ABBV 2014-01-02 52.119999 52.330002 51.520000 51.980000 \n", + "4 ACN 2014-01-02 81.500000 81.919998 81.089996 81.129997 \n", "\n", - " volume adjusted_close \n", - "0 2531214.0 92.933594 \n", - "1 1540200.0 24.154337 \n", - "2 3216600.0 37.481434 \n", - "3 5086100.0 44.314426 \n", - "4 2021300.0 75.950943 \n" + " volume \n", + "0 3650312.0 \n", + "1 1297000.0 \n", + "2 4967500.0 \n", + "3 4569100.0 \n", + "4 2405400.0 \n" ] } ], "source": [ - "transformed_data = YahooFinance(list_of_symbols__, '2015-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", + "transformed_data = YahooFinance(list_of_symbols__, '2014-01-01', datetime.now().strftime('%Y-%m-%d')).results\n", "print(transformed_data.head())" ] }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 4, "id": "e3613f13-de97-4dae-b6c7-2b7408806ec0", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "1185240" + "1311732" ] }, - "execution_count": 8, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -212,6 +212,304 @@ "len(transformed_data)" ] }, + { + "cell_type": "code", + "execution_count": 19, + "id": "69e16637-f9d7-4656-80b6-5f03f6f29c38", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
stock_iddateopenhighlowclosevolume
1311581NVR2024-06-207507.5698247562.2998057422.3300787514.87988322500.0
1311303BKNG2024-06-203995.0000004004.3999023961.2800293972.080078211600.0
1311337CMG2024-06-203445.5800783445.5800783188.0000003214.419922844100.0
1311285AZO2024-06-202979.4699713029.8798832979.4699713008.229980287400.0
1311308AVGO2024-06-201803.4599611804.7500001722.2199711734.5600596595500.0
1311546MTD2024-06-201466.7700201470.7299801452.2700201456.589966119400.0
1311424FICO2024-06-201428.2500001428.6099851401.6700441412.760010138300.0
1311680TDG2024-06-201347.8699951349.0000001325.2600101329.670044208400.0
1311516LRCX2024-06-201091.9200441093.3900151050.2199711061.3100591461200.0
1311583ORLY2024-06-201059.5000001083.2399901059.5000001080.569946724300.0
1311628REGN2024-06-201038.4399411046.2900391028.0000001044.390015590500.0
1311659SMCI2024-06-20961.2899781014.020020900.320007917.64001513347900.0
1311375DECK2024-06-201008.0999761012.450012980.000000989.440002381700.0
1311708GWW2024-06-20921.809998927.710022913.630005915.289978186400.0
1311401LLY2024-06-20893.000000905.450012870.130005885.9899903357900.0
1311365COST2024-06-20871.309998873.849976860.559998862.4400021941100.0
1311511KLAC2024-06-20863.369995864.190002826.549988829.5900271281900.0
1311557MPWR2024-06-20846.000000848.450012819.630005825.330017649900.0
1311300BLK2024-06-20782.020020784.049988777.520020782.830017496800.0
1311409EQIX2024-06-20773.000000774.809998762.340027763.599976369600.0
\n", + "
" + ], + "text/plain": [ + " stock_id date open high low \\\n", + "1311581 NVR 2024-06-20 7507.569824 7562.299805 7422.330078 \n", + "1311303 BKNG 2024-06-20 3995.000000 4004.399902 3961.280029 \n", + "1311337 CMG 2024-06-20 3445.580078 3445.580078 3188.000000 \n", + "1311285 AZO 2024-06-20 2979.469971 3029.879883 2979.469971 \n", + "1311308 AVGO 2024-06-20 1803.459961 1804.750000 1722.219971 \n", + "1311546 MTD 2024-06-20 1466.770020 1470.729980 1452.270020 \n", + "1311424 FICO 2024-06-20 1428.250000 1428.609985 1401.670044 \n", + "1311680 TDG 2024-06-20 1347.869995 1349.000000 1325.260010 \n", + "1311516 LRCX 2024-06-20 1091.920044 1093.390015 1050.219971 \n", + "1311583 ORLY 2024-06-20 1059.500000 1083.239990 1059.500000 \n", + "1311628 REGN 2024-06-20 1038.439941 1046.290039 1028.000000 \n", + "1311659 SMCI 2024-06-20 961.289978 1014.020020 900.320007 \n", + "1311375 DECK 2024-06-20 1008.099976 1012.450012 980.000000 \n", + "1311708 GWW 2024-06-20 921.809998 927.710022 913.630005 \n", + "1311401 LLY 2024-06-20 893.000000 905.450012 870.130005 \n", + "1311365 COST 2024-06-20 871.309998 873.849976 860.559998 \n", + "1311511 KLAC 2024-06-20 863.369995 864.190002 826.549988 \n", + "1311557 MPWR 2024-06-20 846.000000 848.450012 819.630005 \n", + "1311300 BLK 2024-06-20 782.020020 784.049988 777.520020 \n", + "1311409 EQIX 2024-06-20 773.000000 774.809998 762.340027 \n", + "\n", + " close volume \n", + "1311581 7514.879883 22500.0 \n", + "1311303 3972.080078 211600.0 \n", + "1311337 3214.419922 844100.0 \n", + "1311285 3008.229980 287400.0 \n", + "1311308 1734.560059 6595500.0 \n", + "1311546 1456.589966 119400.0 \n", + "1311424 1412.760010 138300.0 \n", + "1311680 1329.670044 208400.0 \n", + "1311516 1061.310059 1461200.0 \n", + "1311583 1080.569946 724300.0 \n", + "1311628 1044.390015 590500.0 \n", + "1311659 917.640015 13347900.0 \n", + "1311375 989.440002 381700.0 \n", + "1311708 915.289978 186400.0 \n", + "1311401 885.989990 3357900.0 \n", + "1311365 862.440002 1941100.0 \n", + "1311511 829.590027 1281900.0 \n", + "1311557 825.330017 649900.0 \n", + "1311300 782.830017 496800.0 \n", + "1311409 763.599976 369600.0 " + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "transformed_data_today = transformed_data.sort_values(by=['date', 'high','volume'],ascending=False)\n", + "transformed_data_today_highest = transformed_data_today.head(20)\n", + "transformed_data_today_highest" + ] + }, { "cell_type": "markdown", "id": "59c52b0a-1f7f-4ec8-b976-a691e8c49f8f", @@ -222,7 +520,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "94ecfc50-b102-4561-b691-51d14a717ad4", "metadata": {}, "outputs": [], @@ -249,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "id": "bd7367a7-8c9f-4a71-832b-26e0b3d469b2", "metadata": {}, "outputs": [], @@ -259,7 +557,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 6, "id": "1f3edde9-b968-47d2-8ad3-bf08f9f3870e", "metadata": {}, "outputs": [ @@ -267,34 +565,34 @@ "name": "stdout", "output_type": "stream", "text": [ - "1077\n", - " missing_dates\n", - "0 2015-01-01\n", - "1 2015-01-03\n", - "2 2015-01-04\n", - "3 2015-01-10\n", - "4 2015-01-11\n", - "5 2015-01-17\n", - "6 2015-01-18\n", - "7 2015-01-19\n", - "8 2015-01-24\n", - "9 2015-01-25\n", - "10 2015-01-31\n", - "11 2015-02-01\n", - "12 2015-02-07\n", - "13 2015-02-08\n", - "14 2015-02-14\n", - "15 2015-02-15\n", - "16 2015-02-16\n", - "17 2015-02-21\n", - "18 2015-02-22\n", - "19 2015-02-28\n", - "3457\n" + "284\n", + " missing_dates\n", + "264 2024-04-21\n", + "265 2024-04-27\n", + "266 2024-04-28\n", + "267 2024-05-04\n", + "268 2024-05-05\n", + "269 2024-05-11\n", + "270 2024-05-12\n", + "271 2024-05-18\n", + "272 2024-05-19\n", + "273 2024-05-25\n", + "274 2024-05-26\n", + "275 2024-05-27\n", + "276 2024-06-01\n", + "277 2024-06-02\n", + "278 2024-06-08\n", + "279 2024-06-09\n", + "280 2024-06-15\n", + "281 2024-06-16\n", + "282 2024-06-19\n", + "283 2024-06-20\n", + "902\n" ] } ], "source": [ - "complete_dates = pd.date_range(start='2015-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", + "complete_dates = pd.date_range(start='2022-01-01', end=datetime.now().strftime('%Y-%m-%d'))\n", "\n", "missing_dates = complete_dates.difference(unique_dates)\n", "\n", @@ -302,9 +600,17 @@ "missing_dates_df = pd.DataFrame(missing_dates, columns=['missing_dates'])\n", "\n", "print(len(missing_dates_df))\n", - "print(missing_dates_df.head(20))\n", + "print(missing_dates_df.tail(20))\n", "print(len(complete_dates))" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "59f13b03-07db-402f-acdc-24f93047b48d", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py b/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py index 085fb4f..1e1f7df 100644 --- a/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py +++ b/BatchProcess/DataSource/YahooFinance/YahooFinances_Services.py @@ -1,6 +1,4 @@ -from ListSnP500.ListSnP500Collect import ListSAndP500 from pyspark.sql.types import StructType, StructField, StringType -from pyspark.sql import SparkSession from dotenv import load_dotenv import yfinance as yf import pandas as pd @@ -37,11 +35,6 @@ def __init__(self, list_of_symbols, start, end): query (None): A placeholder for the query object """ - self.spark = SparkSession.builder \ - .appName("Spark_YahooStreaming") \ - .config("spark.jars.packages") \ - .getOrCreate() - self.schema = StructType([ StructField(column_1_name, StringType(), True), StructField(column_2_name, StringType(), True), @@ -49,22 +42,23 @@ def __init__(self, list_of_symbols, start, end): StructField(column_4_name, StringType(), True), StructField(column_5_name, StringType(), True), StructField(column_6_name, StringType(), True), - StructField(column_7_name, StringType(), True), - StructField(column_8_name, StringType(), True) + StructField(column_7_name, StringType(), True) + # StructField(column_8_name, StringType(), True) ]) self.symbols = list_of_symbols self.interval = '1d' self.start = start self.end = end - self.results = self.process_data() + self.results = None def process_data(self): """ Process the historical stock data for the stock symbols """ data = self.get_data() - return self.transform_data(data) + self.results = self.transform_data(data) + return self.results def get_data(self): """ @@ -108,6 +102,9 @@ def transform_data(self, df): - adjusted_close (float): The adjusted closing price of the stock """ + # Convert df into dataframe + # df = pd.DataFrame(df) + # Reset the index to turn the MultiIndex into columns df = df.reset_index() @@ -126,8 +123,8 @@ def transform_data(self, df): column_4_name: row[('High', stock)], column_5_name: row[('Low', stock)], column_6_name: row[('Close', stock)], - column_7_name: row[('Volume', stock)], - column_8_name: row[('Adj Close', stock)] + column_7_name: row[('Volume', stock)] + # column_8_name: row[('Adj Close', stock)] } records.append(record) except KeyError as e: diff --git a/Database/.env b/Database/.env new file mode 100644 index 0000000..c8c3e7c --- /dev/null +++ b/Database/.env @@ -0,0 +1,6 @@ +DATABASE_SERVER="localhost" +DATABASE_PORT="5432" +DATABASE_NAME="postgres" +DATABASE_USER="postgres" +DATABASE_PASSWORD="admin" +CREATE_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS tickets" \ No newline at end of file diff --git a/Database/PostGreSQLInteraction.py b/Database/PostGreSQLInteraction.py index 110b546..f161e56 100644 --- a/Database/PostGreSQLInteraction.py +++ b/Database/PostGreSQLInteraction.py @@ -1,50 +1,129 @@ from dotenv import load_dotenv +from psycopg2 import sql +import pandas as pd +import psycopg2 +import os load_dotenv(override=True) -postgres_v = os.getenv("POSTGRES_VERSION") -postgres_url = os.getenv("POSTGRES_URL") -postgres_user = os.getenv("POSTGRES_USER") -postgres_pass = os.getenv("POSTGRES_PASSWORD") -postgres_table = os.getenv("POSTGRES_TABLE") -format_file = os.getenv("FORMAT_FILE") -_mode = os.getenv("MODE") - - -# Fact Prices tables -config_ = postgres_v - -column_1_name = os.getenv("COLUMN_1") -column_2_name = os.getenv("COLUMN_2") -column_3_name = os.getenv("COLUMN_3") -column_4_name = os.getenv("COLUMN_4") -column_5_name = os.getenv("COLUMN_5") -column_6_name = os.getenv("COLUMN_6") -column_7_name = os.getenv("COLUMN_7") -column_8_name = os.getenv("COLUMN_8") - -# def _write_streaming(self, df_): - # """ - # Write the transformed historical stock data to a PostgreSQL database - - # Args: - # df_ (DataFrame): A DataFrame containing transformed historical stock data - - # Returns: - # bool: A boolean indicating whether the data was successfully written to the database - - # """ - # try: - # df_.write \ - # .mode(_mode) \ - # .format(self.format_file) \ - # .option("url", f"{self.postgres_url}") \ - # .option("driver", "org.postgresql.Driver") \ - # .option("dbtable", self.postgres_table) \ - # .option("user", self.postgres_user) \ - # .option("password", self.postgres_pass) \ - # .save() - # return True - # except Exception as e: - # print(f"Error: {e}") - # return False \ No newline at end of file +postgres_server = os.getenv("DATABASE_SERVER") +postgres_port = os.getenv("DATABASE_PORT") +postgres_dbname = os.getenv("DATABASE_NAME") +postgres_user = os.getenv("DATABASE_USER") +postgres_pass = os.getenv("DATABASE_PASSWORD") + +create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") + + +class StockDatabaseManager: + def __init__(self): + """ + Initialize the database connection + """ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + + def create_schema_and_tables(self, tickers): + """ + Create the schema and tables for the given tickers list + """ + cursor = self.conn.cursor() + + # Create schema if it doesn't exist + cursor.execute(create_schema_query) + + # Loop through each ticker and create the corresponding table + for ticker in tickers: + cursor.execute( + "CREATE TABLE IF NOT EXISTS tickets." + ticker + " (" + "stock_id VARCHAR(10)," + "date VARCHAR(10)," + "open VARCHAR(50)," + "high VARCHAR(50)," + "low VARCHAR(50)," + "close VARCHAR(50)," + "volume VARCHAR(50)," + "PRIMARY KEY (stock_id, date))" + ) + + # Create index on date for faster queries + cursor.execute( + "CREATE INDEX IF NOT EXISTS " + ticker + + "_date_idx ON tickets." + ticker + " (date)" + ) + + self.conn.commit() + cursor.close() + + def insert_data(self, ticker, data): + """ + Insert data into the database + """ + cursor = self.conn.cursor() + + # Ensure all data is treated as string + data = data.astype(str) + + insert_query = ( + "INSERT INTO tickets." + ticker + + " (stock_id, date, open, high, low, close, volume)" + " VALUES (%s, %s, %s, %s, %s, %s, %s)" + " ON CONFLICT (stock_id, date) DO UPDATE SET" + " open = EXCLUDED.open," + " high = EXCLUDED.high," + " low = EXCLUDED.low," + " close = EXCLUDED.close," + " volume = EXCLUDED.volume" + ) + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row['stock_id'], row['date'], + row['open'], row['high'], row['low'], row['close'], row['volume'])) + self.conn.commit() + cursor.close() + + def get_tables(self, schema='tickets'): + """ + Get all tables in the given schema + """ + cursor = self.conn.cursor() + cursor.execute( + "SELECT table_name FROM information_schema.tables " + "WHERE table_schema = %s", (schema,) + ) + tables = cursor.fetchall() + cursor.close() + return [table[0] for table in tables] + + def fetch_all_data(self, schema='tickets'): + """ + Fetch all data from the given schema + """ + tables = self.get_tables(schema) + all_data = {} + for table in tables: + query = "SELECT * FROM " + schema + "." + table + df = pd.read_sql(query, self.conn) + all_data[table] = df + return all_data + + def close_connection(self): + if self.conn: + self.conn.close() diff --git a/BatchProcess/Consumer.py b/RealTimeProcess/Consumer.py similarity index 100% rename from BatchProcess/Consumer.py rename to RealTimeProcess/Consumer.py diff --git a/BatchProcess/Producer.py b/RealTimeProcess/Producer.py similarity index 100% rename from BatchProcess/Producer.py rename to RealTimeProcess/Producer.py diff --git a/BatchProcess/BatchProcess.py b/pages/2_Admin.py similarity index 100% rename from BatchProcess/BatchProcess.py rename to pages/2_Admin.py diff --git a/styles/main.css b/styles/main.css new file mode 100644 index 0000000..25a2952 --- /dev/null +++ b/styles/main.css @@ -0,0 +1,43 @@ +@import url('https://fonts.googleapis.com/css2?family=Readex+Pro:wght@300;400;500;600;700&display=swap'); + + +* { + font-family: 'Readex Pro'; +} + + +a { + text-decoration: none; + color: black !important; + font-weight: 500; +} + +a:hover { + color: #d33682 !important; + text-decoration: none; +} + +ul {list-style-type: none;} + +hr { + margin-top: 0px; + margin-bottom: 5%; +} + +.st-emotion-cache-asc41u.e1nzilvr2 h1{ + padding-top: 0px; + padding-bottom: 15px; +} + +.st-emotion-cache-13ln4jf.ea3mdgi5 +{ + padding-top: 20px; +} + +.st-emotion-cache-6qob1r.eczjsme8 { + width: 244px; +} + +#MainMenu {visibility: hidden;} +footer {visibility: hidden;} +header {visibility: hidden;} \ No newline at end of file From 2e089eff05ba1133b8d8dd1682762eeb71a06883 Mon Sep 17 00:00:00 2001 From: NolanM Date: Sun, 23 Jun 2024 03:02:40 -0400 Subject: [PATCH 07/12] Add PostgreSQL Set Up schema and tables include Write, Read, Create operations --- 1_HomePage.py | 165 ++++++--- BatchProcess/BatchProcess.py | 77 ++++ Database/.env | 8 +- Database/PostGreSQLInteraction.py | 425 ++++++++++++++++++---- Database/PostGreSQLInteraction_Alchemy.py | 102 ++++++ README.md | 4 + pages/2_Admin.py | 0 requirements.txt | Bin 0 -> 2180 bytes 8 files changed, 654 insertions(+), 127 deletions(-) create mode 100644 BatchProcess/BatchProcess.py create mode 100644 Database/PostGreSQLInteraction_Alchemy.py delete mode 100644 pages/2_Admin.py create mode 100644 requirements.txt diff --git a/1_HomePage.py b/1_HomePage.py index 3dd0530..3487cd2 100644 --- a/1_HomePage.py +++ b/1_HomePage.py @@ -1,25 +1,23 @@ -from datetime import datetime -import time - -import pandas as pd -from BatchProcess.DataSource.YahooFinance.YahooFinances_Services import YahooFinance from BatchProcess.DataSource.ListSnP500.ListSnP500Collect import ListSAndP500 +from BatchProcess.BatchProcess import BatchProcessManager from multiprocessing.pool import ThreadPool +import plotly.graph_objects as go from dotenv import load_dotenv from pathlib import Path import streamlit as st +import pandas as pd +import time import os -from Database.PostGreSQLInteraction import StockDatabaseManager - -load_dotenv(override=True) pool = ThreadPool(processes=6) +load_dotenv(override=True) current_dir = Path(__file__).parent if "__file__" in locals() else Path.cwd() css_file = current_dir / os.getenv("CSS_DIR") defaut_start_date = "2014-01-01" -st.set_page_config(page_title="Home Page", page_icon=":house:") +st.set_page_config(page_title="Home Page", page_icon=":house:", + initial_sidebar_state="collapsed") st.sidebar.header("Quantitative Trading Project") st.title("Welcome to the Home Page") st.markdown( @@ -36,70 +34,123 @@ st.markdown("".format(f.read()), unsafe_allow_html=True) +# --- CACHE DATA --- @st.cache_data(ttl=1800) def retrieve_list_ticket(): - list_of_symbols__ = ListSAndP500().tickers_list + list_of_symbols__ = BatchProcessManager().get_stock_list_in_database() + if list_of_symbols__ is None or len(list_of_symbols__) < 497: + list_of_symbols__ = ListSAndP500().tickers_list return list_of_symbols__ -PROCESS_TIME = 90 # seconds -_list_of_symbols = retrieve_list_ticket() - - @st.cache_data(ttl=1800) -def retrieve_data_from_yahoo(list_of_symbols, date_from, date_to): - transformed_data = YahooFinance(list_of_symbols, date_from, date_to) - return transformed_data.process_data() +def batch_process(list_of_symbols__): + return BatchProcessManager().run_process(list_of_symbols__) @st.cache_data(ttl=1800) -def update_datebase_func(list_of_symbols=retrieve_list_ticket(), date_from=defaut_start_date, date_to=datetime.now().strftime('%Y-%m-%d')): - st.write("Database Updated") - # Retrieve Data from yahoo finance - async_result = pool.apply_async( - retrieve_data_from_yahoo, args=(list_of_symbols, date_from, date_to,)) - bar = st.progress(0) - per = PROCESS_TIME / 100 - for i in range(100): - time.sleep(per) - bar.progress(i + 1) - df = async_result.get() - return df +def batch_process_retrieve_data_by_stock(the_stock_in): + return BatchProcessManager().get_stock_data_by_ticker(the_stock_in) -@st.cache_data(ttl=1800) -def process_data_retrieve_from_database(df_in, list_of_symbols__): - total_data_dict = dict() - for i in range(len(list_of_symbols__)): - filtered_data = df_in[df_in['stock_id'] == list_of_symbols__[i]] - filtered_data = filtered_data.reset_index() - total_data_dict[list_of_symbols__[i]] = filtered_data - return total_data_dict - - -update_database = st.button("Update Database") -if update_database: - df_historical_yahoo = update_datebase_func( - list_of_symbols=_list_of_symbols) - total_data_dict_ = process_data_retrieve_from_database( - df_historical_yahoo, _list_of_symbols) - db_manager = StockDatabaseManager() - db_manager.create_schema_and_tables(_list_of_symbols) - for key, value in total_data_dict_.items(): - if isinstance(value, pd.DataFrame): - db_manager.insert_data(key, value) - all_data = db_manager.fetch_all_data() - for table, df in all_data.items(): - st.write(f"Data for table {table}:") - st.write(df.head(10)) - db_manager.close_connection() - st.write("Done") - # st.write(total_data_dict_) +PROCESS_TIME = 180 # seconds +_list_of_symbols = retrieve_list_ticket() +# --- MAIN PAGE --- +if "stock_data" not in st.session_state: + st.session_state.stock_data = None +st.markdown('---') +st.markdown("### I. Retrieve stock data from database if available") + +the_stock = st.selectbox( + "Select the stock you want to retrieve from database", _list_of_symbols) +btn_prepare = st.button("Retrieve stock data from database...") + +if btn_prepare: + st.session_state.stock_data = the_stock + # df = batch_process_retrieve_data_by_stock(the_stock) + # df = pd.DataFrame(df) + # if df is not None: + # st.write(df) + # st.write("Done") + # else: + # st.write("No data found for this stock, please update the database first.") + +st.markdown('---') +# --- TABS --- +st.markdown( + "### II. List of 500 S&P, Historical data, In Day Data, Top News, Reddit News") List500, Historical_data, IndayData_RealTime, news, reddit_news = st.tabs( ["List 500 S&P", "Historical data", "In Day Data", "Top News", "Reddit News"]) +# --- TABS LIST500 S&P CONTENT--- with List500: st.write("List of 500 S&P") st.write(_list_of_symbols) + +# --- TABS HISTORICAL DATA CONTENT--- +with Historical_data: + if st.session_state.stock_data is not None: + df = batch_process_retrieve_data_by_stock(st.session_state.stock_data) + df = pd.DataFrame(df) + if df is not None: + fig = go.Figure(data=[go.Candlestick(x=df['date'], + open=df['open'], + high=df['high'], + low=df['low'], + close=df['close'])]) + # Add a title + fig.update_layout( + title=f"{st.session_state.stock_data} Price Candlestick Chart", + # Center the title + title_x=0.3, + + # Customize the font and size of the title + title_font=dict(size=24, family="Arial"), + + # Set the background color of the plot + plot_bgcolor='white', + + # Customize the grid lines + xaxis=dict(showgrid=True, gridwidth=1, gridcolor='lightgray'), + yaxis=dict(showgrid=True, gridwidth=1, gridcolor='lightgray'), + ) + + # Add a range slider and customize it + fig.update_layout( + xaxis_rangeslider_visible=True, # Show the range slider + + # Customize the range slider's appearance + xaxis_rangeslider=dict( + thickness=0.1, # Set the thickness of the slider + bordercolor='black', # Set the border color + borderwidth=1, # Set the border width + ) + ) + + # Display the chart in Streamlit + st.plotly_chart(fig) + st.markdown( + f"#### Dataframe of {st.session_state.stock_data} Prices") + st.write(df) + else: + st.write( + "No data found for this stock, please update the database first.") + else: + st.write("Please select the stock to retrieve the data") + +st.markdown('---') +# --- Set Up/ Update all data in database--- +st.markdown("### III. Set Up data in database for the first time") +update_database = st.button("Update Database") +if update_database: + async_result = pool.apply_async( + batch_process, args=(_list_of_symbols,)) + bar = st.progress(0) + per = PROCESS_TIME / 100 + for i in range(100): + time.sleep(per) + bar.progress(i + 1) + df_dict = async_result.get() + st.write("Please check the data in the database") diff --git a/BatchProcess/BatchProcess.py b/BatchProcess/BatchProcess.py new file mode 100644 index 0000000..e41b5fe --- /dev/null +++ b/BatchProcess/BatchProcess.py @@ -0,0 +1,77 @@ +from Database.PostGreSQLInteraction import DatabaseManager, StockDatabaseManager, TicketDimDatabaseManager, RedditNewsDatabaseManager +from BatchProcess.DataSource.YahooFinance.YahooFinances_Services import YahooFinance +from BatchProcess.DataSource.ListSnP500.ListSnP500Collect import ListSAndP500 +from datetime import datetime +import pandas as pd + + +defaut_start_date = "2014-01-01" + +date_to = datetime.now().strftime('%Y-%m-%d') + + +class BatchProcessManager: + def __init__(self): + self.list_of_symbols = None + self.dict_ticket = dict() + + def run_process(self, list_of_symbols_): + self.list_of_symbols = list_of_symbols_ + + # Get data from Yahoo Finance + transformed_data = YahooFinance( + self.list_of_symbols, defaut_start_date, date_to) + df = transformed_data.process_data() + + # Create Database Manager + db_manager = DatabaseManager() + + # Drop all tables exist in the database + db_manager.delete_schema() + + # Create Stock table + db_manager.StockDatabaseManager.create_schema_and_tables( + self.list_of_symbols) + + # Create TicketDim table + db_manager.TicketDimDatabaseManager.create_table() + + # Create RedditNews table + db_manager.RedditNewsDatabaseManager.create_schema_and_tables() + + # Apply multiprocessing to insert data into the database (Testing later) + for i in range(len(self.list_of_symbols)): + filtered_data = df[df['stock_id'] == self.list_of_symbols[i]] + filtered_data = filtered_data.reset_index() + self.dict_ticket[self.list_of_symbols[i]] = filtered_data + + # Insert data into the database Stock table + for key, value in self.dict_ticket.items(): + if isinstance(value, pd.DataFrame): + db_manager.StockDatabaseManager.insert_data(key, value) + + # Insert data into the database TicketDim table + db_manager.TicketDimDatabaseManager.insert_data(self.list_of_symbols) + + db_manager.close_connection() + return self.dict_ticket + + def get_stock_data_by_ticker(self, ticker): + try: + db_manager = StockDatabaseManager() + data = db_manager.get_data_by_table(ticker) + db_manager.close_connection() + return data + except Exception as e: + print(e) + return None + + def get_stock_list_in_database(self): + try: + db_manager = TicketDimDatabaseManager() + data = db_manager.get_data() + db_manager.close_connection() + return data + except Exception as e: + print(e) + return None diff --git a/Database/.env b/Database/.env index c8c3e7c..8ed62df 100644 --- a/Database/.env +++ b/Database/.env @@ -3,4 +3,10 @@ DATABASE_PORT="5432" DATABASE_NAME="postgres" DATABASE_USER="postgres" DATABASE_PASSWORD="admin" -CREATE_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS tickets" \ No newline at end of file +CREATE_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS tickets;" + +INSERT_QUERY_REDDIT_TABLE="INSERT INTO reddits.stock_reddit_news (id, subreddit, url, title, score, num_comments, downvotes, ups, date_created_utc) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) ON CONFLICT (id) DO NOTHING;" +POSTGRE_CONNECTION="dbname=postgres user=postgres host=localhost password=admin" +CONFIGURE_REDDIT_TABLE = "CREATE INDEX IF NOT EXISTS idx_stock_reddit_news_id ON reddits.stock_reddit_news(id);" +CREATE_REDDIT_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS reddits.stock_reddit_news (id VARCHAR PRIMARY KEY, subreddit VARCHAR, url VARCHAR, title TEXT, score TEXT, num_comments TEXT, downvotes TEXT, ups TEXT, date_created_utc TEXT);" +CREATE_REDDIT_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS reddits;" diff --git a/Database/PostGreSQLInteraction.py b/Database/PostGreSQLInteraction.py index f161e56..26c5c75 100644 --- a/Database/PostGreSQLInteraction.py +++ b/Database/PostGreSQLInteraction.py @@ -1,4 +1,6 @@ +import plotly.graph_objects as go from dotenv import load_dotenv +from datetime import datetime from psycopg2 import sql import pandas as pd import psycopg2 @@ -14,6 +16,11 @@ create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") +CREATE_REDDIT_TABLE_QUERY = os.getenv("CREATE_REDDIT_TABLE_QUERY") +CONFIGURE_REDDIT_TABLE = os.getenv("CONFIGURE_REDDIT_TABLE") +INSERT_QUERY_REDDIT_TABLE = os.getenv("INSERT_QUERY_REDDIT_TABLE") +CREATE_REDDIT_SCHEMA_QUERY = os.getenv("CREATE_REDDIT_SCHEMA_QUERY") + class StockDatabaseManager: def __init__(self): @@ -31,99 +38,379 @@ def create_connection(self): """ Create a connection to the database """ - conn = psycopg2.connect( - dbname=self.dbname, - user=self.user, - password=self.password, - host=self.host, - port=self.port - ) - return conn + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None def create_schema_and_tables(self, tickers): """ Create the schema and tables for the given tickers list """ - cursor = self.conn.cursor() + try: + cursor = self.conn.cursor() - # Create schema if it doesn't exist - cursor.execute(create_schema_query) + # Create schema if it doesn't exist + cursor.execute(create_schema_query) - # Loop through each ticker and create the corresponding table - for ticker in tickers: - cursor.execute( - "CREATE TABLE IF NOT EXISTS tickets." + ticker + " (" - "stock_id VARCHAR(10)," - "date VARCHAR(10)," - "open VARCHAR(50)," - "high VARCHAR(50)," - "low VARCHAR(50)," - "close VARCHAR(50)," - "volume VARCHAR(50)," - "PRIMARY KEY (stock_id, date))" - ) + # Loop through each ticker and create the corresponding table + for ticker in tickers: + cursor.execute( + "CREATE TABLE IF NOT EXISTS tickets." + ticker + " (" + "stock_id VARCHAR(10)," + "date VARCHAR(10)," + "open VARCHAR(50)," + "high VARCHAR(50)," + "low VARCHAR(50)," + "close VARCHAR(50)," + "volume VARCHAR(50)," + "PRIMARY KEY (stock_id, date))" + ) - # Create index on date for faster queries - cursor.execute( - "CREATE INDEX IF NOT EXISTS " + ticker + - "_date_idx ON tickets." + ticker + " (date)" - ) + # Create index on date for faster queries + cursor.execute( + "CREATE INDEX IF NOT EXISTS " + ticker + + "_date_idx ON tickets." + ticker + " (date)" + ) - self.conn.commit() - cursor.close() + self.conn.commit() + cursor.close() + except Exception as e: + print(e) def insert_data(self, ticker, data): """ Insert data into the database """ - cursor = self.conn.cursor() - - # Ensure all data is treated as string - data = data.astype(str) - - insert_query = ( - "INSERT INTO tickets." + ticker + - " (stock_id, date, open, high, low, close, volume)" - " VALUES (%s, %s, %s, %s, %s, %s, %s)" - " ON CONFLICT (stock_id, date) DO UPDATE SET" - " open = EXCLUDED.open," - " high = EXCLUDED.high," - " low = EXCLUDED.low," - " close = EXCLUDED.close," - " volume = EXCLUDED.volume" - ) - - for index, row in data.iterrows(): - cursor.execute(insert_query, (row['stock_id'], row['date'], - row['open'], row['high'], row['low'], row['close'], row['volume'])) - self.conn.commit() - cursor.close() + try: + cursor = self.conn.cursor() + + # Ensure all data is treated as string + data = data.astype(str) + + insert_query = ( + "INSERT INTO tickets." + ticker + + " (stock_id, date, open, high, low, close, volume)" + " VALUES (%s, %s, %s, %s, %s, %s, %s)" + " ON CONFLICT (stock_id, date) DO UPDATE SET" + " open = EXCLUDED.open," + " high = EXCLUDED.high," + " low = EXCLUDED.low," + " close = EXCLUDED.close," + " volume = EXCLUDED.volume" + ) + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row['stock_id'], row['date'], + row['open'], row['high'], row['low'], row['close'], row['volume'])) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_data_by_table(self, table_name): + """ + Get data from the given ticket table + """ + try: + query = f"SELECT * FROM tickets.{table_name}" + data = pd.read_sql(query, self.conn) + return data + except Exception as e: + print(e) + return None def get_tables(self, schema='tickets'): """ Get all tables in the given schema """ - cursor = self.conn.cursor() - cursor.execute( - "SELECT table_name FROM information_schema.tables " - "WHERE table_schema = %s", (schema,) - ) - tables = cursor.fetchall() - cursor.close() - return [table[0] for table in tables] + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT table_name FROM information_schema.tables " + "WHERE table_schema = %s", (schema,) + ) + tables = cursor.fetchall() + cursor.close() + return [table[0] for table in tables] + except Exception as e: + print(e) + return None def fetch_all_data(self, schema='tickets'): """ Fetch all data from the given schema """ - tables = self.get_tables(schema) - all_data = {} - for table in tables: - query = "SELECT * FROM " + schema + "." + table - df = pd.read_sql(query, self.conn) - all_data[table] = df - return all_data + try: + tables = self.get_tables(schema) + all_data = {} + for table in tables: + query = "SELECT * FROM " + schema + "." + table + df = pd.read_sql(query, self.conn) + all_data[table] = df + return all_data + except Exception as e: + print(e) + return None + + def close_connection(self): + if self.conn: + try: + self.conn.close() + except Exception as e: + print(e) + + +class TicketDimDatabaseManager: + def __init__(self): + """ + Initialize the database connection + """ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None + + def create_table(self): + """ + Create the ticket_dim table + """ + try: + cursor = self.conn.cursor() + + # Create schema if it doesn't exist + cursor.execute(create_schema_query) + + # Create the ticket_dim table + cursor.execute( + "CREATE TABLE IF NOT EXISTS tickets.ticket_dim (" + "symbol VARCHAR(10) PRIMARY KEY," + "company_name VARCHAR(255) NULL," + "established DATE NULL," + "sector VARCHAR(100) NULL," + "industry VARCHAR(100) NULL," + "exchange VARCHAR(50) NULL" + ")" + ) + + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def insert_data(self, data): + """ + Insert data into the ticket_dim table + """ + try: + if isinstance(data, list): + data = pd.DataFrame(data, columns=['symbol']) + data['company_name'] = None + data['established'] = None + data['sector'] = None + data['industry'] = None + data['exchange'] = None + + cursor = self.conn.cursor() + + # Ensure all data is treated as string + # df_data = pd.DataFrame(data_in) + # data = df_data.astype(str) + + insert_query = ( + "INSERT INTO tickets.ticket_dim (symbol, company_name, established, sector, industry, exchange)" + " VALUES (%s, %s, %s, %s, %s, %s)" + " ON CONFLICT (symbol) DO UPDATE SET" + " company_name = EXCLUDED.company_name," + " established = EXCLUDED.established," + " sector = EXCLUDED.sector," + " industry = EXCLUDED.industry," + " exchange = EXCLUDED.exchange" + ) + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row['symbol'], row.get('company_name'), + row.get('established'), row.get('sector'), row.get('industry'), row.get('exchange'))) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_data(self): + """ + Get all data from the ticket_dim table + """ + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT * FROM tickets.ticket_dim" + ) + data = cursor.fetchall() + cursor.close() + # Convert data to list + data = [list(row)[0] for row in data] + return data + except Exception as e: + print(e) + return None + + def search_ticker(self, symbol): + """ + Search for a specific ticker by its symbol + """ + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT * FROM tickets.ticket_dim WHERE symbol = %s", (symbol,) + ) + data = cursor.fetchone() + cursor.close() + return data + except Exception as e: + print(e) + return None def close_connection(self): if self.conn: - self.conn.close() + try: + self.conn.close() + except Exception as e: + print(e) + + +class RedditNewsDatabaseManager: + def __init__(self): + """ + Initialize the database connection + """ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None + + def create_schema_and_tables(self): + """ + Create the stock_reddit_news table + """ + try: + cursor = self.conn.cursor() + cursor.execute(CREATE_REDDIT_SCHEMA_QUERY) + cursor.execute(CREATE_REDDIT_TABLE_QUERY) + cursor.execute(CONFIGURE_REDDIT_TABLE) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def insert_data(self, data): + """ + Insert data into the stock_reddit_news table + """ + try: + cursor = self.conn.cursor() + insert_query = INSERT_QUERY_REDDIT_TABLE + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row["id"], row["subreddit"], row["url"], row["title"].replace('\'', ""), + row["score"], row["num_comments"], row["downvotes"], row["ups"], row["date_created_utc"])) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_news_by_ticker(self, ticker): + """ + Get news from the stock_reddit_news table corresponding to a specific ticker + """ + try: + cursor = self.conn.cursor() + query = """ + SELECT * FROM reddits.stock_reddit_news + WHERE LOWER(title) LIKE %s + """ + cursor.execute(query, ('%' + ticker.lower() + '%',)) + data = cursor.fetchall() + cursor.close() + return data + except Exception as e: + print(e) + return None + + def close_connection(self): + if self.conn: + try: + self.conn.close() + except Exception as e: + print(e) + + +class DatabaseManager: + def __init__(self): + """ + Initialize the database connection + """ + self.StockDatabaseManager = StockDatabaseManager() + self.TicketDimDatabaseManager = TicketDimDatabaseManager() + self.RedditNewsDatabaseManager = RedditNewsDatabaseManager() + + def delete_schema(self): + try: + # Fix later + cursor = self.StockDatabaseManager.conn.cursor() + cursor.execute("DROP SCHEMA IF EXISTS tickets CASCADE;") + cursor.execute("DROP SCHEMA IF EXISTS reddits CASCADE;") + self.StockDatabaseManager.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def close_connection(self): + self.StockDatabaseManager.close_connection() + self.TicketDimDatabaseManager.close_connection() + self.RedditNewsDatabaseManager.close_connection() diff --git a/Database/PostGreSQLInteraction_Alchemy.py b/Database/PostGreSQLInteraction_Alchemy.py new file mode 100644 index 0000000..bfc96d8 --- /dev/null +++ b/Database/PostGreSQLInteraction_Alchemy.py @@ -0,0 +1,102 @@ +import pandas as pd +from sqlalchemy import create_engine, MetaData, Table, Column, String +from sqlalchemy.dialects.postgresql import insert +from dotenv import load_dotenv +import os + + +class StockDatabaseManager: + def __init__(self): + load_dotenv(override=True) + self.dbname = os.getenv("DATABASE_NAME") + self.user = os.getenv("DATABASE_USER") + self.password = os.getenv("DATABASE_PASSWORD") + self.host = os.getenv("DATABASE_SERVER") + self.port = os.getenv("DATABASE_PORT") + self.engine = self.create_engine() + self.metadata = MetaData(schema='tickets') + self.create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") + + def create_engine(self): + db_url = f"postgresql://{self.user}:{self.password}@{self.host}:{self.port}/{self.dbname}" + engine = create_engine(db_url) + return engine + + def create_schema_and_tables(self, tickers): + try: + with self.engine.connect() as connection: + # Create schema if it doesn't exist + connection.execute(self.create_schema_query) + + for ticker in tickers: + table = Table(ticker, self.metadata, + Column('stock_id', String( + 10), primary_key=True), + Column('date', String(10), primary_key=True), + Column('open', String(50)), + Column('high', String(50)), + Column('low', String(50)), + Column('close', String(50)), + Column('volume', String(50)) + ) + table.create(self.engine, checkfirst=True) + return True + except Exception as e: + print(f"Error creating schema and tables: {e}") + return False + + def insert_data(self, ticker, data): + table = Table(ticker, self.metadata, autoload_with=self.engine) + + # Ensure all data is treated as string + data = data.astype(str) + try: + with self.engine.connect() as connection: + for index, row in data.iterrows(): + stmt = insert(table).values( + stock_id=row['stock_id'], + date=row['date'], + open=row['open'], + high=row['high'], + low=row['low'], + close=row['close'], + volume=row['volume'] + ).on_conflict_do_update( + index_elements=['stock_id', 'date'], + set_=dict( + open=row['open'], + high=row['high'], + low=row['low'], + close=row['close'], + volume=row['volume'] + ) + ) + connection.execute(stmt) + return True + except Exception as e: + print(f"Error inserting data: {e}") + return False + + def get_tables(self): + try: + inspector = self.engine.inspect(self.engine) + tables = inspector.get_table_names(schema='tickets') + return tables + except Exception as e: + print(f"Error getting tables: {e}") + return [] + + def fetch_all_data(self): + try: + tables = self.get_tables() + all_data = {} + for table_name in tables: + table = Table(table_name, self.metadata, + autoload_with=self.engine) + query = table.select() + df = pd.read_sql(query, self.engine) + all_data[table_name] = df + return all_data + except Exception as e: + print(f"Error fetching data: {e}") + return {} diff --git a/README.md b/README.md index ffd0c30..c6d3205 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,10 @@ Install requirements.txt: Automatically installed dependencies that needed for t ```bash pip install -r requirements.txt ``` + or + ```bash + pip install streamlit, pyspark, yfinance, psycopg2, python-dotenv + ```

diff --git a/pages/2_Admin.py b/pages/2_Admin.py deleted file mode 100644 index e69de29..0000000 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..4e36ba87041ce2b8181b8b365159ba77c978c4d2 GIT binary patch literal 2180 zcmZ9N&2Ab&5QOI(DUX8X1)QHl&N)SjlqUcT24}rHVb?$K@JZ_H+F?k97Hqn^y1Ke% z`15;}+BBwBI;3OzqSsxzNeex<>3w>q??=6kX^7Z7BJ)dhowmw&R>mRi^w}z}*Jn=4 z$X_b6N#rjAZLN$$>e5fuxm%;yCq46sZ-llsAPK`*4M| z7aGh#o2hHB|DN<69L^U8%*s<35Z#C&ePIT}j}to>fwBr5GHw-hU)0(u)(3W%?gM9> z_&IACI1h@9imxL^H7Jc~{aml&q{ry< zZ{AGbWp&-C!%h$TXRpQsWiD;(I{V1;wdpOUCj-CI#rvcCQQNy0#;aJ(gvR!>^eo&_ z+wT50W#iZ%`g&y4Evzym4gBPvkKl`bxBrTFQi_l<5_qx zbqGJVcb+iQkZ- U5#5%P!e?dVX@kBwIE|j=FK@* Date: Sun, 23 Jun 2024 14:26:42 -0400 Subject: [PATCH 08/12] Add environment set up package script and update readme file --- .gitignore | 2 + README.md | 4 +- .../PKG-INFO | 12 +++ .../SOURCES.txt | 10 +++ .../dependency_links.txt | 1 + .../entry_points.txt | 2 + .../requires.txt | 9 ++ .../top_level.txt | 1 + .../NolanMQuantTradingEnvSetUp/__init__.py | 0 .../NolanMQuantTradingEnvSetUp/setup.py | 5 ++ SetUpEnvironmentPackage/README.md | 84 +++++++++++++++++++ SetUpEnvironmentPackage/requirements.txt | 10 +++ SetUpEnvironmentPackage/setup.py | 20 +++++ 13 files changed, 158 insertions(+), 2 deletions(-) create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/PKG-INFO create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/SOURCES.txt create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/dependency_links.txt create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/entry_points.txt create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/requires.txt create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/top_level.txt create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/__init__.py create mode 100644 SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/setup.py create mode 100644 SetUpEnvironmentPackage/README.md create mode 100644 SetUpEnvironmentPackage/requirements.txt create mode 100644 SetUpEnvironmentPackage/setup.py diff --git a/.gitignore b/.gitignore index aa0b59c..e710407 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,5 @@ venv .ipynb_checkpoints /BatchProcess/DataSource/YahooFinance/.ipynb_checkpoints __pycache__ +build +dist diff --git a/README.md b/README.md index c6d3205..aa913fb 100644 --- a/README.md +++ b/README.md @@ -56,11 +56,11 @@ The primary objective of this project is to develop and implement a Long Short-T Install requirements.txt: Automatically installed dependencies that needed for the project: ```bash - pip install -r requirements.txt + pip install NolanMQuantTradingEnvSetUp ``` or ```bash - pip install streamlit, pyspark, yfinance, psycopg2, python-dotenv + pip install -r requirements.txt ```

diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/PKG-INFO b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/PKG-INFO new file mode 100644 index 0000000..8418249 --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/PKG-INFO @@ -0,0 +1,12 @@ +Metadata-Version: 2.1 +Name: NolanMQuantTradingEnvSetUp +Version: 2.0 +Requires-Dist: plotly +Requires-Dist: python-dotenv +Requires-Dist: streamlit +Requires-Dist: pandas +Requires-Dist: pyspark +Requires-Dist: yfinance +Requires-Dist: psycopg2 +Requires-Dist: kafka-python +Requires-Dist: alpha-vantage diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/SOURCES.txt b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/SOURCES.txt new file mode 100644 index 0000000..42763b0 --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/SOURCES.txt @@ -0,0 +1,10 @@ +README.md +setup.py +NolanMQuantTradingEnvSetUp/__init__.py +NolanMQuantTradingEnvSetUp/setup.py +NolanMQuantTradingEnvSetUp.egg-info/PKG-INFO +NolanMQuantTradingEnvSetUp.egg-info/SOURCES.txt +NolanMQuantTradingEnvSetUp.egg-info/dependency_links.txt +NolanMQuantTradingEnvSetUp.egg-info/entry_points.txt +NolanMQuantTradingEnvSetUp.egg-info/requires.txt +NolanMQuantTradingEnvSetUp.egg-info/top_level.txt \ No newline at end of file diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/dependency_links.txt b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/dependency_links.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/dependency_links.txt @@ -0,0 +1 @@ + diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/entry_points.txt b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/entry_points.txt new file mode 100644 index 0000000..a18b9e8 --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +setup-env = NolanMQuantTradingEnvSetUp.setup:main diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/requires.txt b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/requires.txt new file mode 100644 index 0000000..8a9257d --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/requires.txt @@ -0,0 +1,9 @@ +plotly +python-dotenv +streamlit +pandas +pyspark +yfinance +psycopg2 +kafka-python +alpha-vantage diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/top_level.txt b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/top_level.txt new file mode 100644 index 0000000..d6ab4dd --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp.egg-info/top_level.txt @@ -0,0 +1 @@ +NolanMQuantTradingEnvSetUp diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/__init__.py b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/setup.py b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/setup.py new file mode 100644 index 0000000..d030f11 --- /dev/null +++ b/SetUpEnvironmentPackage/NolanMQuantTradingEnvSetUp/setup.py @@ -0,0 +1,5 @@ +import subprocess + + +def main(): + subprocess.check_call(['pip', 'install', '-r', 'requirements.txt']) diff --git a/SetUpEnvironmentPackage/README.md b/SetUpEnvironmentPackage/README.md new file mode 100644 index 0000000..74bdf44 --- /dev/null +++ b/SetUpEnvironmentPackage/README.md @@ -0,0 +1,84 @@ +# NolanM Quantitative Trading Environment Package Set Up + +## Overview + +NolanMQuantTradingEnvSetUp is a Python package designed to set up a local virtual environment with all necessary dependencies specified in the `requirements.txt` file. This package is ideal for quickly setting up your development environment for Quantitative Trading Projects. + +--- + +## Installation + +To install this package, simply use pip: + +```python + pip install NolanMQuantTradingEnvSetUp +``` + +--- + +## Update Package +### A. Prerequisite +1. Install rustup for updating package only +```link +https://rustup.rs/ +``` + +2. Install neccessary package for updating package only + +```sh + pip install --upgrade setuptools pip + pip install wheel twine +``` + +### B. Steps +#### 1. Update requirements.txt +Note: Ensure that all required dependencies are listed in requirements.txt. The file should be UTF-8 encoded. + +requirement.txt + +```plaintext + plotly + python-dotenv + streamlit + pandas + pyspark + yfinance + psycopg2 + kafka-python + alpha-vantage +``` + +#### 2. Update the Version of package release in setup.py (Not in NolanMQuantTradingEnvSetUp directory) +Open directory in command line with admintrator permission type + +```python + setup( + name='NolanMQuantTradingEnvSetUp', + version='2.0', <---------- Change the Version Here + packages=find_packages(), + include_package_data=True, + install_requires=read_requirements(), + entry_points={ + 'console_scripts': [ + 'setup-env=NolanMQuantTradingEnvSetUp.setup:main', + ], + }, +) +``` + + +#### 3. Build the Distribution +Open directory in command line with admintrator permission type + +```sh + python setup.py sdist bdist_wheel +``` + +#### 4. Upload to PyPI +Open directory in command line with admintrator permission type + +```sh + twine upload dist/* +``` + +Input the API keys and Enter \ No newline at end of file diff --git a/SetUpEnvironmentPackage/requirements.txt b/SetUpEnvironmentPackage/requirements.txt new file mode 100644 index 0000000..06b4be0 --- /dev/null +++ b/SetUpEnvironmentPackage/requirements.txt @@ -0,0 +1,10 @@ +plotly +python-dotenv +streamlit +pandas +pyspark +yfinance +psycopg2 +kafka-python +alpha-vantage +notebook \ No newline at end of file diff --git a/SetUpEnvironmentPackage/setup.py b/SetUpEnvironmentPackage/setup.py new file mode 100644 index 0000000..5ee53ec --- /dev/null +++ b/SetUpEnvironmentPackage/setup.py @@ -0,0 +1,20 @@ +from setuptools import setup, find_packages + + +def read_requirements(): + with open('requirements.txt', 'r', encoding='utf-8') as req_file: + return [line.strip() for line in req_file if line.strip()] + + +setup( + name='NolanMQuantTradingEnvSetUp', + version='2.0', + packages=find_packages(), + include_package_data=True, + install_requires=read_requirements(), + entry_points={ + 'console_scripts': [ + 'setup-env=NolanMQuantTradingEnvSetUp.setup:main', + ], + }, +) From 429497a14227440ebfcadd381249f3f8267493d7 Mon Sep 17 00:00:00 2001 From: NolanM Date: Sun, 23 Jun 2024 14:46:55 -0400 Subject: [PATCH 09/12] Set Up SonarCloud for Project --- .github/workflows/build.yml | 20 ++++++++++++++++++++ .sonarlint/connectedMode.json | 4 ++++ .vscode/settings.json | 6 ++++++ sonar-project.properties | 13 +++++++++++++ 4 files changed, 43 insertions(+) create mode 100644 .github/workflows/build.yml create mode 100644 .sonarlint/connectedMode.json create mode 100644 .vscode/settings.json create mode 100644 sonar-project.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..52cc8ba --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,20 @@ +name: Build +on: + push: + branches: + - Development-Batch-Process-Retrieve-Historical-Data + pull_request: + types: [opened, synchronize, reopened] +jobs: + sonarcloud: + name: SonarCloud + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis + - name: SonarCloud Scan + uses: SonarSource/sonarcloud-github-action@master + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/.sonarlint/connectedMode.json b/.sonarlint/connectedMode.json new file mode 100644 index 0000000..d102997 --- /dev/null +++ b/.sonarlint/connectedMode.json @@ -0,0 +1,4 @@ +{ + "sonarCloudOrganization": "nolanmm", + "projectKey": "NolanMM_DeepLearning_Quant_Trading_Group_Project" +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..341a386 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +{ + "sonarlint.connectedMode.project": { + "connectionId": "nolanmm", + "projectKey": "NolanMM_DeepLearning_Quant_Trading_Group_Project" + } +} \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties new file mode 100644 index 0000000..ec090cc --- /dev/null +++ b/sonar-project.properties @@ -0,0 +1,13 @@ +sonar.projectKey=NolanMM_DeepLearning_Quant_Trading_Group_Project +sonar.organization=nolanmm + +# This is the name and version displayed in the SonarCloud UI. +#sonar.projectName=DeepLearning_Quant_Trading_Group_Project +#sonar.projectVersion=1.0 + + +# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. +#sonar.sources=. + +# Encoding of the source code. Default is default system encoding +#sonar.sourceEncoding=UTF-8 \ No newline at end of file From 13d7dc3aeb9518712cfcb5b4e96b09156ea75f80 Mon Sep 17 00:00:00 2001 From: NolanM Date: Sun, 23 Jun 2024 20:49:12 -0400 Subject: [PATCH 10/12] Add Download csv function --- 1_HomePage.py | 77 +++- BatchProcess/BatchProcess.py | 20 + .../DataSource/Reddit/RedditDataSource.py | 130 +++++++ Database/PostGreSQLInteraction.py | 367 +----------------- Database/PostGreSQLInteraction_Alchemy.py | 1 - Database/tables/.env | 12 + Database/tables/RedditNewsDatabaseManager.py | 73 ++++ Database/tables/StockDatabaseManager.py | 133 +++++++ Database/tables/TicketDimDatabaseManager.py | 122 ++++++ RealTimeProcess/Consumer.py | 20 +- RealTimeProcess/Producer.py | 41 +- 11 files changed, 589 insertions(+), 407 deletions(-) create mode 100644 BatchProcess/DataSource/Reddit/RedditDataSource.py create mode 100644 Database/tables/.env create mode 100644 Database/tables/RedditNewsDatabaseManager.py create mode 100644 Database/tables/StockDatabaseManager.py create mode 100644 Database/tables/TicketDimDatabaseManager.py diff --git a/1_HomePage.py b/1_HomePage.py index 3487cd2..bc84e69 100644 --- a/1_HomePage.py +++ b/1_HomePage.py @@ -23,8 +23,16 @@ st.markdown( """ """, unsafe_allow_html=True) @@ -53,6 +61,16 @@ def batch_process_retrieve_data_by_stock(the_stock_in): return BatchProcessManager().get_stock_data_by_ticker(the_stock_in) +@st.cache_data +def convert_df_to_csv(df): + return df.to_csv().encode("utf-8") + + +@st.cache_data(ttl=1800) +def batch_process_retrieve_all_data_in_stock_table(): + return BatchProcessManager().get_all_stock_data_in_database() + + PROCESS_TIME = 180 # seconds _list_of_symbols = retrieve_list_ticket() @@ -61,21 +79,56 @@ def batch_process_retrieve_data_by_stock(the_stock_in): if "stock_data" not in st.session_state: st.session_state.stock_data = None st.markdown('---') -st.markdown("### I. Retrieve stock data from database if available") +st.markdown("### I. Retrieve stock data symbol list") the_stock = st.selectbox( - "Select the stock you want to retrieve from database", _list_of_symbols) -btn_prepare = st.button("Retrieve stock data from database...") + "Select the stock you want to retrieve from database (if available)", _list_of_symbols) + +retrieve_col1, retrieve_col2, retrieve_col3 = st.columns(3) +with retrieve_col1: + btn_prepare = st.button("Retrieve stock data from database...") + +# Download data by ticket button +with retrieve_col2: + btn_retrieve_data_by_ticket = st.button( + "Process File for Ticket Data in Database (csv)") + + if btn_retrieve_data_by_ticket: + st.session_state.stock_data = the_stock + df = batch_process_retrieve_data_by_stock(the_stock) + if df is not None: + df = pd.DataFrame(df) + csv = convert_df_to_csv(df) + st.download_button( + label="Download Ticket as CSV", + data=csv, + file_name=f"Ticket_{the_stock}_data.csv", + mime="text/csv", + ) + else: + st.error( + "No data found for this stock, please update the database first.") + +# Download all data in database button +with retrieve_col3: + btn_retrieve_all_data = st.button("Download All Data in Database(csv)") + if btn_retrieve_all_data: + st.session_state.stock_data = the_stock + df = batch_process_retrieve_all_data_in_stock_table() + if df is not None: + csv = convert_df_to_csv(df) + st.download_button( + label="Download All Data as CSV", + data=csv, + file_name="All_Stock_data.csv", + mime="text/csv", + ) + else: + st.error( + "No data found for in database, please update the database first.") if btn_prepare: st.session_state.stock_data = the_stock - # df = batch_process_retrieve_data_by_stock(the_stock) - # df = pd.DataFrame(df) - # if df is not None: - # st.write(df) - # st.write("Done") - # else: - # st.write("No data found for this stock, please update the database first.") st.markdown('---') # --- TABS --- @@ -93,8 +146,8 @@ def batch_process_retrieve_data_by_stock(the_stock_in): with Historical_data: if st.session_state.stock_data is not None: df = batch_process_retrieve_data_by_stock(st.session_state.stock_data) - df = pd.DataFrame(df) if df is not None: + df = pd.DataFrame(df) fig = go.Figure(data=[go.Candlestick(x=df['date'], open=df['open'], high=df['high'], diff --git a/BatchProcess/BatchProcess.py b/BatchProcess/BatchProcess.py index e41b5fe..dc88ebd 100644 --- a/BatchProcess/BatchProcess.py +++ b/BatchProcess/BatchProcess.py @@ -58,7 +58,9 @@ def run_process(self, list_of_symbols_): def get_stock_data_by_ticker(self, ticker): try: + # Create StockDatabaseManager db_manager = StockDatabaseManager() + # Get data by table data = db_manager.get_data_by_table(ticker) db_manager.close_connection() return data @@ -68,10 +70,28 @@ def get_stock_data_by_ticker(self, ticker): def get_stock_list_in_database(self): try: + # Create TicketDimDatabaseManager db_manager = TicketDimDatabaseManager() + # Get data data = db_manager.get_data() db_manager.close_connection() return data except Exception as e: print(e) return None + + def get_all_stock_data_in_database(self): + try: + db_manager = StockDatabaseManager() + data = db_manager.fetch_all_data() + db_manager.close_connection() + dataframes_list = [value for key, value in data.items()] + combined_dataframe = pd.concat(dataframes_list, ignore_index=True) + combined_dataframe['date'] = pd.to_datetime( + combined_dataframe['date']) + + # Sort the combined dataframe by the 'date' column + return combined_dataframe.sort_values(by='date') + except Exception as e: + print(e) + return None diff --git a/BatchProcess/DataSource/Reddit/RedditDataSource.py b/BatchProcess/DataSource/Reddit/RedditDataSource.py new file mode 100644 index 0000000..b0a47a7 --- /dev/null +++ b/BatchProcess/DataSource/Reddit/RedditDataSource.py @@ -0,0 +1,130 @@ +import psycopg2 +import praw +from datetime import datetime +import pandas as pd +from time import sleep +import os +from dotenv import load_dotenv + + +class RedditToPostgres: + def __init__(self): + load_dotenv(override=True) + + self.subreddits = ["trading", "stockmarket", + "investing", "stocks", "wallstreetbets"] + self.fields = ["title", "url", "subreddit", + "score", "num_comments", "ups", "id"] + + self.client_id = os.getenv("REDDIT_CLIENT_ID") + self.client_secret = os.getenv("REDDIT_CLIENT_SECRET") + self.username = os.getenv("REDDIT_USER") + self.password = os.getenv("REDDIT_PASSWORD") + self.user_agent = os.getenv("REDDIT_USER_AGENT") + + self.postgres_url = os.getenv("POSTGRES_URL") + self.postgres_user = os.getenv("POSTGRES_USER") + self.postgres_pass = os.getenv("POSTGRES_PASSWORD") + self.postgres_table = os.getenv("POSTGRES_TABLE") + self.format_file = os.getenv("FORMAT_FILE") + self.mode = os.getenv("MODE") + self.insert_query = os.getenv("INSERT_QUERY") + self.configure_table = os.getenv("CONFIGURE_TABLE") + self.create_table_query = os.getenv("CREATE_TABLE_QUERY") + self.connection_os_postgres = os.getenv("POSTGRE_CONNECTION") + + @staticmethod + def convert_unix_to_datetime(unix_timestamp): + try: + if isinstance(unix_timestamp, str): + if unix_timestamp.isdigit(): + unix_timestamp = int(unix_timestamp) + else: + try: + datetime.strptime(unix_timestamp, '%Y-%m-%d %H:%M:%S') + return unix_timestamp + except ValueError: + raise ValueError("Invalid Unix timestamp format") + elif isinstance(unix_timestamp, int): + pass + else: + raise ValueError("Invalid Unix timestamp format") + + return datetime.utcfromtimestamp(unix_timestamp).strftime('%Y-%m-%d %H:%M:%S') + except Exception as e: + print(f"Error: {e}") + return None + + def init_postgresql(self): + connection = psycopg2.connect(self.connection_os_postgres) + connection.set_client_encoding('UTF8') + cursor = connection.cursor() + cursor.execute(self.create_table_query) + cursor.execute(self.configure_table) + connection.commit() + return connection, cursor + + @staticmethod + def write_to_postgresql(df, cursor, connection, insert_query): + """Write DataFrame to PostgreSQL database.""" + for _, row in df.iterrows(): + date_created_utc = RedditToPostgres.convert_unix_to_datetime( + row["date_created_utc"]) + + if date_created_utc is None: + print( + f"Skipping row due to invalid timestamp: {date_created_utc}") + continue + row["date_created_utc"] = str(row["date_created_utc"]) + data = (row["id"], row["subreddit"], row["url"], row["title"].replace( + '\'', ""), row["score"], row["num_comments"], row["downvotes"], row["ups"], row["date_created_utc"]) + try: + cursor.execute(insert_query, data) + connection.commit() + except Exception as e: + print(f"Error: {e}") + continue + + def init_reddit(self): + """Initialize the reddit instance""" + return praw.Reddit( + client_id=self.client_id, + client_secret=self.client_secret, + user_agent=self.user_agent, + username=self.username, + password=self.password + ) + + def reddit_stream(self, reddit, cursor, connection): + """Stream the data from Reddit""" + rows = [] + while True: + recent_posts = reddit.subreddit( + "+".join(self.subreddits)).hot(limit=10) + for p in recent_posts: + rows_dict = {field: str(getattr(p, field)) + for field in self.fields} + created_utc = str(int(getattr(p, "created_utc"))) + rows_dict["date_created_utc"] = str( + datetime.fromtimestamp(int(created_utc))) + rows_dict["downvotes"] = str( + getattr(p, "ups") - getattr(p, "score")) + rows.append(rows_dict) + df = pd.DataFrame(rows) + with open('reddit.csv', 'a', newline='', encoding='utf-8') as f: + df.to_csv(f, header=f.tell() == 0, index=False) + if not df.empty: + RedditToPostgres.write_to_postgresql( + df, cursor, connection, self.insert_query) + rows.clear() + print(f"Finish write at {datetime.now()}") + sleep(65) + + def main(self): + reddit = self.init_reddit() + connection, cursor = self.init_postgresql() + self.reddit_stream(reddit, cursor, connection) + + +if __name__ == "__main__": + RedditToPostgres().main() diff --git a/Database/PostGreSQLInteraction.py b/Database/PostGreSQLInteraction.py index 26c5c75..d525725 100644 --- a/Database/PostGreSQLInteraction.py +++ b/Database/PostGreSQLInteraction.py @@ -1,8 +1,7 @@ -import plotly.graph_objects as go +from Database.tables.RedditNewsDatabaseManager import RedditNewsDatabaseManager +from Database.tables.TicketDimDatabaseManager import TicketDimDatabaseManager +from Database.tables.StockDatabaseManager import StockDatabaseManager from dotenv import load_dotenv -from datetime import datetime -from psycopg2 import sql -import pandas as pd import psycopg2 import os @@ -14,298 +13,8 @@ postgres_user = os.getenv("DATABASE_USER") postgres_pass = os.getenv("DATABASE_PASSWORD") -create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") -CREATE_REDDIT_TABLE_QUERY = os.getenv("CREATE_REDDIT_TABLE_QUERY") -CONFIGURE_REDDIT_TABLE = os.getenv("CONFIGURE_REDDIT_TABLE") -INSERT_QUERY_REDDIT_TABLE = os.getenv("INSERT_QUERY_REDDIT_TABLE") -CREATE_REDDIT_SCHEMA_QUERY = os.getenv("CREATE_REDDIT_SCHEMA_QUERY") - - -class StockDatabaseManager: - def __init__(self): - """ - Initialize the database connection - """ - self.dbname = postgres_dbname - self.user = postgres_user - self.password = postgres_pass - self.host = postgres_server - self.port = postgres_port - self.conn = self.create_connection() - - def create_connection(self): - """ - Create a connection to the database - """ - try: - conn = psycopg2.connect( - dbname=self.dbname, - user=self.user, - password=self.password, - host=self.host, - port=self.port - ) - return conn - except Exception as e: - print(e) - return None - - def create_schema_and_tables(self, tickers): - """ - Create the schema and tables for the given tickers list - """ - try: - cursor = self.conn.cursor() - - # Create schema if it doesn't exist - cursor.execute(create_schema_query) - - # Loop through each ticker and create the corresponding table - for ticker in tickers: - cursor.execute( - "CREATE TABLE IF NOT EXISTS tickets." + ticker + " (" - "stock_id VARCHAR(10)," - "date VARCHAR(10)," - "open VARCHAR(50)," - "high VARCHAR(50)," - "low VARCHAR(50)," - "close VARCHAR(50)," - "volume VARCHAR(50)," - "PRIMARY KEY (stock_id, date))" - ) - - # Create index on date for faster queries - cursor.execute( - "CREATE INDEX IF NOT EXISTS " + ticker + - "_date_idx ON tickets." + ticker + " (date)" - ) - - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def insert_data(self, ticker, data): - """ - Insert data into the database - """ - try: - cursor = self.conn.cursor() - - # Ensure all data is treated as string - data = data.astype(str) - - insert_query = ( - "INSERT INTO tickets." + ticker + - " (stock_id, date, open, high, low, close, volume)" - " VALUES (%s, %s, %s, %s, %s, %s, %s)" - " ON CONFLICT (stock_id, date) DO UPDATE SET" - " open = EXCLUDED.open," - " high = EXCLUDED.high," - " low = EXCLUDED.low," - " close = EXCLUDED.close," - " volume = EXCLUDED.volume" - ) - - for index, row in data.iterrows(): - cursor.execute(insert_query, (row['stock_id'], row['date'], - row['open'], row['high'], row['low'], row['close'], row['volume'])) - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def get_data_by_table(self, table_name): - """ - Get data from the given ticket table - """ - try: - query = f"SELECT * FROM tickets.{table_name}" - data = pd.read_sql(query, self.conn) - return data - except Exception as e: - print(e) - return None - - def get_tables(self, schema='tickets'): - """ - Get all tables in the given schema - """ - try: - cursor = self.conn.cursor() - cursor.execute( - "SELECT table_name FROM information_schema.tables " - "WHERE table_schema = %s", (schema,) - ) - tables = cursor.fetchall() - cursor.close() - return [table[0] for table in tables] - except Exception as e: - print(e) - return None - - def fetch_all_data(self, schema='tickets'): - """ - Fetch all data from the given schema - """ - try: - tables = self.get_tables(schema) - all_data = {} - for table in tables: - query = "SELECT * FROM " + schema + "." + table - df = pd.read_sql(query, self.conn) - all_data[table] = df - return all_data - except Exception as e: - print(e) - return None - - def close_connection(self): - if self.conn: - try: - self.conn.close() - except Exception as e: - print(e) - - -class TicketDimDatabaseManager: - def __init__(self): - """ - Initialize the database connection - """ - self.dbname = postgres_dbname - self.user = postgres_user - self.password = postgres_pass - self.host = postgres_server - self.port = postgres_port - self.conn = self.create_connection() - - def create_connection(self): - """ - Create a connection to the database - """ - try: - conn = psycopg2.connect( - dbname=self.dbname, - user=self.user, - password=self.password, - host=self.host, - port=self.port - ) - return conn - except Exception as e: - print(e) - return None - - def create_table(self): - """ - Create the ticket_dim table - """ - try: - cursor = self.conn.cursor() - - # Create schema if it doesn't exist - cursor.execute(create_schema_query) - - # Create the ticket_dim table - cursor.execute( - "CREATE TABLE IF NOT EXISTS tickets.ticket_dim (" - "symbol VARCHAR(10) PRIMARY KEY," - "company_name VARCHAR(255) NULL," - "established DATE NULL," - "sector VARCHAR(100) NULL," - "industry VARCHAR(100) NULL," - "exchange VARCHAR(50) NULL" - ")" - ) - - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def insert_data(self, data): - """ - Insert data into the ticket_dim table - """ - try: - if isinstance(data, list): - data = pd.DataFrame(data, columns=['symbol']) - data['company_name'] = None - data['established'] = None - data['sector'] = None - data['industry'] = None - data['exchange'] = None - - cursor = self.conn.cursor() - - # Ensure all data is treated as string - # df_data = pd.DataFrame(data_in) - # data = df_data.astype(str) - - insert_query = ( - "INSERT INTO tickets.ticket_dim (symbol, company_name, established, sector, industry, exchange)" - " VALUES (%s, %s, %s, %s, %s, %s)" - " ON CONFLICT (symbol) DO UPDATE SET" - " company_name = EXCLUDED.company_name," - " established = EXCLUDED.established," - " sector = EXCLUDED.sector," - " industry = EXCLUDED.industry," - " exchange = EXCLUDED.exchange" - ) - - for index, row in data.iterrows(): - cursor.execute(insert_query, (row['symbol'], row.get('company_name'), - row.get('established'), row.get('sector'), row.get('industry'), row.get('exchange'))) - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def get_data(self): - """ - Get all data from the ticket_dim table - """ - try: - cursor = self.conn.cursor() - cursor.execute( - "SELECT * FROM tickets.ticket_dim" - ) - data = cursor.fetchall() - cursor.close() - # Convert data to list - data = [list(row)[0] for row in data] - return data - except Exception as e: - print(e) - return None - - def search_ticker(self, symbol): - """ - Search for a specific ticker by its symbol - """ - try: - cursor = self.conn.cursor() - cursor.execute( - "SELECT * FROM tickets.ticket_dim WHERE symbol = %s", (symbol,) - ) - data = cursor.fetchone() - cursor.close() - return data - except Exception as e: - print(e) - return None - - def close_connection(self): - if self.conn: - try: - self.conn.close() - except Exception as e: - print(e) - - -class RedditNewsDatabaseManager: +class DatabaseManager: def __init__(self): """ Initialize the database connection @@ -316,6 +25,9 @@ def __init__(self): self.host = postgres_server self.port = postgres_port self.conn = self.create_connection() + self.StockDatabaseManager = StockDatabaseManager(self.conn) + self.TicketDimDatabaseManager = TicketDimDatabaseManager(self.conn) + self.RedditNewsDatabaseManager = RedditNewsDatabaseManager(self.conn) def create_connection(self): """ @@ -334,71 +46,6 @@ def create_connection(self): print(e) return None - def create_schema_and_tables(self): - """ - Create the stock_reddit_news table - """ - try: - cursor = self.conn.cursor() - cursor.execute(CREATE_REDDIT_SCHEMA_QUERY) - cursor.execute(CREATE_REDDIT_TABLE_QUERY) - cursor.execute(CONFIGURE_REDDIT_TABLE) - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def insert_data(self, data): - """ - Insert data into the stock_reddit_news table - """ - try: - cursor = self.conn.cursor() - insert_query = INSERT_QUERY_REDDIT_TABLE - - for index, row in data.iterrows(): - cursor.execute(insert_query, (row["id"], row["subreddit"], row["url"], row["title"].replace('\'', ""), - row["score"], row["num_comments"], row["downvotes"], row["ups"], row["date_created_utc"])) - self.conn.commit() - cursor.close() - except Exception as e: - print(e) - - def get_news_by_ticker(self, ticker): - """ - Get news from the stock_reddit_news table corresponding to a specific ticker - """ - try: - cursor = self.conn.cursor() - query = """ - SELECT * FROM reddits.stock_reddit_news - WHERE LOWER(title) LIKE %s - """ - cursor.execute(query, ('%' + ticker.lower() + '%',)) - data = cursor.fetchall() - cursor.close() - return data - except Exception as e: - print(e) - return None - - def close_connection(self): - if self.conn: - try: - self.conn.close() - except Exception as e: - print(e) - - -class DatabaseManager: - def __init__(self): - """ - Initialize the database connection - """ - self.StockDatabaseManager = StockDatabaseManager() - self.TicketDimDatabaseManager = TicketDimDatabaseManager() - self.RedditNewsDatabaseManager = RedditNewsDatabaseManager() - def delete_schema(self): try: # Fix later diff --git a/Database/PostGreSQLInteraction_Alchemy.py b/Database/PostGreSQLInteraction_Alchemy.py index bfc96d8..5ceef96 100644 --- a/Database/PostGreSQLInteraction_Alchemy.py +++ b/Database/PostGreSQLInteraction_Alchemy.py @@ -48,7 +48,6 @@ def create_schema_and_tables(self, tickers): def insert_data(self, ticker, data): table = Table(ticker, self.metadata, autoload_with=self.engine) - # Ensure all data is treated as string data = data.astype(str) try: with self.engine.connect() as connection: diff --git a/Database/tables/.env b/Database/tables/.env new file mode 100644 index 0000000..8ed62df --- /dev/null +++ b/Database/tables/.env @@ -0,0 +1,12 @@ +DATABASE_SERVER="localhost" +DATABASE_PORT="5432" +DATABASE_NAME="postgres" +DATABASE_USER="postgres" +DATABASE_PASSWORD="admin" +CREATE_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS tickets;" + +INSERT_QUERY_REDDIT_TABLE="INSERT INTO reddits.stock_reddit_news (id, subreddit, url, title, score, num_comments, downvotes, ups, date_created_utc) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) ON CONFLICT (id) DO NOTHING;" +POSTGRE_CONNECTION="dbname=postgres user=postgres host=localhost password=admin" +CONFIGURE_REDDIT_TABLE = "CREATE INDEX IF NOT EXISTS idx_stock_reddit_news_id ON reddits.stock_reddit_news(id);" +CREATE_REDDIT_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS reddits.stock_reddit_news (id VARCHAR PRIMARY KEY, subreddit VARCHAR, url VARCHAR, title TEXT, score TEXT, num_comments TEXT, downvotes TEXT, ups TEXT, date_created_utc TEXT);" +CREATE_REDDIT_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS reddits;" diff --git a/Database/tables/RedditNewsDatabaseManager.py b/Database/tables/RedditNewsDatabaseManager.py new file mode 100644 index 0000000..749e878 --- /dev/null +++ b/Database/tables/RedditNewsDatabaseManager.py @@ -0,0 +1,73 @@ +from dotenv import load_dotenv +import psycopg2 +import os + +load_dotenv(override=True) + +CREATE_REDDIT_TABLE_QUERY = os.getenv("CREATE_REDDIT_TABLE_QUERY") +CONFIGURE_REDDIT_TABLE = os.getenv("CONFIGURE_REDDIT_TABLE") +INSERT_QUERY_REDDIT_TABLE = os.getenv("INSERT_QUERY_REDDIT_TABLE") +CREATE_REDDIT_SCHEMA_QUERY = os.getenv("CREATE_REDDIT_SCHEMA_QUERY") + + +class RedditNewsDatabaseManager: + def __init__(self, con_: psycopg2.extensions.connection): + """ + Initialize the database connection + """ + self.conn = con_ + + def create_schema_and_tables(self): + """ + Create the stock_reddit_news table + """ + try: + cursor = self.conn.cursor() + cursor.execute(CREATE_REDDIT_SCHEMA_QUERY) + cursor.execute(CREATE_REDDIT_TABLE_QUERY) + cursor.execute(CONFIGURE_REDDIT_TABLE) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def insert_data(self, data): + """ + Insert data into the stock_reddit_news table + """ + try: + cursor = self.conn.cursor() + insert_query = INSERT_QUERY_REDDIT_TABLE + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row["id"], row["subreddit"], row["url"], row["title"].replace('\'', ""), + row["score"], row["num_comments"], row["downvotes"], row["ups"], row["date_created_utc"])) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_news_by_ticker(self, ticker): + """ + Get news from the stock_reddit_news table corresponding to a specific ticker + """ + try: + cursor = self.conn.cursor() + query = """ + SELECT * FROM reddits.stock_reddit_news + WHERE LOWER(title) LIKE %s + """ + cursor.execute(query, ('%' + ticker.lower() + '%',)) + data = cursor.fetchall() + cursor.close() + return data + except Exception as e: + print(e) + return None + + def close_connection(self): + if self.conn: + try: + self.conn.close() + except Exception as e: + print(e) diff --git a/Database/tables/StockDatabaseManager.py b/Database/tables/StockDatabaseManager.py new file mode 100644 index 0000000..c2f4320 --- /dev/null +++ b/Database/tables/StockDatabaseManager.py @@ -0,0 +1,133 @@ +from dotenv import load_dotenv +import pandas as pd +import psycopg2 +import os + +load_dotenv(override=True) + +create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") + + +class StockDatabaseManager: + def __init__(self, con_: psycopg2.extensions.connection): + """ + Initialize the database connection + """ + self.conn = con_ + + def create_schema_and_tables(self, tickers): + """ + Create the schema and tables for the given tickers list + """ + try: + cursor = self.conn.cursor() + + # Create schema if it doesn't exist + cursor.execute(create_schema_query) + + # Loop through each ticker and create the corresponding table + for ticker in tickers: + cursor.execute( + "CREATE TABLE IF NOT EXISTS tickets." + ticker + " (" + "stock_id VARCHAR(10)," + "date VARCHAR(10)," + "open VARCHAR(50)," + "high VARCHAR(50)," + "low VARCHAR(50)," + "close VARCHAR(50)," + "volume VARCHAR(50)," + "PRIMARY KEY (stock_id, date))" + ) + + # Create index on date for faster queries + cursor.execute( + "CREATE INDEX IF NOT EXISTS " + ticker + + "_date_idx ON tickets." + ticker + " (date)" + ) + + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def insert_data(self, ticker, data): + """ + Insert data into the database + """ + try: + cursor = self.conn.cursor() + + # Ensure all data is treated as string + data = data.astype(str) + + insert_query = ( + "INSERT INTO tickets." + ticker + + " (stock_id, date, open, high, low, close, volume)" + " VALUES (%s, %s, %s, %s, %s, %s, %s)" + " ON CONFLICT (stock_id, date) DO UPDATE SET" + " open = EXCLUDED.open," + " high = EXCLUDED.high," + " low = EXCLUDED.low," + " close = EXCLUDED.close," + " volume = EXCLUDED.volume" + ) + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row['stock_id'], row['date'], + row['open'], row['high'], row['low'], row['close'], row['volume'])) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_data_by_table(self, table_name): + """ + Get data from the given ticket table + """ + try: + query = f"SELECT * FROM tickets.{table_name}" + data = pd.read_sql(query, self.conn) + return data + except Exception as e: + print(e) + return None + + def get_tables(self, schema='tickets'): + """ + Get all tables in the given schema + """ + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT table_name FROM information_schema.tables " + "WHERE table_schema = %s", (schema,) + ) + tables = cursor.fetchall() + cursor.close() + return [table[0] for table in tables] + except Exception as e: + print(e) + return None + + def fetch_all_data(self, schema='tickets'): + """ + Fetch all data from the given schema + """ + try: + tables = self.get_tables(schema) + all_data = {} + for table in tables: + query = "SELECT * FROM " + schema + "." + table + df = pd.read_sql(query, self.conn) + all_data[table] = df + return all_data + except Exception as e: + print(e) + return None + + def close_connection(self): + if self.conn: + try: + self.conn.close() + except Exception as e: + print(e) diff --git a/Database/tables/TicketDimDatabaseManager.py b/Database/tables/TicketDimDatabaseManager.py new file mode 100644 index 0000000..824e318 --- /dev/null +++ b/Database/tables/TicketDimDatabaseManager.py @@ -0,0 +1,122 @@ +from dotenv import load_dotenv +import pandas as pd +import psycopg2 +import os + +load_dotenv(override=True) + +create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") + + +class TicketDimDatabaseManager: + def __init__(self, con_: psycopg2.extensions.connection): + """ + Initialize the database connection + """ + self.conn = con_ + + def create_table(self): + """ + Create the ticket_dim table + """ + try: + cursor = self.conn.cursor() + + # Create schema if it doesn't exist + cursor.execute(create_schema_query) + + # Create the ticket_dim table + cursor.execute( + "CREATE TABLE IF NOT EXISTS tickets.ticket_dim (" + "symbol VARCHAR(10) PRIMARY KEY," + "company_name VARCHAR(255) NULL," + "established DATE NULL," + "sector VARCHAR(100) NULL," + "industry VARCHAR(100) NULL," + "exchange VARCHAR(50) NULL" + ")" + ) + + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def insert_data(self, data): + """ + Insert data into the ticket_dim table + """ + try: + if isinstance(data, list): + data = pd.DataFrame(data, columns=['symbol']) + data['company_name'] = None + data['established'] = None + data['sector'] = None + data['industry'] = None + data['exchange'] = None + + cursor = self.conn.cursor() + + # Ensure all data is treated as string + # df_data = pd.DataFrame(data_in) + # data = df_data.astype(str) + + insert_query = ( + "INSERT INTO tickets.ticket_dim (symbol, company_name, established, sector, industry, exchange)" + " VALUES (%s, %s, %s, %s, %s, %s)" + " ON CONFLICT (symbol) DO UPDATE SET" + " company_name = EXCLUDED.company_name," + " established = EXCLUDED.established," + " sector = EXCLUDED.sector," + " industry = EXCLUDED.industry," + " exchange = EXCLUDED.exchange" + ) + + for index, row in data.iterrows(): + cursor.execute(insert_query, (row['symbol'], row.get('company_name'), + row.get('established'), row.get('sector'), row.get('industry'), row.get('exchange'))) + self.conn.commit() + cursor.close() + except Exception as e: + print(e) + + def get_data(self): + """ + Get all data from the ticket_dim table + """ + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT * FROM tickets.ticket_dim" + ) + data = cursor.fetchall() + cursor.close() + # Convert data to list + data = [list(row)[0] for row in data] + return data + except Exception as e: + print(e) + return None + + def search_ticker(self, symbol): + """ + Search for a specific ticker by its symbol + """ + try: + cursor = self.conn.cursor() + cursor.execute( + "SELECT * FROM tickets.ticket_dim WHERE symbol = %s", (symbol,) + ) + data = cursor.fetchone() + cursor.close() + return data + except Exception as e: + print(e) + return None + + def close_connection(self): + if self.conn: + try: + self.conn.close() + except Exception as e: + print(e) diff --git a/RealTimeProcess/Consumer.py b/RealTimeProcess/Consumer.py index 491fbe0..9a40502 100644 --- a/RealTimeProcess/Consumer.py +++ b/RealTimeProcess/Consumer.py @@ -5,26 +5,18 @@ import os -class KafkaSparkConsumerStreaming: +class KafkaSparkRedditConsumerStreaming: def __init__(self): - load_dotenv("../.env",override=True) + load_dotenv(override=True) # Load environment variables self.kafka_v = os.getenv("KAFKA_VERSION") self.kafka_server = os.getenv("KAFKA_SERVER") - self.kafka_topic = os.getenv("KAFKA_TOPIC") - - self.column_1_name = os.getenv("COLUMN_1") - self.column_2_name = os.getenv("COLUMN_2") - self.column_3_name = os.getenv("COLUMN_3") - - self.checkpoint_location = os.getenv("CHECKPOINT_LOCATION") self.postgres_v = os.getenv("POSTGRES_VERSION") self.postgres_url = os.getenv("POSTGRES_URL") self.postgres_user = os.getenv("POSTGRES_USER") self.postgres_pass = os.getenv("POSTGRES_PASSWORD") - self.postgres_table = os.getenv("POSTGRES_TABLE") self.format_file = os.getenv("FORMAT_FILE") self._mode = os.getenv("MODE") @@ -69,10 +61,12 @@ def start_streaming(self): value_df = df.selectExpr("CAST(value AS STRING)") # Convert JSON string to DataFrame - json_df = value_df.select(from_json(col("value"), self.schema).alias("data")).select("data.*") + json_df = value_df.select( + from_json(col("value"), self.schema).alias("data")).select("data.*") # Convert event_time to timestamp - json_df = json_df.withColumn(self.column_3_name, to_timestamp(col(self.column_3_name))) + json_df = json_df.withColumn( + self.column_3_name, to_timestamp(col(self.column_3_name))) self.query = json_df.writeStream \ .foreachBatch(self._write_streaming) \ @@ -90,7 +84,7 @@ def stop_streaming(self): # Create an instance of the class and start/stop streaming if __name__ == "__main__": - kafka_spark_streaming = KafkaSparkConsumerStreaming() + kafka_spark_streaming = KafkaSparkRedditConsumerStreaming() try: kafka_spark_streaming.start_streaming() except KeyboardInterrupt: diff --git a/RealTimeProcess/Producer.py b/RealTimeProcess/Producer.py index 2306b1e..ac26cb2 100644 --- a/RealTimeProcess/Producer.py +++ b/RealTimeProcess/Producer.py @@ -3,29 +3,28 @@ import pandas as pd from dotenv import load_dotenv import os -from ListSnP500.ListSnP500Collect import ListSAndP500 -from YahooFinance.YahooFinances_Services import YahooFinance -class FactPriceProducerStreaming: +class KafkaProducerService: def __init__(self): load_dotenv(override=True) - self.list_of_symbols = ListSAndP500().tickers_list - self.start = '2015-01-01' - self.end = '2024-01-01' - self.results = self.manipulate() - - - def manipulate(self): - yahoo = YahooFinance(self.list_of_symbols, self.start, self.end).results - return yahoo - - -def main(): - streamer = FactPriceProducerStreaming() - streamer_result = streamer.results - print(len(streamer_result)) - -if __name__ == "__main__": - main() \ No newline at end of file + self.bootstrap_servers = os.getenv('BOOTSTRAP_SERVERS') + self.socket_url = os.getenv('SOCKET_URL') + + self.producer = KafkaProducer( + bootstrap_servers=self.bootstrap_servers, + value_serializer=lambda v: json.dumps(v).encode('utf-8') + ) + + def send_reddit_dataframe(self, data: pd.DataFrame): + try: + # Convert DataFrame to a dictionary + data_dict = data.to_dict(orient='records') + # Send each record in the dictionary + for record in data_dict: + self.producer.send("reddit-stream", value=record) + self.producer.flush() + except Exception as e: + print(f"Error: {e}") + return None From c7cfe69199dcc4154b7726f572d57d87015715b8 Mon Sep 17 00:00:00 2001 From: NolanM Date: Sun, 23 Jun 2024 21:26:20 -0400 Subject: [PATCH 11/12] Fixing Database bugs --- BatchProcess/.env | 12 ++++++ BatchProcess/BatchProcess.py | 41 ++++++++++++++++++-- Database/tables/RedditNewsDatabaseManager.py | 2 +- Database/tables/StockDatabaseManager.py | 2 +- Database/tables/TicketDimDatabaseManager.py | 2 +- 5 files changed, 52 insertions(+), 7 deletions(-) diff --git a/BatchProcess/.env b/BatchProcess/.env index e69de29..8ed62df 100644 --- a/BatchProcess/.env +++ b/BatchProcess/.env @@ -0,0 +1,12 @@ +DATABASE_SERVER="localhost" +DATABASE_PORT="5432" +DATABASE_NAME="postgres" +DATABASE_USER="postgres" +DATABASE_PASSWORD="admin" +CREATE_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS tickets;" + +INSERT_QUERY_REDDIT_TABLE="INSERT INTO reddits.stock_reddit_news (id, subreddit, url, title, score, num_comments, downvotes, ups, date_created_utc) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s) ON CONFLICT (id) DO NOTHING;" +POSTGRE_CONNECTION="dbname=postgres user=postgres host=localhost password=admin" +CONFIGURE_REDDIT_TABLE = "CREATE INDEX IF NOT EXISTS idx_stock_reddit_news_id ON reddits.stock_reddit_news(id);" +CREATE_REDDIT_TABLE_QUERY = "CREATE TABLE IF NOT EXISTS reddits.stock_reddit_news (id VARCHAR PRIMARY KEY, subreddit VARCHAR, url VARCHAR, title TEXT, score TEXT, num_comments TEXT, downvotes TEXT, ups TEXT, date_created_utc TEXT);" +CREATE_REDDIT_SCHEMA_QUERY="CREATE SCHEMA IF NOT EXISTS reddits;" diff --git a/BatchProcess/BatchProcess.py b/BatchProcess/BatchProcess.py index dc88ebd..c63983b 100644 --- a/BatchProcess/BatchProcess.py +++ b/BatchProcess/BatchProcess.py @@ -1,19 +1,52 @@ from Database.PostGreSQLInteraction import DatabaseManager, StockDatabaseManager, TicketDimDatabaseManager, RedditNewsDatabaseManager from BatchProcess.DataSource.YahooFinance.YahooFinances_Services import YahooFinance from BatchProcess.DataSource.ListSnP500.ListSnP500Collect import ListSAndP500 +from dotenv import load_dotenv from datetime import datetime import pandas as pd - +import psycopg2 +import os defaut_start_date = "2014-01-01" date_to = datetime.now().strftime('%Y-%m-%d') +load_dotenv(override=True) + +postgres_server = os.getenv("DATABASE_SERVER") +postgres_port = os.getenv("DATABASE_PORT") +postgres_dbname = os.getenv("DATABASE_NAME") +postgres_user = os.getenv("DATABASE_USER") +postgres_pass = os.getenv("DATABASE_PASSWORD") + class BatchProcessManager: def __init__(self): self.list_of_symbols = None self.dict_ticket = dict() + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None def run_process(self, list_of_symbols_): self.list_of_symbols = list_of_symbols_ @@ -59,7 +92,7 @@ def run_process(self, list_of_symbols_): def get_stock_data_by_ticker(self, ticker): try: # Create StockDatabaseManager - db_manager = StockDatabaseManager() + db_manager = StockDatabaseManager(self.conn) # Get data by table data = db_manager.get_data_by_table(ticker) db_manager.close_connection() @@ -71,7 +104,7 @@ def get_stock_data_by_ticker(self, ticker): def get_stock_list_in_database(self): try: # Create TicketDimDatabaseManager - db_manager = TicketDimDatabaseManager() + db_manager = TicketDimDatabaseManager(self.conn) # Get data data = db_manager.get_data() db_manager.close_connection() @@ -82,7 +115,7 @@ def get_stock_list_in_database(self): def get_all_stock_data_in_database(self): try: - db_manager = StockDatabaseManager() + db_manager = StockDatabaseManager(self.conn) data = db_manager.fetch_all_data() db_manager.close_connection() dataframes_list = [value for key, value in data.items()] diff --git a/Database/tables/RedditNewsDatabaseManager.py b/Database/tables/RedditNewsDatabaseManager.py index 749e878..3614e82 100644 --- a/Database/tables/RedditNewsDatabaseManager.py +++ b/Database/tables/RedditNewsDatabaseManager.py @@ -11,7 +11,7 @@ class RedditNewsDatabaseManager: - def __init__(self, con_: psycopg2.extensions.connection): + def __init__(self, con_): """ Initialize the database connection """ diff --git a/Database/tables/StockDatabaseManager.py b/Database/tables/StockDatabaseManager.py index c2f4320..e7ab18f 100644 --- a/Database/tables/StockDatabaseManager.py +++ b/Database/tables/StockDatabaseManager.py @@ -9,7 +9,7 @@ class StockDatabaseManager: - def __init__(self, con_: psycopg2.extensions.connection): + def __init__(self, con_): """ Initialize the database connection """ diff --git a/Database/tables/TicketDimDatabaseManager.py b/Database/tables/TicketDimDatabaseManager.py index 824e318..b46cb7c 100644 --- a/Database/tables/TicketDimDatabaseManager.py +++ b/Database/tables/TicketDimDatabaseManager.py @@ -9,7 +9,7 @@ class TicketDimDatabaseManager: - def __init__(self, con_: psycopg2.extensions.connection): + def __init__(self, con_): """ Initialize the database connection """ From 85dadb8d07e1576a12915c996724ee3d47e828f5 Mon Sep 17 00:00:00 2001 From: NolanM Date: Mon, 24 Jun 2024 13:23:04 -0400 Subject: [PATCH 12/12] Fixing Database --- .github/workflows/build.yml | 20 ------------ BatchProcess/BatchProcess.py | 7 ++--- Database/PostGreSQLInteraction.py | 6 ++-- Database/tables/RedditNewsDatabaseManager.py | 32 ++++++++++++++++++-- Database/tables/StockDatabaseManager.py | 31 +++++++++++++++++-- Database/tables/TicketDimDatabaseManager.py | 31 +++++++++++++++++-- sonar-project.properties | 13 -------- 7 files changed, 93 insertions(+), 47 deletions(-) delete mode 100644 .github/workflows/build.yml delete mode 100644 sonar-project.properties diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml deleted file mode 100644 index 52cc8ba..0000000 --- a/.github/workflows/build.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Build -on: - push: - branches: - - Development-Batch-Process-Retrieve-Historical-Data - pull_request: - types: [opened, synchronize, reopened] -jobs: - sonarcloud: - name: SonarCloud - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - with: - fetch-depth: 0 # Shallow clones should be disabled for a better relevancy of analysis - - name: SonarCloud Scan - uses: SonarSource/sonarcloud-github-action@master - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # Needed to get PR information, if any - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} \ No newline at end of file diff --git a/BatchProcess/BatchProcess.py b/BatchProcess/BatchProcess.py index c63983b..2fa5315 100644 --- a/BatchProcess/BatchProcess.py +++ b/BatchProcess/BatchProcess.py @@ -1,6 +1,5 @@ from Database.PostGreSQLInteraction import DatabaseManager, StockDatabaseManager, TicketDimDatabaseManager, RedditNewsDatabaseManager from BatchProcess.DataSource.YahooFinance.YahooFinances_Services import YahooFinance -from BatchProcess.DataSource.ListSnP500.ListSnP500Collect import ListSAndP500 from dotenv import load_dotenv from datetime import datetime import pandas as pd @@ -92,7 +91,7 @@ def run_process(self, list_of_symbols_): def get_stock_data_by_ticker(self, ticker): try: # Create StockDatabaseManager - db_manager = StockDatabaseManager(self.conn) + db_manager = StockDatabaseManager() # Get data by table data = db_manager.get_data_by_table(ticker) db_manager.close_connection() @@ -104,7 +103,7 @@ def get_stock_data_by_ticker(self, ticker): def get_stock_list_in_database(self): try: # Create TicketDimDatabaseManager - db_manager = TicketDimDatabaseManager(self.conn) + db_manager = TicketDimDatabaseManager() # Get data data = db_manager.get_data() db_manager.close_connection() @@ -115,7 +114,7 @@ def get_stock_list_in_database(self): def get_all_stock_data_in_database(self): try: - db_manager = StockDatabaseManager(self.conn) + db_manager = StockDatabaseManager() data = db_manager.fetch_all_data() db_manager.close_connection() dataframes_list = [value for key, value in data.items()] diff --git a/Database/PostGreSQLInteraction.py b/Database/PostGreSQLInteraction.py index d525725..ea743ff 100644 --- a/Database/PostGreSQLInteraction.py +++ b/Database/PostGreSQLInteraction.py @@ -25,9 +25,9 @@ def __init__(self): self.host = postgres_server self.port = postgres_port self.conn = self.create_connection() - self.StockDatabaseManager = StockDatabaseManager(self.conn) - self.TicketDimDatabaseManager = TicketDimDatabaseManager(self.conn) - self.RedditNewsDatabaseManager = RedditNewsDatabaseManager(self.conn) + self.StockDatabaseManager = StockDatabaseManager() + self.TicketDimDatabaseManager = TicketDimDatabaseManager() + self.RedditNewsDatabaseManager = RedditNewsDatabaseManager() def create_connection(self): """ diff --git a/Database/tables/RedditNewsDatabaseManager.py b/Database/tables/RedditNewsDatabaseManager.py index 3614e82..af1ce2c 100644 --- a/Database/tables/RedditNewsDatabaseManager.py +++ b/Database/tables/RedditNewsDatabaseManager.py @@ -3,7 +3,11 @@ import os load_dotenv(override=True) - +postgres_server = os.getenv("DATABASE_SERVER") +postgres_port = os.getenv("DATABASE_PORT") +postgres_dbname = os.getenv("DATABASE_NAME") +postgres_user = os.getenv("DATABASE_USER") +postgres_pass = os.getenv("DATABASE_PASSWORD") CREATE_REDDIT_TABLE_QUERY = os.getenv("CREATE_REDDIT_TABLE_QUERY") CONFIGURE_REDDIT_TABLE = os.getenv("CONFIGURE_REDDIT_TABLE") INSERT_QUERY_REDDIT_TABLE = os.getenv("INSERT_QUERY_REDDIT_TABLE") @@ -11,11 +15,33 @@ class RedditNewsDatabaseManager: - def __init__(self, con_): + def __init__(self): """ Initialize the database connection """ - self.conn = con_ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None def create_schema_and_tables(self): """ diff --git a/Database/tables/StockDatabaseManager.py b/Database/tables/StockDatabaseManager.py index e7ab18f..bcd52f3 100644 --- a/Database/tables/StockDatabaseManager.py +++ b/Database/tables/StockDatabaseManager.py @@ -6,14 +6,41 @@ load_dotenv(override=True) create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") +postgres_server = os.getenv("DATABASE_SERVER") +postgres_port = os.getenv("DATABASE_PORT") +postgres_dbname = os.getenv("DATABASE_NAME") +postgres_user = os.getenv("DATABASE_USER") +postgres_pass = os.getenv("DATABASE_PASSWORD") class StockDatabaseManager: - def __init__(self, con_): + def __init__(self): """ Initialize the database connection """ - self.conn = con_ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None def create_schema_and_tables(self, tickers): """ diff --git a/Database/tables/TicketDimDatabaseManager.py b/Database/tables/TicketDimDatabaseManager.py index b46cb7c..7968749 100644 --- a/Database/tables/TicketDimDatabaseManager.py +++ b/Database/tables/TicketDimDatabaseManager.py @@ -6,14 +6,41 @@ load_dotenv(override=True) create_schema_query = os.getenv("CREATE_SCHEMA_QUERY") +postgres_server = os.getenv("DATABASE_SERVER") +postgres_port = os.getenv("DATABASE_PORT") +postgres_dbname = os.getenv("DATABASE_NAME") +postgres_user = os.getenv("DATABASE_USER") +postgres_pass = os.getenv("DATABASE_PASSWORD") class TicketDimDatabaseManager: - def __init__(self, con_): + def __init__(self): """ Initialize the database connection """ - self.conn = con_ + self.dbname = postgres_dbname + self.user = postgres_user + self.password = postgres_pass + self.host = postgres_server + self.port = postgres_port + self.conn = self.create_connection() + + def create_connection(self): + """ + Create a connection to the database + """ + try: + conn = psycopg2.connect( + dbname=self.dbname, + user=self.user, + password=self.password, + host=self.host, + port=self.port + ) + return conn + except Exception as e: + print(e) + return None def create_table(self): """ diff --git a/sonar-project.properties b/sonar-project.properties deleted file mode 100644 index ec090cc..0000000 --- a/sonar-project.properties +++ /dev/null @@ -1,13 +0,0 @@ -sonar.projectKey=NolanMM_DeepLearning_Quant_Trading_Group_Project -sonar.organization=nolanmm - -# This is the name and version displayed in the SonarCloud UI. -#sonar.projectName=DeepLearning_Quant_Trading_Group_Project -#sonar.projectVersion=1.0 - - -# Path is relative to the sonar-project.properties file. Replace "\" by "/" on Windows. -#sonar.sources=. - -# Encoding of the source code. Default is default system encoding -#sonar.sourceEncoding=UTF-8 \ No newline at end of file