Financial Data Science Financial Performance Analysis: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(15 intermediate revisions by the same user not shown)
Line 5: Line 5:


<syntaxhighlight lang='py'>
<syntaxhighlight lang='py'>
fred_api_key = '...'
start_date = '2023-07-14'
data_file = './finance-data/Test.xlsx'
column_name = 'Balance'
import math
import math
import pandas as pd
import pandas as pd
Line 11: Line 17:
from fredapi import Fred
from fredapi import Fred


# load the DataFrame
# load the DataFrame from Excel
df = pd.read_csv("./finances.csv", parse_dates=["Date"])
df = pd.DataFrame(pd.read_excel(data_file, parse_dates=["Date"]))  


# make it a time series DataFrame
# make it a time series DataFrame
df = df.set_index('Date')
df = df.set_index('Date')
# declare the function that converts the dollar amount
def dollar_to_int(s):
    if isinstance(s, str):
        return int(s[1:].replace(',',''))
    elif math.isnan(s):
        return s # we will interpolate later


# extract a specific time series ('Fidelity Self', 'Fidelity Managed', etc.)
# extract a specific time series ('Fidelity Self', 'Fidelity Managed', etc.)
fid_slf = df['Fidelity Self'].apply(dollar_to_int)
ts = df[column_name]
# resample and interpolate
# resample and interpolate
fid_slf = fid_slf.resample('D').interpolate()
ts = ts.resample('D').interpolate()
 


# get the SP&500
# get the SP&500
fred = Fred(api_key='...')
fred = Fred(api_key=fred_api_key)
sp500 = fred.get_series(series_id="SP500")
sp500 = fred.get_series(series_id="SP500")
sp500 = sp500.resample('D').interpolate()
#
# apply a window, normalize and compute the percentage difference
#
ts = ts.loc[start_date:]
sp500 = sp500.loc[start_date:]
sp500_perf = sp500.apply(lambda x: x * ts.loc[start_date] / sp500.loc[start_date])
sp500_perc_diff = ts.sub(sp500_perf).div(sp500_perf).mul(100)


# graph
# graph
plt.style.use('seaborn-v0_8-whitegrid')
fig, ax = plt.subplots()
fig, ax = plt.subplots()
fig.autofmt_xdate()
fig.autofmt_xdate()
fig.set_figwidth(20)
ax.set_ylabel("amount")
ax.set_ylabel("amount")
ax.yaxis.set_major_formatter(mt.FormatStrFormatter('% 1.2f'))  
ax.yaxis.set_major_formatter(ptick.FormatStrFormatter('% 1.0f'))  
ax.plot(fidelity_self, lw=0.5)
ax.plot(sp500_perf, lw=0.5, color='black')
ax.plot(fidelity_managed, lw=0.5)
ax.plot(ts, lw=0.5, color='blue')
 
fig2, ax2 = plt.subplots()
fig2.autofmt_xdate()
fig2.set_figwidth(25)
ax2.set_ylabel("percentage")
ax2.yaxis.set_major_formatter(ptick.PercentFormatter())
ax2.plot(sp500_perc_diff, lw=0.5, color='indigo')
 
plt.show()
plt.show()
</syntaxhighlight>
</syntaxhighlight>

Latest revision as of 03:56, 31 October 2023

Internal

Overview

fred_api_key = '...'

start_date = '2023-07-14'
data_file = './finance-data/Test.xlsx'
column_name = 'Balance'

import math
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib.ticker as ptick
from fredapi import Fred

# load the DataFrame from Excel
df = pd.DataFrame(pd.read_excel(data_file, parse_dates=["Date"])) 

# make it a time series DataFrame
df = df.set_index('Date')

# extract a specific time series ('Fidelity Self', 'Fidelity Managed', etc.)
ts = df[column_name]
# resample and interpolate
ts = ts.resample('D').interpolate()

# get the SP&500
fred = Fred(api_key=fred_api_key)
sp500 = fred.get_series(series_id="SP500")
sp500 = sp500.resample('D').interpolate()

#
# apply a window, normalize and compute the percentage difference
#
ts = ts.loc[start_date:]
sp500 = sp500.loc[start_date:]
sp500_perf = sp500.apply(lambda x: x * ts.loc[start_date] / sp500.loc[start_date])
sp500_perc_diff = ts.sub(sp500_perf).div(sp500_perf).mul(100)

# graph
plt.style.use('seaborn-v0_8-whitegrid')

fig, ax = plt.subplots()
fig.autofmt_xdate()
fig.set_figwidth(20)
ax.set_ylabel("amount")
ax.yaxis.set_major_formatter(ptick.FormatStrFormatter('% 1.0f')) 
ax.plot(sp500_perf, lw=0.5, color='black')
ax.plot(ts, lw=0.5, color='blue')

fig2, ax2 = plt.subplots()
fig2.autofmt_xdate()
fig2.set_figwidth(25)
ax2.set_ylabel("percentage")
ax2.yaxis.set_major_formatter(ptick.PercentFormatter()) 
ax2.plot(sp500_perc_diff, lw=0.5, color='indigo')

plt.show()