sec-api.ioSEC API by D2V
FilingsPricingSandboxDocs
Log inGet Free API Key
  1. Home
  2. Tutorials

Fama-French Factor Model in Python

Open In Colab   Download Notebook

On this page:

  • How Fama-French's Factor Model Works
    • Example
    • Steps to Replicate Fama-French Three-Factor Model on QQQ in Python
      • Step 1. Collect Monthly Returns of Portfolio or Asset
        • Step 2. Calculate the Fama-French Factors
          • Step 3: Calculate Excess Returns of Portfolio or Asset
            • Step 4: Run the Regression Model
              • Step 5: Interpret the Results
                • Factor Interpretation
                  • Model Diagnostics
                • Converting Monthly to Quarterly Factors

                  In this tutorial, we'll guide you through applying the Fama-French Three-Factor Model to analyze the NASDAQ 100 index, specifically through the QQQ ETF, utilizing various Python's libraries. Our focus will be on QQQ's monthly returns from 2006 to 2023 to understand the influence of the three Fama-French factors on the ETF's performance.

                  The Fama-French Three-Factor Model is a widely used tool in finance to analyze the performance of stocks and portfolios. It decomposes the returns of a stock or portfolio into three factors: market excess returns, company size, and value. By conducting an Ordinary Least Squares (OLS) regression analysis, we aim to reveal the extent to which these factors can explain the performance of QQQ, and demonstrate how to interpret the results.

                  How Fama-French's Factor Model Works

                  The Fama-French Factor Model is a way to determine what factors influence returns. Returns could be the return of a single stock, a portfolio of multiple stocks or a specific index such as the SP500. It can be applied to individual stocks, portfolios of stocks, mutual funds, or any other type of investment that can be compared to the broader market.

                  Originally, the model started with three factors, also known as the Fama-French three-factor model. These factors are:

                  • Market excess returns (Mkt-RF): The return of the SP500 index minus the risk-free rate. This factor captures the overall market movement.
                  • Size factor (SMB, Small Minus Big): The return of small-cap stocks minus the return of large-cap stocks. This factor captures the outperformance of small-cap stocks over large-cap stocks.
                  • Value factor (HML, High Minus Low): The return of value stocks minus the return of growth stocks. This factor captures the outperformance of value stocks over growth stocks.

                  In the later version of the model, the Fama-French five-factor model introduced in 2015, Eugene Fama and Kenneth French added two new factors to the original three-factor model. These additional factors are:

                  • Profitability factor (RMW, Robust Minus Weak): The excess return of firms with high operating profitability over those with low operating profitability.
                  • Investment factor (CMA, Conservative Minus Aggressive): The excess return of firms that invest conservatively relative to their assets over those that invest aggressively.

                  When applying the Fama-French model to a single stock, you're investigating how much of the stock's excess return (over the risk-free rate) can be explained by these three or five factors. You can understand the factors contributing to the stock's performance, which can be especially useful for stock selection and portfolio construction.

                  Assuming your portfolio made a 15% return last year, the Fama-French model doesn't directly attribute fixed percentages of this return to the factors (e.g., 6% from Mkt-Rf, 8% from SMB, 1% from HML). Instead, it provides a framework to analyze how much of your portfolio's excess return over the risk-free rate can be explained by these factors based on its sensitivity to them.

                  In order to determine the sentivity and explanatory power of each factor on the portfolio's return, a simple linear regression model is used. The model's output is interpreted as follows:

                  • Model Coefficients: The regression analysis yields coefficients (betas) for each factor, indicating your portfolio's sensitivity to that factor. For example, if your portfolio is heavily invested in small-cap stocks, your coefficient for SMB would be high, indicating a higher sensitivity to the SMB factor.
                  • Error Term: The model also includes an error term to account for the portion of the portfolio's return that cannot be explained by the three or five factors. This captures specific risks associated with the portfolio or other unexplained variations.

                  In essence, the model helps you understand the relationship between your portfolio's excess return and the factors, rather than attributing its return to the factors in a direct, additive way. The actual contribution of each factor to your portfolio's return depends on the portfolio's exposure to those factors, as quantified by the regression coefficients, not just the overall market or average returns of small-cap vs. large-cap or value vs. growth stocks.

                  The dependent variable (the excess return = outcome of the model) is what you are trying to explain or predict using the model. It is the outcome variable whose variations you aim to understand based on independent variables (factors).

                  Example

                  Consider an illustrative scenario where we analyze the annual returns of a certain portfolio using the Fama-French Three-Factor Model. The analysis yields the following coefficients and associated p-values for each factor:

                  • Market Excess Return (Mkt-Rf): Coefficient = 1.2, p-value = 0.001
                  • Size Factor (SMB): Coefficient = 0.5, p-value = 0.030
                  • Value Factor (HML): Coefficient = -0.3, p-value = 0.014

                  Interpretation

                  • Market Excess Return (Mkt-Rf) stands out as the predominant factor influencing the portfolio's returns, evidenced by its substantial coefficient of 1.2. This indicates that for every percentage point increase in the market's excess return, the portfolio's return is expected to increase by 1.2 percentage points, holding other factors constant. The statistical significance of this relationship is underscored by its p-value (0.001), suggesting a highly reliable predictor of the portfolio's performance.
                  • Size Factor (SMB) also plays a notable role, albeit to a lesser extent compared to the market excess return. With a coefficient of 0.5, it implies that the portfolio has a positive but moderate sensitivity to small-cap overperformance relative to large caps. The significance of this factor is confirmed by a p-value of 0.030, indicating a significant but less pronounced impact than the market excess return.
                  • Value Factor (HML), with a coefficient of -0.3, reveals a negative relationship between the portfolio's returns and the performance of value stocks relative to growth stocks. This suggests that the portfolio may be positioned in such a way that it benefits less from the outperformance of value stocks, or possibly is more aligned with growth stocks. Despite the negative correlation, the factor's influence is statistically significant, as denoted by its p-value of 0.014, albeit it's the least impactful compared to the market excess return and size factor.

                  This analysis demonstrates that the portfolio's performance is most significantly driven by market movements (Mkt-Rf), with a substantial and statistically significant coefficient. It also exhibits sensitivity to the size of firms (SMB), albeit to a lesser degree, and shows a slight inverse correlation with the value factor (HML). The statistical significance of all factors, as indicated by p-values below the 0.05 threshold, validates their relevance in explaining the portfolio's returns, with the hierarchy of influence clearly starting with the market excess return, followed by the size factor, and finally, the value factor.

                  Steps to Replicate Fama-French Three-Factor Model on QQQ in Python

                  The following example guides you through the steps to apply the Fama-French three-factor model to the monthly returns of the NASDAQ 100 index (ticker: QQQ), and evaluate the impact of the three factors (Mkt-RF, SMB, HML) on QQQ's monthly returns from 2006 to 2023. The steps include:

                  1. Collect Monthly Returns of QQQ
                  2. Collect Monthly Returns of Fama-French Factors
                  3. Merge QQQ Returns and Fama-French Factors
                  4. Fit the Fama-French Three-Factor Model
                  5. Interpret the Model Results

                  Step 1. Collect Monthly Returns of Portfolio or Asset

                  We use Yahoo Finance to collect the daily pricing data of QQQ from 2006 to 2023. The yfinance library is used to fetch the historical data of QQQ. As we are interested in monthly returns, we resample the daily adjusted closing prices to monthly adjusted closing prices, allowing us to calculate the monthly returns.

                  import pandas as pd
                  import matplotlib.pyplot as plt
                  import matplotlib.style as style
                  import seaborn as sns
                  import yfinance as yf

                  style.use("default")

                  params = {
                      "axes.labelsize": 8, "font.size": 8, "legend.fontsize": 8,
                      "xtick.labelsize": 8, "ytick.labelsize": 8, "text.usetex": False,
                      "font.family": "sans-serif", "axes.spines.top": False, "axes.spines.right": False,
                      "grid.color": "grey", "axes.grid": True, "grid.alpha": 0.5, "grid.linestyle": ":",
                  }

                  plt.rcParams.update(params)
                  # use Yahoo Finance to download historical data for QQQ
                  # over the last 15 years, from 2006-01-01 to 2021-01-01
                  qqq_daily = yf.download("QQQ", start="2006-01-01", end="2023-12-31")
                  qqq_daily["Adj Close"].plot(title="QQQ Daily Adjusted Close", figsize=(5, 3))
                  plt.show()
                  [*********************100%%**********************]  1 of 1 completed
                  QQQ Daily Adjusted Close
                  # calculate monthly returns of QQQ
                  qqq_monthly = qqq_daily["Adj Close"].resample("M").ffill().to_frame()
                  qqq_monthly.index = qqq_monthly.index.to_period("M")
                  qqq_monthly["Return"] = qqq_monthly["Adj Close"].pct_change() * 100
                  qqq_monthly.dropna(inplace=True)
                  qqq_monthly
                  Out:
                  Adj CloseReturn
                  Date
                  2006-0235.565815-2.142885
                  2006-0336.3095252.091080
                  2006-0436.240250-0.190790
                  2006-0533.616402-7.240149
                  2006-0633.595703-0.061573
                  .........
                  2023-08376.493195-1.483010
                  2023-09357.367859-5.079862
                  2023-10349.986481-2.065485
                  2023-11387.85089110.818821
                  2023-12409.5199895.586966

                  215 rows × 2 columns

                  Step 2. Calculate the Fama-French Factors

                  To simplify our process, we download Fama-French's three factors from Kenneth French's Data Library online. This resource offers updates to the three-factor and five-factor models at least monthly, providing downloadable CSV files for convenience.

                  Follow the steps below to download the Fama-French three-factor data:

                  1. Visit the Kenneth French Data Library, locate the section titled Fama/French 3 Factors, and download the corresponding CSV file. Alternatively, use this direct link to download the Fama/French 3 Factors CSV file. Upon downloading, you'll receive a ZIP file.
                  2. Unzip the downloaded file to extract its contents. The unzipped folder contains the CSV file that includes the monthly factors data.
                  3. The file is split into two sections. The first section contains the monthly factors while the second section represents the annual factors. Copy the first section (monthly factors), and paste it into a new file F-F_Research_Data_Factors-monthly.csv in the ./data directory of your project.
                  # Step 2: Load the monthly three factors into a dataframe
                  # CSV columns: , Mkt-RF, SMB, HML, RF
                  # The first columns represents the date
                  # The first row contains the column names
                  ff_factors_monthly = pd.read_csv(
                      "./data/F-F_Research_Data_Factors-monthly.CSV", index_col=0
                  )
                  ff_factors_monthly.index.names = ["Date"]
                  ff_factors_monthly.index = pd.to_datetime(ff_factors_monthly.index, format="%Y%m")
                  ff_factors_monthly.index = ff_factors_monthly.index.to_period("M")
                  ff_factors_monthly
                  Out:
                  Mkt-RFSMBHMLRF
                  Date
                  1926-072.96-2.56-2.430.22
                  1926-082.64-1.173.820.25
                  1926-090.36-1.400.130.23
                  1926-10-3.24-0.090.700.32
                  1926-112.53-0.10-0.510.31
                  ...............
                  2023-08-2.39-3.16-1.060.45
                  2023-09-5.24-2.511.520.43
                  2023-10-3.19-3.870.190.47
                  2023-118.84-0.021.640.44
                  2023-124.856.354.940.43

                  1170 rows × 4 columns

                  Step 3: Calculate Excess Returns of Portfolio or Asset

                  Next, we calculate the excess returns of QQQ by subtracting the risk-free rate from the monthly returns of QQQ. This gives us the dependent variable (excess returns of QQQ) that we aim to explain using the Fama-French factors. Before that, we filter the Fama-French factors to match the time period of QQQ returns (2006-2023).

                  # Filter factor dates to match the asset
                  ff_factors_subset = ff_factors_monthly[
                      ff_factors_monthly.index.isin(qqq_monthly.index)
                  ].copy()

                  # Step 3: Calculate excess returns for the asset
                  ff_factors_subset["Excess_Return"] = qqq_monthly["Return"] - ff_factors_subset["RF"]
                  ff_factors_subset
                  Out:
                  Mkt-RFSMBHMLRFExcess_Return
                  Date
                  2006-02-0.30-0.38-0.340.34-2.482885
                  2006-031.463.440.600.371.721080
                  2006-040.73-1.422.340.36-0.550790
                  2006-05-3.57-2.962.410.43-7.670149
                  2006-06-0.35-0.390.850.40-0.461573
                  ..................
                  2023-08-2.39-3.16-1.060.45-1.933010
                  2023-09-5.24-2.511.520.43-5.509862
                  2023-10-3.19-3.870.190.47-2.535485
                  2023-118.84-0.021.640.4410.378821
                  2023-124.856.354.940.435.156966

                  215 rows × 5 columns

                  Step 4: Run the Regression Model

                  We're ready to fit the Fama-French three-factor model using the statsmodels library. We use the ols function to specify the model formula and fit the model to the data. The model formula is specified as the excess returns of QQQ as the dependent variable and the three Fama-French factors as the independent variables.

                  import statsmodels.api as sm

                  # Prepare the independent variables (add a constant to the model)
                  X = sm.add_constant(ff_factors_subset[["Mkt-RF", "SMB", "HML"]])
                  # The dependent variable
                  y = ff_factors_subset["Excess_Return"]
                  # Run the regression
                  model = sm.OLS(y, X).fit()
                  # Display the summary of the regression
                  print(model.summary())
                                              OLS Regression Results                            
                  ==============================================================================
                  Dep. Variable: Excess_Return R-squared: 0.906
                  Model: OLS Adj. R-squared: 0.905
                  Method: Least Squares F-statistic: 680.7
                  Date: Mon, 26 Feb 2024 Prob (F-statistic): 3.43e-108
                  Time: 09:15:36 Log-Likelihood: -413.33
                  No. Observations: 215 AIC: 834.7
                  Df Residuals: 211 BIC: 848.1
                  Df Model: 3
                  Covariance Type: nonrobust
                  ==============================================================================
                                   coef std err t P>|t| [0.025 0.975]
                  ------------------------------------------------------------------------------
                  const 0.2397 0.116 2.067 0.040 0.011 0.468
                  Mkt-RF 1.1338 0.026 42.788 0.000 1.082 1.186
                  SMB -0.0565 0.049 -1.155 0.249 -0.153 0.040
                  HML -0.4177 0.035 -11.949 0.000 -0.487 -0.349
                  ==============================================================================
                  Omnibus: 0.661 Durbin-Watson: 2.269
                  Prob(Omnibus): 0.719 Jarque-Bera (JB): 0.764
                  Skew: -0.123 Prob(JB): 0.682
                  Kurtosis: 2.842 Cond. No. 4.93
                  ==============================================================================

                  Notes:
                  [1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
                  # Step 5.2: Plot the coefficients and their confidence intervals
                  factors = model.params.index[1:] # ['Mkt_Rf', 'SMB', 'HML']
                  coefficients = model.params.values[1:]
                  confidence_intervals = model.conf_int().diff(axis=1).iloc[1]

                  # Create a DataFrame
                  ols_data = pd.DataFrame(
                      {
                          "Factor": factors,
                          "Coefficient": coefficients,
                          "Confidence_Lower": confidence_intervals[0],
                          "Confidence_Upper": confidence_intervals[1],
                      }
                  )

                  # Plotting
                  plt.figure(figsize=(3, 3))
                  sns.barplot(x="Factor", y="Coefficient", data=ols_data, capsize=0.2, palette="coolwarm")

                  # Add the p-value for each factor to the plot
                  for i, row in ols_data.iterrows():
                      plt.text(
                          i,
                          0.2,
                          f"p-value:
                  {model.pvalues[row['Factor']]:.4f}",
                          ha="center",
                          va="bottom",
                          fontsize=6,
                      )

                  plt.title("Impact of Fama-French Factors on
                  QQQ Monthly Returns (2006-2023)")
                  plt.xlabel("Factor"); plt.ylabel("Coefficient Value")
                  plt.axhline(0, color="black", linewidth=0.8, linestyle="--")
                  plt.show()
                  Impact of Fama-French Factors on QQQ Monthly Returns (2006-2023)

                  Step 5: Interpret the Results

                  The results from the OLS (Ordinary Least Squares) regression fitting the Fama-French three-factor model on the excess monthly returns of QQQ from 2006 to 2023 provide insights into how the returns of QQQ are influenced by market excess returns (Mkt-RF), size factor (SMB), and value factor (HML).

                  Tables of coefficients:

                  The coef values represent the estimated impact of each factor on the excess returns, while the p-values indicate whether these impacts are statistically significant.

                  • coef: The estimated value of the coefficient. It indicates the change in the dependent variable for a one-unit change in the independent variable, holding other variables constant.
                  • std err: Standard error of the coefficient estimate. It measures the level of accuracy of the coefficient.
                  • t: The t-statistic value for the hypothesis test that the coefficient is different from zero. Large absolute values of t indicate that the coefficient is significantly different from zero.
                  • P > |t|: The p-value associated with the t-statistic. A low p-value (<0.05) suggests that the coefficient is statistically significant, meaning there is evidence that the coefficient is not zero.
                  • [0.025 0.975]: Confidence intervals provide a range within which the true coefficient value is likely to lie with a certain level of confidence (usually 95%). Narrower intervals around a coefficient indicate more precision in the estimates. The 95% confidence interval for the coefficient. If this interval does not include zero, the coefficient is considered statistically significant at the 5% level.

                  Factor Interpretation

                  Constant (const)

                  • Coefficient: 0.2397
                  • This represents the average monthly return of QQQ in excess of the risk-free rate that is not explained by the three Fama-French factors. It's statistically significant (p-value: 0.040), suggesting a positive alpha or performance unrelated to these factors.

                  Market Excess Return (Mkt-Rf)

                  • Coefficient: 1.1338
                  • This indicates that QQQ has a strong positive relationship with market excess returns. A 1% increase in market excess returns is associated with a 1.1338% increase in QQQ returns, on average. The coefficient is highly significant (p-value: 0.000), highlighting a strong dependency on market performance.

                  Size Factor (SMB)

                  • Coefficient: -0.0565
                  • This suggests a slight negative relationship between QQQ returns and the size premium, but the relationship is not statistically significant (p-value: 0.249). This means that QQQ's monthly returns are not significantly affected by the performance difference between small-cap and large-cap stocks.

                  Value Factor (HML)

                  • Coefficient: -0.4178
                  • QQQ shows a significant negative relationship with the value factor. A 1% increase in the value premium (value stocks outperforming growth stocks) is associated with a 0.4178% decrease in QQQ returns, on average. The coefficient is highly significant (p-value: 0.000), indicating that QQQ, which primarily consists of large tech (often considered growth) stocks, tends to perform inversely to the value factor.

                  Factors and Their Highest and Lowest Explanatory Power:

                  • Highest Explanatory Power: The factor with the highest or lowest coefficient value that is also statistically significant (low p-value) can be considered the most explanatory for the stock's returns. It's the factor to which the stock's returns are most sensitive.

                  • Lowest Explanatory Power: Conversely, the factor with the smallest absolute coefficient value (close to 0) or a coefficient that is not statistically significant (high p-value) would have the least explanatory power. If a factor's confidence interval includes zero, it also indicates a lack of strong evidence that the factor meaningfully explains the stock's returns.


                  Model Diagnostics

                  • R-squared: Represents the proportion of variance in the dependent variable that can be explained by the independent variables. It's a measure of the model's fit, with values closer to 1 indicating a better fit.
                  • Adjusted R-squared: Adjusts the R-squared value based on the number of predictors in the model. It's more useful for comparing models with different numbers of independent variables.
                  • AIC and BIC: Akaike’s Information Criterion (AIC) and Bayesian Information Criterion (BIC) are measures of the model's goodness of fit that also account for the complexity of the model. Lower values generally indicate a better model.

                  Statistical significance of the model:

                  • F-statistic: Used to test the overall significance of the model. It checks whether at least one predictor variable has a non-zero coefficient.
                  • Prob (F-statistic): The p-value associated with the F-statistic. A low value (typically <0.05) indicates that the model is statistically significant.

                  Other diagnostic tests:

                  • Omnibus/Prob(Omnibus): Tests the skewness and kurtosis of the residuals to assess the normality. Ideally, you want the Prob(Omnibus) to be close to 1, which would indicate normality.
                  • Durbin-Watson: Tests for autocorrelation in the residuals. Values close to 2 suggest no autocorrelation.
                  • Jarque-Bera (JB)/Prob(JB): Another test for the normality of residuals. Similar to the Omnibus test, a higher Prob(JB) indicates closer adherence to normality.
                  • Condition Number: Assesses the multicollinearity of the independent variables. Higher values indicate potential multicollinearity problems.

                  How to Interpret

                  • Good Fit Indicators: High R-squared (adjusted), significant F-statistic, low AIC/BIC, and statistically significant coefficients suggest a good model fit.
                  • Significance of Variables: Look at the p-values in the coefficients table. Variables with low p-values are considered significant drivers of the dependent variable.
                  • Model Diagnostics: Check Durbin-Watson for autocorrelation, Jarque-Bera and Omnibus for normality of residuals, and Condition Number for multicollinearity. Deviations in these diagnostics may suggest areas where the model could be improved or caution in interpreting the results.

                  Converting Monthly to Quarterly Factors

                  When dealing with portfolio returns that are not recorded on a monthly or annual basis, but quarterly, it becomes necessary to adjust the Fama-French factors from a monthly to a quarterly format. This adjustment ensures that the factor data aligns with the quarterly returns for accurate analysis. The process involves resampling the monthly data into quarterly intervals, followed by the aggregation of these monthly values to obtain their quarterly equivalents. This method is straightforward for additive data like returns, where the monthly values within each quarter are summed.

                  However, this approach requires modification when dealing with non-additive data, such as the risk-free rate. For the risk-free rate, the appropriate method is to take the value recorded at the end of each quarter, rather than summing monthly rates. This distinction is crucial for maintaining the accuracy of financial analyses, as it ensures that the risk-free rate reflects the actual market conditions at the end of the quarter.

                  The following code illustrates how to execute these transformations, showcasing the method for both additive and non-additive data:

                  ff_factors_monthly = pd.read_csv(
                      "./data/F-F_Research_Data_5_Factors_2x3-monthly.csv", index_col=0
                  )
                  ff_factors_monthly.index.names = ["Date"]
                  ff_factors_monthly
                  Out:
                  Mkt-RFSMBHMLRMWCMARF
                  Date
                  196307-0.39-0.41-0.970.68-1.180.27
                  1963085.07-0.801.800.36-0.350.25
                  196309-1.57-0.520.13-0.710.290.27
                  1963102.53-1.39-0.102.80-2.010.29
                  196311-0.85-0.881.75-0.512.240.27
                  .....................
                  202308-2.39-3.65-1.063.43-2.370.45
                  202309-5.24-1.801.521.86-0.830.43
                  202310-3.19-4.040.192.46-0.660.47
                  2023118.84-0.121.64-3.91-1.000.44
                  2023124.857.324.94-3.071.320.43

                  726 rows × 6 columns

                  ff_factors_monthly.index = pd.to_datetime(ff_factors_monthly.index, format="%Y%m")
                  # Sum up the monthly factors to get quarterly factors
                  ff_factors_quarterly = ff_factors_monthly.resample("Q").sum()
                  # For each quarter in ff_factors_quarterly, get the corresponding RF column
                  # in ff_factors_monthly by looking up the RF value of the last month in the quarter
                  ff_factors_quarterly["RF"] = ff_factors_monthly["RF"].resample("Q").last()
                  ff_factors_quarterly
                  Out:
                  Mkt-RFSMBHMLRMWCMARF
                  Date
                  1963-09-303.11-1.730.960.33-1.240.27
                  1963-12-313.51-4.371.632.320.160.29
                  1964-03-315.191.647.69-2.095.600.31
                  1964-06-302.79-1.861.81-1.71-1.080.30
                  1964-09-302.990.572.53-0.362.880.28
                  .....................
                  2022-12-316.02-1.0010.769.9714.020.33
                  2023-03-316.58-1.87-13.670.81-8.170.36
                  2023-06-307.42-1.60-8.022.79-5.980.40
                  2023-09-30-4.42-2.594.574.72-2.630.43
                  2023-12-3110.503.166.77-4.52-0.340.43

                  242 rows × 6 columns

                  Footer

                  Products

                  • EDGAR Filing Search API
                  • Full-Text Search API
                  • Real-Time Filing Stream API
                  • Filing Download & PDF Generator API
                  • XBRL-to-JSON Converter
                  • 10-K/10-Q/8-K Item Extractor
                  • Investment Adviser & Form ADV API
                  • Insider Trading Data - Form 3, 4, 5
                  • Restricted Sales Notifications - Form 144
                  • Institutional Holdings - Form 13F
                  • Form N-PORT API - Investment Company Holdings
                  • Form N-PX API - Proxy Voting Records
                  • Form 13D/13G API
                  • Form S-1/424B4 - IPOs, Debt & Rights Offerings
                  • Form C - Crowdfunding Offerings
                  • Form D - Private Placements & Exempt Offerings
                  • Regulation A Offering Statements API
                  • Changes in Auditors & Accountants
                  • Non-Reliance on Prior Financial Statements
                  • Executive Compensation Data API
                  • Directors & Board Members Data
                  • Company Subsidiaries Database
                  • Outstanding Shares & Public Float
                  • SEC Enforcement Actions
                  • Accounting & Auditing Enforcement Releases (AAERs)
                  • SRO Filings
                  • CIK, CUSIP, Ticker Mapping

                  General

                  • Pricing
                  • Features
                  • Supported Filings
                  • EDGAR Filing Statistics

                  Account

                  • Sign Up - Start Free Trial
                  • Log In
                  • Forgot Password

                  Developers

                  • API Sandbox
                  • Documentation
                  • Resources & Tutorials
                  • Python API SDK
                  • Node.js API SDK

                  Legal

                  • Terms of Service
                  • Privacy Policy

                  Legal

                  • Terms of Service
                  • Privacy Policy

                  SEC API

                  © 2025 sec-api.io by Data2Value GmbH. All rights reserved.

                  SEC® and EDGAR® are registered trademarks of the U.S. Securities and Exchange Commission (SEC).

                  EDGAR is the Electronic Data Gathering, Analysis, and Retrieval system operated by the SEC.

                  sec-api.io and Data2Value GmbH are independent of, and not affiliated with, sponsored by, or endorsed by the U.S. Securities and Exchange Commission.

                  sec-api.io is classified under SIC code 7375 (Information Retrieval Services), providing on-demand access to structured data and online information services.