BCV stock
Summary report: did BCV beat the Swiss market, robustness to the other factors, stability over time and limits of the exercise.
Factor models for Swiss assets, in CHF
Left: the average monthly excess return, annualised, split exactly into α and loading × average factor premium (ȳ = α + Σ βj x̄j). Right: the variance of the excess return split into each factor’s share (βj cov(xj, y) / var(y), summing to R²) and the unexplained part. A share can be negative when factors are correlated.
Each chart plots the excess return against one factor, after removing from both what the other regressors (constant included) explain. By the Frisch-Waugh-Lovell theorem, the slope of the line is exactly the coefficient of the full model and the residuals are those of the full model. The band is the confidence interval of the slope under the selected inference method.
Both assets are estimated over the same months, with the same factors and the same inference method. The alpha gap is estimated and tested directly by regressing the return of A minus the return of B on the same factors.
What the comparison can tell. Over an identical period, it measures whether each asset earned more or less than its exposure to the same factors would predict, and whether the gap between the two is statistically different from zero.
What it cannot tell. A higher alpha does not mean a better investment: a single stock concentrates the risk of one company, whereas a fund is diversified, as the residual volatilities show. A fund alpha close to zero or negative does not prove poor management: it is net of fees, which pay for a service, and it is estimated with uncertainty. Finally, an asset chosen with hindsight (such as the BCV stock) may show a past alpha that says nothing about the future.
Plain-language documents written in LaTeX and regenerated automatically with every data update. They cover reference specifications (full sample, Newey-West standard errors), not the settings chosen in “Analyze” or “Compare”. They open in a new tab. The documents are currently written in French.
Summary report: did BCV beat the Swiss market, robustness to the other factors, stability over time and limits of the exercise.
Summary report: did the fund beat the SPI after fees, and what does its alpha measure?
Comparison report: did the bank create more value for its shareholders than for the investors in its Swiss equity fund? The alpha gap is tested directly.
Note: macroeconomic scenario, qualitative, fundamental (Edwards-Bell-Ohlson model) and behavioural analyses, risk management, set against the fund’s measured performance.
Slides for a general audience: did the fund beat the Swiss market, and why the result matches Fama and French (2010) on actively managed funds.
There is no report for the other funds (Raiffeisen, Swisscanto, UBS): use “Analyze” or “Compare”.
If a source is unavailable, import a CSV file: a date column (YYYY-MM) followed by the schema columns, as monthly decimal returns (0.012 = 1.2%). Required columns: at least one asset (bcv_ret, fund_ret or raif_ret) and rf_saron; the Single Index requires spi_ret; multi-factor models require factors already converted to CHF: Swiss universe smb_ch, hml_ch, rmw_ch, cma_ch, mom_ch; European universe mkt_eu_chf, smb3_chf, hml3_chf, wml_chf, smb5_chf, hml5_chf, rmw5_chf, cma5_chf. Empty cells are missing values (no interpolation). Imported data stay in your browser.
BCV Swiss Equity A fund: Gérifonds’ official “dividends reinvested” performance index (gross distributions reinvested on the ex-date, net of the fees embedded in the NAV), taken at month-end. The pipeline recomputes it from the NAVs and the distribution table: each distribution must be found exactly once, and the year-to-date performance must equal the published one.
Other funds: Raiffeisen Futura - Swiss Stock A (CH0011980981, managed by Vontobel Asset Management for Raiffeisen), Swisscanto (CH) Equity Fund Responsible Switzerland AA (CH0011792451, Zürcher Kantonalbank), UBS (CH) Equity Fund – Switzerland Sustainable P (CH0002791769), all actively managed against the SPI, and the UBS 100 Index-Fund Switzerland P (CH0002788807), an index fund tracking the UBS 100 Index, which serves as a passive control: its alpha should be close to minus its fees. Source: Swiss Fund Data’s “Total Return Chart Price” series (SIX Financial Information / AMAS), distributions reinvested on the ex-date, net of fees, taken at month-end (daily since November 2009 for Raiffeisen, 2001 for Swisscanto and 2000 for the two UBS funds). The pipeline checks that, outside distributions, each fund’s daily return equals that of its published NAV and that each jump matches a plausible distribution. For Raiffeisen, calendar-year returns match the fund’s monthly factsheet (2023: 6.6%; 2024: 5.9%; 2025: 11.0%). No summary report is produced for these funds; the “Compare” section sets any two assets against each other. The list of funds lives in pipeline/config.py (SFD_FUNDS): adding an entry adds the fund to the menus.
“Swiss” universe: market = SPI TR; Swiss SMB, HML, RMW, CMA and MOM factors from Global Factor Data (Jensen, Kelly and Pedersen, 2023, Journal of Finance), characteristics market_equity, be_me, ope_be, at_gr1 and ret_12_1. These are long-short tercile portfolios weighted by capped market capitalisation, not the Fama-French 2×3 sorts; the same SMB and HML are used for FF3 and FF5. Published in USD, they are converted to CHF with FCHF = FUSD(1+s), like the European factors. Months in which a factor relies on fewer than 30 stocks are dropped. As publication is annual, this universe’s sample ends at the last published month, which also shortens the common sample of the model comparison.
BCV: Rt = Padjt/Padjt−1 − 1 on the last price of each month, Padj being adjusted for dividends and corporate actions (including the 10:1 split of May 2020, checked by the pipeline). Swiss market: SPI, a performance index (dividends reinvested), never replaced by a price index. An incomplete or missing month makes the adjacent returns missing: no multi-month return is presented as monthly.
SARON is an annualised overnight rate. Since September 2009, the realised return of month m is I(end m)/I(end m−1) − 1 with the compounded index Ii+1 = Ii(1 + ri·ni/360), ni = calendar days until the next fixing (ACT/360). The annualised SARON is never subtracted directly from a monthly return.
Daily SARON on the SNB data portal starts in August 2009. Earlier months use a rate known at the start of the month, rm−1 × dm/360 (dm = days in month m): the month-end SARON of the previous month back to mid-1999, then the yield of the 3-month money market debt register claims of the Swiss Confederation (the Swiss equivalent of T-bills, last auction of the month) back to February 1994; the series starts in 1992 but has missing months until then. Each splice is kept only if the approximation matches the series it extends over their common period; the figures are listed under “Sources and checks”. This extends the samples of the BCV stock (from 2003) and of the BCV fund (from 1998).
K. French’s series are in USD with a US risk-free rate. With st the monthly change in the USD/CHF rate: European market in CHF = (1 + Mkt−RF + RFUS)(1 + s) − 1, then excess return = CHF market − SARON; long-short factors (SMB, HML, RMW, CMA, WML): FCHF = FUSD(1 + s), an exact result since each leg converts as (1 + RUSD)(1 + s). The European universe is a comparison: its market is not that of a Swiss asset, which can produce an alpha that is merely an effect of the benchmark chosen. The hybrid variant (SPI market with European factors) is no longer offered since the Swiss factors were added.
OLS with a constant. Classical: V = s²(X′X)⁻¹, Student tests with n−k degrees of freedom, global F test. HC3: V = (X′X)⁻¹X′diag(e²/(1−h)²)X(X′X)⁻¹. Newey-West: Bartlett kernel, L = ⌊4(n/100)2/9⌋ by default, no small-sample correction. For HC3 and HAC, inference is asymptotic (normal distribution) and the global test is a Wald χ²(k−1) test. Coefficients do not change with the inference method. Annualised alpha = 12 × monthly alpha.
The Single Index scatter stays on the Results tab as a reference. For any other model, the tab first shows exact decompositions of that model: the average excess return split into α and βj × average factor premium, the variance split into each factor’s share βjcov(xj, y)/var(y), which sums to R², and one partial regression per factor. In a partial regression, the excess return and the factor are both purged of the other regressors; by the Frisch-Waugh-Lovell theorem, the slope is the coefficient of the full model.
Fund returns are net of the fees embedded in the NAV, so their alpha is a net alpha. The gross alpha adds the published TER: adding TER/12 to each monthly return shifts the constant by TER/12 without changing the slopes or the standard errors, so testing the gross alpha amounts to testing αnet = −TER/12. Only the current TER is known (fees assumed constant over the period), and transaction costs, which are not part of the TER, remain deducted.
The calculation engine running in the browser is tested automatically against statsmodels (coefficients, standard errors, tests, intervals, diagnostics, rolling windows) with every data update.