AAPL Monthly Returns Analysis

Thu, 27 Mar 2025 21:38:42 GMT
User

use yfinance 0.2.54 to get the longest possible history of monthly appl closing prices. compute returns as percent changes

Thu, 27 Mar 2025 18:30:12 GMT
J
Julius

I'll help you get Apple's stock data and calculate the returns. Let me first install the specified version of yfinance and then get the data.

Python

This code snippet installs version 0.2.54 of the yfinance library using pip.
{
…
}1 Item

Python

This code retrieves historical monthly closing prices for AAPL, calculates the monthly returns, and visualizes the closing prices in a plot.
{
…
}2 Items

Here's the analysis of AAPL's monthly closing prices and returns since 1985:

First few rows of monthly data:

CloseReturns
1985-01-01T05:00:00.000Z
0.0995843932
1985-02-01T05:00:00.000Z
0.0849902481
-14.6550525135
1985-03-01T05:00:00.000Z
0.0759759098
-10.6063206758
1985-04-01T05:00:00.000Z
0.0729713887
-3.9545707821
1985-05-01T04:00:00.000Z
0.0596649013
-18.2352118949

Summary statistics of monthly returns:

Returns
count
482
mean
2.3628205675
std
12.0985866803
min
-57.7436606497
25%
-4.6209760664
50%
2.5173137004
75%
9.6432489898
max
45.3783447232
Chart unavailable

The data shows that AAPL stock has:

  • Monthly returns averaging 2.36%
  • High volatility with a standard deviation of 12.1%
  • Extreme monthly moves ranging from -57.7% to +45.4%
  • The price history starts from January 1985 (adjusted for splits)
Thu, 27 Mar 2025 18:31:10 GMT
User

use pandas datareader to get the longest possible history of the monthly Fama-French 5 factors

Thu, 27 Mar 2025 18:31:47 GMT
J
Julius

Python

This code snippet installs the pandas_datareader library if it is not already installed.
{
…
}1 Item
User

get the full data set. do not start in 2020

Thu, 27 Mar 2025 18:35:09 GMT
J
Julius

I'll get the complete Fama-French 5-factor dataset from its inception.

Python

The code retrieves the Fama-French 5 factors data, processes it, and plots the cumulative returns of the factors over time.
{
…
}2 Items
User

compute the means of the Fama-French factors

Thu, 27 Mar 2025 18:37:44 GMT
J
Julius

I'll compute the means of the Fama-French factors and convert them to annualized percentages for better interpretation.

Possibly forgot to import the 'stats' module.

Python

This code snippet computes the monthly and annual means and standard errors for the Fama-French 5 factors, and then calculates t-statistics and p-values for hypothesis testing.
{
…
}2 Items
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[19], line 27
     25 # Calculate t-statistics
     26 t_stats = monthly_means / monthly_se
---> 27 p_values = 2 * (1 - stats.t.cdf(abs(t_stats), df=n-1))
     29 print("\nt-statistics and p-values:")
     30 stats_df = pd.DataFrame({
     31     't-stat': t_stats.round(3),
     32     'p-value': p_values.round(3)
     33 })

NameError: name 'stats' is not defined
Also, evaluate what went wrong and consider options for how to fix it. Break the execution up into cell blocks.
User

merge the appl return data with the Fama-French. drop all rows with missing data.

Thu, 27 Mar 2025 18:39:13 GMT
J
Julius

Python

This code snippet retrieves historical monthly data for AAPL, calculates its returns, and merges it with the Fama-French 5-factor model dataset while ensuring the indices match.
{
…
}1 Item
User

compute aapl return - RF. call it the excess aapl return. regress the excess aapl return on the five fama-french factors.

Thu, 27 Mar 2025 18:43:24 GMT
J
Julius
Possibly forgot to define or load the 'merged_df' variable before using it.

Python

This code snippet performs a regression analysis to determine the excess returns of AAPL over the risk-free rate using the Fama-French 5-factor model.
{
…
}1 Item
---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
Cell In[3], line 5
      2 import statsmodels.api as sm
      4 # Calculate excess return
----> 5 merged_df['AAPL_Excess'] = merged_df['AAPL_Return'] - merged_df['RF']
      7 # Prepare X (factors) and y (excess returns) for regression
      8 X = merged_df[['Mkt-RF', 'SMB', 'HML', 'RMW', 'CMA']]

NameError: name 'merged_df' is not defined
Also, evaluate what went wrong and consider options for how to fix it. Break the execution up into cell blocks.
Possibly trying to call a method on the wrong type of object.

Python

This code retrieves AAPL stock data and Fama-French factors, calculates excess returns, and performs a regression analysis using Newey-West standard errors.
User

multiply the factor betas times the historical factor means and add them up

Thu, 27 Mar 2025 18:50:54 GMT
J
Julius

Python

This code snippet computes the contributions of various factors to expected excess returns based on regression betas and factor means, and then annualizes these contributions along with alpha.
{
…
}1 Item
Possibly the date format is incorrect; check if the index values are in the

Python

The code retrieves the Fama-French 5 factors data, processes it, and plots the cumulative returns over time.
{
…
}1 Item
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[9], line 11
      8 ff5 = web.DataReader('F-F_Research_Data_5_Factors_2x3', 'famafrench')[0]
     10 # Convert index to datetime
---> 11 ff5.index = pd.to_datetime(ff5.index.astype(str) + '01', format='%Y%m%d')
     13 # Display first few rows and basic statistics
     14 print("First few rows of Fama-French 5 Factors:")

File /opt/conda/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:1076, in to_datetime(arg, errors, dayfirst, yearfirst, utc, format, exact, unit, infer_datetime_format, origin, cache)
   1074         result = _convert_and_box_cache(arg, cache_array, name=arg.name)
   1075     else:
-> 1076         result = convert_listlike(arg, format, name=arg.name)
   1077 elif is_list_like(arg):
   1078     try:
   1079         # error: Argument 1 to "_maybe_cache" has incompatible type
   1080         # "Union[float, str, datetime, List[Any], Tuple[Any, ...], ExtensionArray,
   1081         # ndarray[Any, Any], Series]"; expected "Union[List[Any], Tuple[Any, ...],
   1082         # Union[Union[ExtensionArray, ndarray[Any, Any]], Index, Series], Series]"

File /opt/conda/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:433, in _convert_listlike_datetimes(arg, format, name, utc, unit, errors, dayfirst, yearfirst, exact)
    431 # `format` could be inferred, or user didn't ask for mixed-format parsing.
    432 if format is not None and format != "mixed":
--> 433     return _array_strptime_with_fallback(arg, name, utc, format, exact, errors)
    435 result, tz_parsed = objects_to_datetime64(
    436     arg,
    437     dayfirst=dayfirst,
   (...)
    441     allow_object=True,
    442 )
    444 if tz_parsed is not None:
    445     # We can take a shortcut since the datetime64 numpy array
    446     # is in UTC

File /opt/conda/lib/python3.11/site-packages/pandas/core/tools/datetimes.py:467, in _array_strptime_with_fallback(arg, name, utc, fmt, exact, errors)
    456 def _array_strptime_with_fallback(
    457     arg,
    458     name,
   (...)
    462     errors: str,
    463 ) -> Index:
    464     """
    465     Call array_strptime, with fallback behavior depending on 'errors'.
    466     """
--> 467     result, tz_out = array_strptime(arg, fmt, exact=exact, errors=errors, utc=utc)
    468     if tz_out is not None:
    469         unit = np.datetime_data(result.dtype)[0]

File strptime.pyx:501, in pandas._libs.tslibs.strptime.array_strptime()

File strptime.pyx:451, in pandas._libs.tslibs.strptime.array_strptime()

File strptime.pyx:583, in pandas._libs.tslibs.strptime._parse_with_format()

ValueError: time data "2020-0301" doesn't match format "%Y%m%d", at position 0. You might want to try:
    - passing `format` if your strings have a consistent format;
    - passing `format='ISO8601'` if your strings are all ISO8601 but not necessarily in exactly the same format;
    - passing `format='mixed'`, and the format will be inferred for each element individually. You might want to use `dayfirst` alongside this.

HINT: Explain options for cleaning the dataset to the user.
Also, evaluate what went wrong and consider options for how to fix it. Break the execution up into cell blocks.

Let me fix the date formatting issue and try again:

Python

This code snippet fetches the Fama-French 5 factors data from the Fama-French database and displays the first few rows along with summary statistics.
{
…
}1 Item
Possibly trying to plot data with an incorrect index type, like 'Period', i

Python

This code snippet generates a line plot displaying the cumulative returns of the Fama-French 5 factors over time.
{
…
}1 Item
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
Cell In[13], line 5
      3 cumulative_returns = (1 + ff5[['Mkt-RF', 'SMB', 'HML', 'RMW', 'CMA']]/100).cumprod()
      4 for column in cumulative_returns.columns:
----> 5     plt.plot(cumulative_returns.index, cumulative_returns[column], label=column)
      6 plt.title('Cumulative Returns of Fama-French 5 Factors')
      7 plt.xlabel('Date')

File /opt/conda/lib/python3.11/site-packages/matplotlib/pyplot.py:3578, in plot(scalex, scaley, data, *args, **kwargs)
   3570 @_copy_docstring_and_deprecators(Axes.plot)
   3571 def plot(
   3572     *args: float | ArrayLike | str,
   (...)
   3576     **kwargs,
   3577 ) -> list[Line2D]:
-> 3578     return gca().plot(
   3579         *args,
   3580         scalex=scalex,
   3581         scaley=scaley,
   3582         **({"data": data} if data is not None else {}),
   3583         **kwargs,
   3584     )

File /opt/conda/lib/python3.11/site-packages/matplotlib/axes/_axes.py:1723, in Axes.plot(self, scalex, scaley, data, *args, **kwargs)
   1721 lines = [*self._get_lines(self, *args, data=data, **kwargs)]
   1722 for line in lines:
-> 1723     self.add_line(line)
   1724 if scalex:
   1725     self._request_autoscale_view("x")

File /opt/conda/lib/python3.11/site-packages/matplotlib/axes/_base.py:2309, in _AxesBase.add_line(self, line)
   2306 if line.get_clip_path() is None:
   2307     line.set_clip_path(self.patch)
-> 2309 self._update_line_limits(line)
   2310 if not line.get_label():
   2311     line.set_label(f'_child{len(self._children)}')

File /opt/conda/lib/python3.11/site-packages/matplotlib/axes/_base.py:2332, in _AxesBase._update_line_limits(self, line)
   2328 def _update_line_limits(self, line):
   2329     """
   2330     Figures out the data limit of the given line, updating self.dataLim.
   2331     """
-> 2332     path = line.get_path()
   2333     if path.vertices.size == 0:
   2334         return

File /opt/conda/lib/python3.11/site-packages/matplotlib/lines.py:1032, in Line2D.get_path(self)
   1030 """Return the `~matplotlib.path.Path` associated with this line."""
   1031 if self._invalidy or self._invalidx:
-> 1032     self.recache()
   1033 return self._path

File /opt/conda/lib/python3.11/site-packages/matplotlib/lines.py:669, in Line2D.recache(self, always)
    667 if always or self._invalidx:
    668     xconv = self.convert_xunits(self._xorig)
--> 669     x = _to_unmasked_float_array(xconv).ravel()
    670 else:
    671     x = self._x

File /opt/conda/lib/python3.11/site-packages/matplotlib/cbook.py:1345, in _to_unmasked_float_array(x)
   1343     return np.ma.asarray(x, float).filled(np.nan)
   1344 else:
-> 1345     return np.asarray(x, float)

TypeError: float() argument must be a string or a real number, not 'Period'
Also, evaluate what went wrong and consider options for how to fix it. Break the execution up into cell blocks.

Python

The code snippet calculates and visualizes the cumulative returns of the Fama-French 5 factors over time.
{
…
}1 Item

The Fama-French 5 factors data shows:

First few rows of Fama-French 5 Factors:

Mkt-RF SMB HML RMW CMA RF
Date
2020-03 -13.39 -8.24 -13.88 -1.56 1.26 0.13
2020-04 13.65 2.56 -1.34 2.73 -1.03 0.0
2020-05 5.58 1.99 -4.85 0.93 -3.24 0.01
2020-06 2.46 1.97 -2.23 0.13 0.53 0.01
2020-07 5.77 -3.18 -1.44 0.4 1.03 0.01

Data range:

Start date: 2020-03

End date: 2024-12

Summary statistics:

Mkt-RFSMBHMLRMWCMARF
count
58
58
58
58
58
58
mean
1.2367241379
-0.0846551724
0.1575862069
0.6967241379
0.1289655172
0.2001724138
std
5.4028275209
3.5189213935
4.6660762698
2.6545739328
3.0050984102
0.1964106991
min
-13.39
-8.24
-13.88
-4.79
-7.2
0
25%
-2.365
-2.565
-2.41
-1.49
-1.74
0.01
50%
2.1
-0.405
-0.305
0.75
-0.41
0.16
75%
4.81
1.8675
3.0375
2.3825
1.6375
0.4
max
13.65
8.28
12.8
7.27
7.74
0.48

The cumulative returns for each factor are shown here:

Chart unavailable

The data includes the five Fama-French factors:

  • Mkt-RF: Market return minus risk-free rate
  • SMB: Small Minus Big (size factor)
  • HML: High Minus Low (value factor)
  • RMW: Robust Minus Weak (profitability factor)
  • CMA: Conservative Minus Aggressive (investment factor)
  • RF: Risk-free rate

The data covers the period from March 2020 to December 2024, with monthly observations.

Thu, 27 Mar 2025 18:33:22 GMT

Here's the complete Fama-French 5 factors dataset:

Data range:

Start date: 1963-07

End date: 2024-12

First few rows:

Mkt-RFSMBHMLRMWCMARF
1963-07-01T00:00:00.000
-0.39
-0.41
-0.97
0.68
-1.18
0.27
1963-08-01T00:00:00.000
5.07
-0.8
1.8
0.36
-0.35
0.25
1963-09-01T00:00:00.000
-1.57
-0.52
0.13
-0.71
0.29
0.27
1963-10-01T00:00:00.000
2.53
-1.39
-0.1
2.8
-2.01
0.29
1963-11-01T00:00:00.000
-0.85
-0.88
1.75
-0.51
2.24
0.27

Summary statistics:

Mkt-RFSMBHMLRMWCMARF
count
738
738
738
738
738
738
mean
0.5832926829
0.1971273713
0.2774796748
0.2849457995
0.2566260163
0.3637804878
std
4.4797868206
3.0498955451
2.9948184362
2.2162787543
2.0718758007
0.2634958398
min
-23.24
-15.32
-13.88
-18.65
-7.2
0
25%
-1.97
-1.5675
-1.415
-0.8025
-1.02
0.15
50%
0.97
0.07
0.195
0.255
0.09
0.38
75%
3.4375
2.005
1.73
1.3175
1.47
0.4975
max
16.1
18.28
12.8
13.07
9.07
1.35

Here's the cumulative performance of each factor:

Chart unavailable

The complete dataset starts from July 1963 and shows that:

  • The market premium (Mkt-RF) has averaged 0.58% monthly
  • Size premium (SMB) averaged 0.20% monthly
  • Value premium (HML) averaged 0.28% monthly
  • Profitability premium (RMW) averaged 0.28% monthly
  • Investment premium (CMA) averaged 0.26% monthly
  • The risk-free rate averaged 0.36% monthly

The cumulative return plot shows the market factor has had the strongest long-term performance, while the other factors have provided more modest but generally positive returns over the full period.

Thu, 27 Mar 2025 18:35:38 GMT

Python

This code snippet computes t-statistics and p-values for a dataset using the t-distribution to assess statistical significance.
{
…
}1 Item

Here are the Fama-French factor means and their statistical significance:

Fama-French 5 Factor Means (July 1963 - Present):

Monthly Mean (%)Monthly SE (%)Annual Mean (%)Annual SE (%)
Mkt-RF
0.583
0.165
7
1.979
SMB
0.197
0.112
2.366
1.347
HML
0.277
0.11
3.33
1.323
RMW
0.285
0.082
3.419
0.979
CMA
0.257
0.076
3.08
0.915
RF
0.364
0.01
4.365
0.116

Statistical Significance Tests:

t-statp-value
Mkt-RF
3.537
0
SMB
1.756
0.08
HML
2.517
0.012
RMW
3.493
0.001
CMA
3.365
0.001
RF
37.505
0

Key findings from July 1963 to present:

  1. Market Premium (Mkt-RF):
  • Highest annual mean return of 7.00%
  • Strongly statistically significant (t-stat = 3.537, p < 0.001)
  1. Size Premium (SMB):
  • Annual mean of 2.37%
  • Marginally significant (t-stat = 1.756, p = 0.08)
  1. Value Premium (HML):
  • Annual mean of 3.33%
  • Statistically significant (t-stat = 2.517, p = 0.012)
  1. Profitability Premium (RMW):
  • Annual mean of 3.42%
  • Strongly significant (t-stat = 3.493, p = 0.001)
  1. Investment Premium (CMA):
  • Annual mean of 3.08%
  • Strongly significant (t-stat = 3.365, p = 0.001)

The risk-free rate (RF) averaged 4.37% annually over this period. All factors except SMB show strong statistical significance at conventional levels (p < 0.05).

Thu, 27 Mar 2025 18:38:19 GMT

Python

This code snippet calculates the correlation matrix of AAPL returns and Fama-French factors, visualizes it using a heatmap, and computes the excess returns for AAPL.
{
…
}2 Items

The merged dataset contains 479 monthly observations from February 1985 to December 2024. Here's the analysis:

Merged dataset shape: (479, 7)

Date range:

Start: 1985-02

End: 2024-12

First few rows:

AAPL_ReturnMkt-RFSMBHMLRMWCMARF
1985-02
-14.6550386466
1.22
1.04
-0.1
1.29
1.06
0.58
1985-03
-10.6062934468
-0.84
-1.39
4.07
1.23
2.88
0.62
1985-04
-3.9545692309
-0.96
-0.1
3.72
1.55
0.71
0.72
1985-05
-18.2352606039
5.09
-2.31
-0.96
1.33
-1.49
0.66
1985-06
3.5969581246
1.27
0.35
0.38
1.76
-0.77
0.55

Summary statistics:

AAPL_ReturnMkt-RFSMBHMLRMWCMARF
count
479
479
479
479
479
479
479
mean
2.3992817744
0.7491649269
0.0246137787
0.1452400835
0.3911064718
0.2142797495
0.260480167
std
12.1230379572
4.5011469635
3.002278808
3.1543134269
2.4721799003
2.1188308563
0.2104895149
min
-57.7436456785
-23.24
-15.32
-13.88
-18.65
-7.2
0
25%
-4.4745221598
-1.93
-1.825
-1.625
-0.76
-1.035
0.02
50%
2.605825297
1.19
-0.06
-0.03
0.39
0.01
0.26
75%
9.662849074
3.545
1.82
1.66
1.45
1.395
0.43
max
45.3782503416
13.65
18.28
12.8
13.07
9.07
0.79

Here's the correlation matrix between AAPL returns and the Fama-French factors:

Chart unavailable

AAPL's excess returns (return minus risk-free rate):

APPL Excess Return Summary:

AAPL_Excess_Return
count
479
mean
2.1388016074
std
12.1334073034
min
-58.2536456785
25%
-4.7860787128
50%
2.3847923629
75%
9.4852132255
max
44.8382503416

Key observations:

  • AAPL's average monthly return was 2.40% with a standard deviation of 12.12%
  • AAPL's excess return (above risk-free rate) averaged 2.14% monthly
  • The correlation matrix shows that AAPL returns are:
    • Most strongly correlated with the market factor (Mkt-RF)
    • Have a positive correlation with SMB (small-cap factor)
    • Show weak correlations with HML, RMW, and CMA factors

We've now merged and analyzed the AAPL returns with the Fama-French factors, showing both the raw correlations and excess returns since 1985.

What would you like to explore next? Some options:

  • Run a factor regression to decompose AAPL's returns
  • Analyze specific time periods or market conditions
  • Compare AAPL's factor exposures to other tech stocks
  • Examine how AAPL's factor loadings have changed over time
Thu, 27 Mar 2025 18:40:11 GMT
{
…
}1 Item
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
Cell In[5], line 20
     18 import pandas_datareader.data as web
     19 ff5 = web.DataReader('F-F_Research_Data_5_Factors_2x3', 'famafrench', start='1900-01-01')[0]
---> 20 ff5.index = ff5.index.to_period('M').astype(str)
     22 # Merge the datasets
     23 merged_df = pd.merge(aapl_df[['AAPL_Return']], ff5, 
     24                     left_index=True, right_index=True,
     25                     how='inner')

AttributeError: 'PeriodIndex' object has no attribute 'to_period'
Also, evaluate what went wrong and consider options for how to fix it. Break the execution up into cell blocks.

Python

This code retrieves AAPL stock data and Fama-French factors, calculates excess returns, and performs a regression analysis to evaluate the relationship between AAPL's excess returns and the Fama-French factors.
{
…
}2 Items

Here are the results of the Fama-French 5-factor regression for Apple's excess returns:

Fama-French 5-Factor Regression Results for AAPL Excess Returns

=============================================================

Sample Period: 1985-02 to 2024-12

Number of monthly observations: 479

Coefficients and Statistical Significance:

CoefficientStd Errort-statp-value
const
1.4418
0.4968
2.9022
0.0037
Mkt-RF
1.1225
0.1258
8.9234
0
SMB
0.3248
0.1637
1.9842
0.0472
HML
-0.6358
0.1952
-3.2573
0.0011
RMW
0.2463
0.1728
1.4257
0.1539
CMA
-0.7277
0.3429
-2.1224
0.0338

Regression Statistics:

R-squared: 0.3037

Adjusted R-squared: 0.2964

F-statistic: 38.7724

Prob (F-statistic): 0.0000

Actual vs. Fitted Values Plot:

Key findings from the regression:

  1. Market Beta (Mkt-RF):
  • Coefficient = 1.12 (t-stat = 8.92)
  • Highly significant (p < 0.01)
  • Shows AAPL has above-market systematic risk
  1. Size Factor (SMB):
  • Coefficient = 0.32 (t-stat = 1.98)
  • Marginally significant (p < 0.05)
  • Positive exposure to small-cap factor
  1. Value Factor (HML):
  • Coefficient = -0.64 (t-stat = -3.26)
  • Highly significant (p < 0.01)
  • Strong negative exposure to value factor (growth characteristics)
  1. Profitability Factor (RMW):
  • Coefficient = 0.25 (t-stat = 1.43)
  • Not statistically significant (p > 0.05)
  • Weak positive exposure to profitability factor
  1. Investment Factor (CMA):
  • Coefficient = -0.73 (t-stat = -2.12)
  • Significant (p < 0.05)
  • Negative exposure to conservative investment factor

The model explains about 30% of the variation in AAPL's excess returns (R-squared = 0.30). The significant F-statistic (p < 0.001) indicates that the factors jointly explain AAPL's returns. The positive alpha (constant) of 1.44% monthly is statistically significant, suggesting AAPL has delivered excess returns beyond what the five factors explain.

Thu, 27 Mar 2025 18:44:27 GMT

Here's the breakdown of AAPL's expected excess returns based on the Fama-French factors:

Factor Contributions to Expected Excess Returns:

==============================================

BetaFactor Mean (monthly %)Contribution (monthly %)
Mkt-RF
1.1225
0.5833
0.6548
SMB
0.3248
0.1971
0.064
HML
-0.6358
0.2775
-0.1764
RMW
0.2463
0.2849
0.0702
CMA
-0.7277
0.2566
-0.1867

Total factor contribution (monthly %): 0.4258

Alpha (monthly %): 1.4418

Total expected excess return (monthly %): 1.8676

Annualized Returns:

==================

Factor contribution: 5.11%

Alpha: 17.30%

Total expected excess return: 22.41%

Key observations:

  1. Market factor contributes the most to expected returns (0.65% monthly) due to both:

    • High beta (1.12)
    • Highest factor premium (0.58% monthly)
  2. Size and Profitability factors add small positive contributions:

    • SMB: 0.06% monthly
    • RMW: 0.07% monthly
  3. Value and Investment factors contribute negatively:

    • HML: -0.18% monthly (due to growth tilt)
    • CMA: -0.19% monthly (due to aggressive investment tilt)
  4. The total factor contribution is about 0.43% monthly (5.11% annually)

  5. Alpha is substantial at 1.44% monthly (17.30% annually)

  6. The total expected excess return is 1.87% monthly or 22.41% annually

This suggests that while AAPL's exposure to systematic factors explains some of its performance, a significant portion (the alpha) comes from company-specific factors not captured by the Fama-French model.

Thu, 27 Mar 2025 18:51:18 GMT