Hi, in the following Youtube video, I am using Python to download multiple stock prices from Yahoo Finance and using Excel PivotTable to analyze the data. The source code is after the video.
The Python code:
# %%
import pandas as pd
import numpy as np
import os
import matplotlib.pyplot as plt
import matplotlib as mpl
# import seaborn as sb
import yfinance as yf
import datetime
import warnings
warnings.filterwarnings("ignore")
plt.style.use("ggplot")
np.printoptions(precision = 3)
mpl.rcParams["axes.grid"] = True
mpl.rcParams["grid.alpha"] = 0.25
mpl.rcParams["grid.color"] = "grey"
# from pandas_datareader import data as pdr
# yf.pdr_override() - Obsoleted
# %% [markdown]
# #### Initialize Variables
# %%
start = datetime.date(2024,1,1)
end = datetime.date(2025,6,18)
start_date = start.strftime('%Y-%m-%d')
end_date = end.strftime('%Y-%m-%d')
excel_path = 'C:/Users/test/Documents/Algo/Code/Algo/' +'stocks_prices_' + start_date + '_' + end_date + '.xlsx'
# %%
df = yf.download('MSFT', start , end)
df
# %% [markdown]
# #### Define Functions
# %%
def single_data(ticker):
df = yf.download(ticker, start , end)
df.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in df.columns]
df1 = df.reset_index()
df1.insert(0, 'Ticker', 'MSFT')
df_final = df1.rename(columns={df1.columns[0] : 'Ticker', df1.columns[1]: 'Date', df1.columns[2]: 'Close',
df1.columns[3]: 'High', df1.columns[4]: 'Low',df1.columns[5]: 'Open',
df1.columns[6]: 'Volume'
})
return df_final
# %% [markdown]
# #### Download sigle tickers
# %%
msft = single_data("MSFT")
print(msft)
# %%
print(msft.columns)
# %% [markdown]
# #### Download multiple tickers
# %%
TICKERS = ["MSFT", "AAPL", "GOOG", "AMZN"]
# %%
def all_data(TICKERS):
def single_data(ticker):
df = yf.download(ticker, start , end)
df.columns = ['_'.join(col).strip() if isinstance(col, tuple) else col for col in df.columns]
df1 = df.reset_index()
df1.insert(0, 'Ticker', ticker)
df_final = df1.rename(columns={df1.columns[0] : 'Ticker', df1.columns[1]: 'Date', df1.columns[2]: 'Close',
df1.columns[3]: 'High', df1.columns[4]: 'Low',df1.columns[5]: 'Open',
df1.columns[6]: 'Volume'
})
return df_final
interim = map(single_data, TICKERS)
return pd.concat(interim)
# %%
stocks_data = all_data(TICKERS)
# %%
# Set proces to 2 decimal places
cols_to_round = ['Close', 'High', 'Low', 'Open']
stocks_data[cols_to_round] = stocks_data[cols_to_round].round(2)
stocks_data
# %% [markdown]
# #### Check if data for all tickers matches
# %%
# Check data if complete
TICKERS = stocks_data['Ticker'].unique()
min_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].min()
print(min_dates_each_ticker)
max_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].max()
print(max_dates_each_ticker)
count_dates_each_ticker = stocks_data.groupby('Ticker')['Date'].count()
print(count_dates_each_ticker)
# %%
# Transfer dataframe to Excel
if os.path.exists(excel_path):
os.remove(excel_path)
stocks_data.to_excel(excel_path, index = False)
# %% [markdown]
# #### Split the datafrom to individual ticker
# %%
grp_df = stocks_data.groupby(stocks_data.Ticker)
TICKERS = stocks_data['Ticker'].unique()
def split_df(tickers):
for ticker in tickers:
df = grp_df.get_group(ticker)
print(df)
split_df(TICKERS)
