Volatility Decomposition and Mutual Fund Returns
Log in to collectOnsite backtest IDE
Quant Buffet native backtest IDEEdit and run Quant Buffet Python for Volatility Decomposition and Mutual Fund Returns in the browser. Results update live with equity, drawdown, and metrics charts. Allowed: backtest.data, backtest.engine, backtest.metrics, numpy, pandas. Define ASSETS and make_on_day(prices). Shortcut: Ctrl+Enter. API docs →
Quant Buffet syntax cheat sheet (copy / insert)
Paste these fragments into the editor. The sandbox rejects QuantConnect, os, and network libraries.
from __future__ import annotations
import numpy as np
import pandas as pd
from backtest.data import load_daily_prices
from backtest.engine import EngineConfig, PortfolioEngine
from backtest.metrics import compute_metricsASSETS = ["SPY", "QQQ", "TLT", "GLD", "BIL"]def make_on_day(prices: pd.DataFrame):
cols = [c for c in ASSETS if c in prices.columns]
sma = prices[cols].rolling(200, min_periods=200).mean()
state = {"last": None}
def on_day(engine: PortfolioEngine, dt: pd.Timestamp) -> None:
if sma.loc[dt].isna().all():
return
key = (dt.year, dt.month)
if state["last"] == key:
return
state["last"] = key
long = [
s for s in cols
if pd.notna(prices.at[dt, s]) and pd.notna(sma.at[dt, s])
and prices.at[dt, s] > sma.at[dt, s]
]
weights = {} if not long else {s: 1.0 / len(long) for s in long}
engine.set_target_weights(dt, weights)
ready = sma.dropna(how="all").index.min() if sma.notna().any().any() else None
return on_day, readyengine.set_target_weights(dt, {"SPY": 0.60, "BIL": 0.40})Live backtest performance
Export to your platform
Transform Quant Buffet lab code (ASSETS + make_on_day / PortfolioEngine) into native classes for a third-party IDE — then copy and paste.
# Generated from Quant Buffet → QuantConnect LEAN
# Strategy: Volatility Decomposition and Mutual Fund Returns
# Detected pattern: Absolute momentum
# Source uses Quant Buffet lab APIs (ASSETS + make_on_day / PortfolioEngine).
# Review fees, data, and risk before live trading — educational export only.
from AlgorithmImports import *
class QuantBuffetExport(QCAlgorithm):
def Initialize(self):
self.SetStartDate(2010, 1, 1)
self.SetCash(100000)
tickers = ["SPY", "TLT", "GLD", "BIL"]
self.symbols = []
for t in tickers:
if "-" in t: # crypto proxy e.g. BTC-USD
self.symbols.append(self.AddCrypto(t.replace("-USD", ""), Resolution.Daily).Symbol)
else:
self.symbols.append(self.AddEquity(t, Resolution.Daily).Symbol)
self.Schedule.On(
self.DateRules.MonthStart(self.symbols[0]),
self.TimeRules.AfterMarketOpen(self.symbols[0], 30),
self.Rebalance,
)
# Logic: Long assets with positive 252-day return; equal-weight; monthly.
def Rebalance(self):
# Pattern: abs_momentum — Long assets with positive 252-day return; equal-weight; monthly.
# Default: equal-weight. Port your make_on_day weights here via SetHoldings.
w = 1.0 / len(self.symbols) if self.symbols else 0.0
for symbol in self.symbols:
self.SetHoldings(symbol, w)
Exported code uses the platform’s native classes and libraries. Install dependencies in your third-party IDE, then run. Validate before live trading.
Academic paper
Mutual Fund Performance and the Sources of Portfolio Volatility
Nima Vafai; David A. Rakowski
- The University of Texas of the Permian Basin
- ?The university of Texas Permian Basin
- The University of Texas at Arlington
- ?University of Texas at Arlington
https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4005351


Strategy in a nutshell
The investment universe consists of all funds in the CRSP mutual fund database. Funds with less than 80% of assets invested in CRSP-covered stocks during the current and previous year are excluded. For mutual funds with multiple share classes, assets are aggregated across classes, and all fund attributes, including returns, are weighted by lagged assets in each class.
Each month, for each mutual fund kkk, calculate the total return variance σ2\sigma^2σ2 using the weighted covariance of all constituent assets. Decompose σ2\sigma^2σ2 into the average holdings’ variance ν\nuν and average holdings’ covariance ψ\psiψ. Compute ν\nuν using daily returns of each security, then derive ψ\psiψ as σ2−ν\sigma^2 - \nuσ2−ν.
Mutual funds are sorted monthly into equally-weighted deciles based on σ2\sigma^2σ2, ν\nuν, and ψ\psiψ. The strategy allocates 50% to the bottom decile of funds with the lowest variance σ2\sigma^2σ2 and 50% to the bottom decile with the lowest average holdings’ covariance ψ\psiψ. Portfolios are equally weighted and rebalanced monthly.
Economic rationale
Financial theory posits that higher expected returns are associated with higher risk. In practice, investors often overpay for risky assets, causing high-volatility assets to be overvalued and low-volatility assets to be undervalued, resulting in lower and higher subsequent returns, respectively.
Following Markowitz (1952, 1959), a portfolio’s total risk (σ2\sigma^2σ2) can be decomposed into variance of holdings (ν\nuν) and covariances of holdings (ψ\psiψ). While diversification reduces ν\nuν toward zero, it does not eliminate ψ\psiψ. Hence, the covariance component ψ\psiψ drives the volatility-based return patterns observed, rather than the overall portfolio variance σ2\sigma^2σ2.