Coverage for src/ifunnel/models/dataAnalyser.py: 0%
27 statements
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-12 09:14 +0000
« prev ^ index » next coverage.py v7.9.2, created at 2025-07-12 09:14 +0000
1import numpy as np
2import pandas as pd
5def mean_an_returns(data: pd.DataFrame) -> float:
6 """Function computing the geometric mean of annual returns"""
8 result = 1
9 for i in range(len(data.index)):
10 result *= 1 + data.iloc[i, :]
12 result = result ** (1 / float(len(data.index) / 52)) - 1
14 return result
17def final_stats(data: pd.DataFrame) -> pd.DataFrame:
18 """Function computing the final statistics of the backtesting"""
20 # TABLE WITH AVG RET AND STD OF RET
21 data = data.pct_change()
22 data = data.drop(data.index[:1])
24 mu_ga = round(mean_an_returns(data), 2) # annual geometric mean
25 std_dev_a = round(data.std(axis=0) * np.sqrt(52), 2) # standard deviation of Annual Returns
27 stat_df = pd.concat([mu_ga, std_dev_a], axis=1) # table
28 stat_names = ["Average Annual Returns", "Standard Deviation of Returns"]
29 stat_df.columns = stat_names # add names
31 # COMPUTE SHARPE RATIO AND ADD IT INTO THE TABLE
32 sharpe = round(
33 stat_df.loc[:, "Average Annual Returns"] / stat_df.loc[:, "Standard Deviation of Returns"],
34 2,
35 )
36 stat_df = pd.concat([stat_df, sharpe], axis=1) # add sharpe ratio into the table
37 stat_names = ["Avg An Ret", "Std Dev of Ret", "Sharpe R"]
38 stat_df.columns = stat_names
40 return stat_df
43def get_weekly_returns(data: pd.DataFrame) -> pd.DataFrame:
44 """Function returning weekly returns"""
46 # DEFINE IF WE WORK WITH ISIN CODES OR NAMES OF MUTUAL FUNDS
47 prices_df = data
48 # MODIFY THE DATA
49 prices_on_wed = prices_df[prices_df.index.weekday == 2] # Only wednesdays
51 # Get weekly returns
52 weekly_returns = prices_on_wed.pct_change()
53 weekly_returns = weekly_returns.drop(weekly_returns.index[:1]) # drop first NaN row
55 return weekly_returns