{ "cells": [ { "cell_type": "markdown", "id": "1ed30b1e", "metadata": {}, "source": [ "
" ] }, { "cell_type": "markdown", "id": "550cc5f3", "metadata": {}, "source": [ "This code downloads historical price data for SPY and AAPL from Yahoo Finance, calculates daily returns, and computes the Sharpe ratio for these returns. It includes a function to determine the Sharpe ratio, adjusting for a daily benchmark return. The code then plots the rolling 30-day Sharpe ratio for AAPL and visualizes the histogram of these Sharpe ratios. Additionally, it compares the rolling 30-day Sharpe ratio of AAPL against SPY and plots the histogram of the differences." ] }, { "cell_type": "code", "execution_count": null, "id": "dcabe4c7", "metadata": {}, "outputs": [], "source": [ "import yfinance as yf\n", "import numpy as np" ] }, { "cell_type": "markdown", "id": "46f6a31c", "metadata": {}, "source": [ "Download historical price data for SPY and AAPL from Yahoo Finance" ] }, { "cell_type": "code", "execution_count": null, "id": "2a83f550", "metadata": {}, "outputs": [], "source": [ "data = yf.download([\"SPY\", \"AAPL\"], start=\"2020-01-01\", end=\"2022-07-31\")" ] }, { "cell_type": "markdown", "id": "2018e200", "metadata": {}, "source": [ "Extract adjusted closing prices for SPY and AAPL" ] }, { "cell_type": "code", "execution_count": null, "id": "c977a8bc", "metadata": {}, "outputs": [], "source": [ "closes = data['Adj Close']\n", "spy_returns = closes.SPY.pct_change().dropna()\n", "aapl_returns = closes.AAPL.pct_change().dropna()" ] }, { "cell_type": "markdown", "id": "9741f742", "metadata": {}, "source": [ "Define a function to calculate the Sharpe ratio of a strategy" ] }, { "cell_type": "code", "execution_count": null, "id": "f618f290", "metadata": {}, "outputs": [], "source": [ "def sharpe_ratio(returns, adjustment_factor=0.0):\n", " \"\"\"\n", " Determines the Sharpe ratio of a strategy.\n", " \n", " Parameters\n", " ----------\n", " returns : pd.Series or np.ndarray\n", " Daily returns of the strategy, noncumulative.\n", " adjustment_factor : int, float\n", " Constant daily benchmark return throughout the period.\n", "\n", " Returns\n", " -------\n", " sharpe_ratio : float\n", "\n", " Note\n", " -----\n", " See https://en.wikipedia.org/wiki/Sharpe_ratio for more details.\n", " \"\"\"\n", "\n", " # Adjust returns by subtracting the benchmark return\n", "\n", " returns_risk_adj = returns - adjustment_factor\n", "\n", " # Print the annualized standard deviation of the risk-adjusted returns\n", "\n", " print(returns_risk_adj.std() * np.sqrt(252))\n", "\n", " # Return the annualized Sharpe ratio\n", "\n", " return (\n", " returns_risk_adj.mean() / returns_risk_adj.std()\n", " ) * np.sqrt(252)" ] }, { "cell_type": "markdown", "id": "035cea96", "metadata": {}, "source": [ "Calculate the Sharpe ratio for SPY daily returns" ] }, { "cell_type": "code", "execution_count": null, "id": "23dfb39c", "metadata": {}, "outputs": [], "source": [ "sharpe_ratio(spy_returns)" ] }, { "cell_type": "markdown", "id": "19aebd83", "metadata": {}, "source": [ "Calculate the Sharpe ratio for AAPL daily returns" ] }, { "cell_type": "code", "execution_count": null, "id": "12292244", "metadata": {}, "outputs": [], "source": [ "sharpe_ratio(aapl_returns)" ] }, { "cell_type": "markdown", "id": "77252a24", "metadata": {}, "source": [ "Plot the rolling 30-day Sharpe ratio for AAPL" ] }, { "cell_type": "code", "execution_count": null, "id": "75215b9c", "metadata": {}, "outputs": [], "source": [ "aapl_returns.rolling(30).apply(sharpe_ratio).plot()" ] }, { "cell_type": "markdown", "id": "5ac119f9", "metadata": {}, "source": [ "Plot the histogram of the rolling 30-day Sharpe ratios for AAPL" ] }, { "cell_type": "code", "execution_count": null, "id": "bae6269a", "metadata": {}, "outputs": [], "source": [ "aapl_returns.rolling(30).apply(sharpe_ratio).hist(bins=50)" ] }, { "cell_type": "markdown", "id": "3b70d6ff", "metadata": {}, "source": [ "Compare the rolling 30-day Sharpe ratio of AAPL against SPY and plot the histogram of the differences" ] }, { "cell_type": "code", "execution_count": null, "id": "0796ca2e", "metadata": {}, "outputs": [], "source": [ "(\n", " aapl_returns.rolling(30).apply(sharpe_ratio)\n", " - spy_returns.rolling(30).apply(sharpe_ratio)\n", ").hist(bins=50)" ] }, { "cell_type": "markdown", "id": "cef5bf53", "metadata": {}, "source": [ "PyQuant News is where finance practitioners level up with Python for quant finance, algorithmic trading, and market data analysis. Looking to get started? Check out the fastest growing, top-selling course to get started with Python for quant finance. For educational purposes. Not investment advise. Use at your own risk." ] } ], "metadata": { "jupytext": { "cell_metadata_filter": "-all", "main_language": "python", "notebook_metadata_filter": "-all" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.13" } }, "nbformat": 4, "nbformat_minor": 5 }