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

1import numpy as np 

2import pandas as pd 

3 

4 

5def mean_an_returns(data: pd.DataFrame) -> float: 

6 """Function computing the geometric mean of annual returns""" 

7 

8 result = 1 

9 for i in range(len(data.index)): 

10 result *= 1 + data.iloc[i, :] 

11 

12 result = result ** (1 / float(len(data.index) / 52)) - 1 

13 

14 return result 

15 

16 

17def final_stats(data: pd.DataFrame) -> pd.DataFrame: 

18 """Function computing the final statistics of the backtesting""" 

19 

20 # TABLE WITH AVG RET AND STD OF RET 

21 data = data.pct_change() 

22 data = data.drop(data.index[:1]) 

23 

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 

26 

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 

30 

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 

39 

40 return stat_df 

41 

42 

43def get_weekly_returns(data: pd.DataFrame) -> pd.DataFrame: 

44 """Function returning weekly returns""" 

45 

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 

50 

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 

54 

55 return weekly_returns