Financial Data Science Financial Performance Analysis: Difference between revisions

From NovaOrdis Knowledge Base
Jump to navigation Jump to search
 
(19 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
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
import matplotlib.ticker as ptick
import matplotlib.ticker as ptick
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
# extract a specific time series ('Fidelity Self', 'Fidelity Managed', etc.)
def dollar_to_int(s):
ts = df[column_name]
    if isinstance(s, str):
# resample and interpolate
        return int(s[1:].replace(',',''))
ts = ts.resample('D').interpolate()
    elif math.isnan(s):
 
        return 0
# get the SP&500
    else:
fred = Fred(api_key=fred_api_key)
        return -1
sp500 = fred.get_series(series_id="SP500")
sp500 = sp500.resample('D').interpolate()


# extract a specific time series and plot it
#
fidelity_self = df['Fidelity Self'].apply(dollar_to_int)
# apply a window, normalize and compute the percentage difference
fidelity_self = fidelity_self[fidelity_self != 0]
#
fidelity_managed = df['Fidelity Managed'].apply(dollar_to_int)
ts = ts.loc[start_date:]
fidelity_managed = fidelity_managed[fidelity_managed != 0]
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)
ax.plot(sp500_perf, lw=0.5, color='black')
ax.plot(fidelity_self)
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()