{ "cells": [ { "cell_type": "markdown", "id": "21417e28", "metadata": {}, "source": [ "# Leverage by Short-Selling\n", "\n", "The *standard mean-variance (Markowitz) portfolio selection model* determines an optimal investment portfolio that balances risk and expected return. In this notebook, we maximize the portfolio's expected return while constraining the admissible variance (risk) to a given maximum level. Please refer to the [annotated list of references](../literature.rst#portfolio-optimization) for more background information on portfolio optimization.\n", "\n", "This notebook adds *leverage* and *short-selling* to this basic model.\n", "In short-selling, assets are borrowed and sold, with the intention of repurchasing them later at a lower price. This augments traditional long-only investing by taking advantage of both rising and falling prices.\n", "Leverage means using borrowed capital as a funding source to increase the potential return.\n", "\n", "In the 130/30 investment strategy, a ratio of up to 130% of the starting capital is allocated to long positions. This is accomplished by short-selling up to 30% of the starting capital." ] }, { "cell_type": "code", "execution_count": 1, "id": "31d52539", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:02.642965Z", "iopub.status.busy": "2025-01-31T10:05:02.642714Z", "iopub.status.idle": "2025-01-31T10:05:03.431480Z", "shell.execute_reply": "2025-01-31T10:05:03.430757Z" }, "nbsphinx": "hidden" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Requirement already satisfied: numpy in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (2.2.2)\r\n", "Requirement already satisfied: scipy in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (1.15.1)\r\n", "Requirement already satisfied: gurobipy in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (11.0.3)\r\n", "Requirement already satisfied: pandas in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (2.2.3)\r\n", "Requirement already satisfied: matplotlib in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (3.10.0)\r\n", "Requirement already satisfied: python-dateutil>=2.8.2 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from pandas) (2.9.0.post0)\r\n", "Requirement already satisfied: pytz>=2020.1 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from pandas) (2025.1)\r\n", "Requirement already satisfied: tzdata>=2022.7 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from pandas) (2025.1)\r\n", "Requirement already satisfied: contourpy>=1.0.1 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (1.3.1)\r\n", "Requirement already satisfied: cycler>=0.10 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (0.12.1)\r\n", "Requirement already satisfied: fonttools>=4.22.0 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (4.55.8)\r\n", "Requirement already satisfied: kiwisolver>=1.3.1 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (1.4.8)\r\n", "Requirement already satisfied: packaging>=20.0 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (24.2)\r\n", "Requirement already satisfied: pillow>=8 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (11.1.0)\r\n", "Requirement already satisfied: pyparsing>=2.3.1 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from matplotlib) (3.2.1)\r\n", "Requirement already satisfied: six>=1.5 in /opt/hostedtoolcache/Python/3.11.11/x64/lib/python3.11/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\r\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "# Install dependencies\n", "%pip install numpy scipy gurobipy pandas matplotlib" ] }, { "cell_type": "code", "execution_count": 2, "id": "73c48d29", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:03.433583Z", "iopub.status.busy": "2025-01-31T10:05:03.433380Z", "iopub.status.idle": "2025-01-31T10:05:04.075972Z", "shell.execute_reply": "2025-01-31T10:05:04.075302Z" } }, "outputs": [], "source": [ "import gurobipy as gp\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 3, "id": "652f76cb", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.078388Z", "iopub.status.busy": "2025-01-31T10:05:04.077953Z", "iopub.status.idle": "2025-01-31T10:05:04.086426Z", "shell.execute_reply": "2025-01-31T10:05:04.085835Z" }, "nbsphinx": "hidden" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Set parameter WLSAccessID\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Set parameter WLSSecret\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Set parameter LicenseID to value 2443533\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WLS license 2443533 - registered to Gurobi GmbH\n" ] } ], "source": [ "# Hidden cell to avoid licensing messages\n", "# when docs are generated.\n", "with gp.Model():\n", " pass" ] }, { "cell_type": "markdown", "id": "c9c5ba95", "metadata": {}, "source": [ "## Input Data\n", "\n", "The following input data is used within the model:\n", "\n", "- $S$: set of stocks\n", "- $\\mu$: vector of expected returns\n", "- $\\Sigma$: PSD variance-covariance matrix\n", " - $\\sigma_{ij}$ covariance between returns of assets $i$ and $j$\n", " - $\\sigma_{ii}$ variance of return of asset $i$" ] }, { "cell_type": "code", "execution_count": 4, "id": "23c62970", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.088696Z", "iopub.status.busy": "2025-01-31T10:05:04.088154Z", "iopub.status.idle": "2025-01-31T10:05:04.093973Z", "shell.execute_reply": "2025-01-31T10:05:04.093389Z" } }, "outputs": [], "source": [ "# Import some example data set\n", "Sigma = pd.read_pickle(\"sigma.pkl\")\n", "mu = pd.read_pickle(\"mu.pkl\")" ] }, { "cell_type": "markdown", "id": "0a3b5325", "metadata": {}, "source": [ "## Formulation\n", "Mathematically, this results in a convex quadratically constrained optimization problem.\n", "\n", "### Model Parameters\n", "\n", "The following parameters are used within the model:\n", "\n", "- $\\bar\\sigma^2$: maximal admissible variance for the portfolio return\n", "- $s_\\text{total}$: maximal total short ratio allowed\n", "- $s_i$: maximal short ratio for asset $i$\n", "- $\\ell_i$: maximal long ratio (i.e., position size) for asset $i$\n", "\n", "To model a 130/30-portfolio, we will use $s_\\text{total}=0.3$ in our example. In this strategy, we use the cash from short-selling to buy assets on the long side." ] }, { "cell_type": "code", "execution_count": 5, "id": "d2a604e0", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.095921Z", "iopub.status.busy": "2025-01-31T10:05:04.095734Z", "iopub.status.idle": "2025-01-31T10:05:04.098837Z", "shell.execute_reply": "2025-01-31T10:05:04.098429Z" } }, "outputs": [], "source": [ "# Values for the model parameters:\n", "V = 4.0 # Maximal admissible variance (sigma^2)\n", "s_total = 0.3 # Maximal short ratio\n", "\n", "s = 0.1 * np.ones(mu.shape) # Maximal short per asset\n", "l = 0.2 * np.ones(mu.shape) # Maximal long per asset" ] }, { "cell_type": "markdown", "id": "68a5a517", "metadata": {}, "source": [ "### Decision Variables\n", "We need three sets of decision variables:\n", "\n", "1. The proportions of capital invested among the considered stocks. The corresponding vector of positions is denoted by $x$ with its component $x_i$ denoting the proportion of capital invested in stock $i$. Since we allow short positions, $x_i$ may be negative.\n", "\n", "The other sets split the position into long and short components:\n", "\n", "2. The *long* proportions of each stock in the portfolio. The corresponding vector of long positions is denoted by $x^+$ with its component $x^+_i$ representing the long position in stock $i$.\n", "\n", "3. The *short* proportions of each stock in the portfolio. The corresponding vector of short positions is denoted by $x^-$ with its component $x^-_i$ representing the short position in stock $i$.\n", "\n", "### Variable Bounds\n", "\n", "Each position must be between $-s_i$ and $\\ell_i$:\n", "\n", "$$-s_i\\leq x_i\\leq \\ell_i \\; , \\; i \\in S$$\n", "\n", "The long and short proportions must be non-negative:\n", "\n", "$$ x_i^+, x_i^- \\geq 0\\; , \\, i \\in S$$" ] }, { "cell_type": "code", "execution_count": 6, "id": "68fcfee5", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.100596Z", "iopub.status.busy": "2025-01-31T10:05:04.100396Z", "iopub.status.idle": "2025-01-31T10:05:04.106865Z", "shell.execute_reply": "2025-01-31T10:05:04.106277Z" } }, "outputs": [], "source": [ "%%capture\n", "# Create an empty optimization model\n", "m = gp.Model()\n", "\n", "# Add variables: x[i] denotes the proportion invested in stock i\n", "x = m.addMVar(len(mu), lb=-s, ub=l, name=\"x\")\n", "# Add variables: x_plus[i] denotes the long proportion of stock i\n", "x_plus = m.addMVar(len(mu), lb=0, name=\"x_plus\")\n", "# Add variables: x_minus[i] denotes the short proportion of stock i\n", "x_minus = m.addMVar(len(mu), lb=0, name=\"x_minus\")" ] }, { "cell_type": "markdown", "id": "94cf8d51", "metadata": {}, "source": [ "### Constraints\n", "\n", "The budget constraint ensures that all capital is invested:\n", "\\begin{equation*}\n", "\\sum_{i \\in S} x_i = 1\n", "\\end{equation*}\n", "\n", "The proportion of capital invested is the difference between the positive and the negative parts:\n", "\\begin{equation*}\n", "x_i = x^+_i - x^-_i \\; , \\; i \\in S \\tag{1}\n", "\\end{equation*}\n", "\n", "The estimated risk must not exceed a prespecified maximal admissible level of variance $\\bar\\sigma^2$:\n", "\\begin{equation*}\n", "x^\\top \\Sigma x \\leq \\bar\\sigma^2\n", "\\end{equation*}" ] }, { "cell_type": "code", "execution_count": 7, "id": "ab815b0b", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.108676Z", "iopub.status.busy": "2025-01-31T10:05:04.108498Z", "iopub.status.idle": "2025-01-31T10:05:04.284758Z", "shell.execute_reply": "2025-01-31T10:05:04.284187Z" } }, "outputs": [], "source": [ "%%capture\n", "# Budget constraint: all investments sum up to 1\n", "budget_constr = m.addConstr(x.sum() == 1, name=\"Budget_Constraint\")\n", "\n", "# Position rebalancing constraint, see formula (1) above\n", "m.addConstr(x == x_plus - x_minus, name=\"Position_Balance\")\n", "\n", "# Upper bound on variance\n", "risk_constr = m.addConstr(x @ Sigma.to_numpy() @ x <= V, name=\"Variance\")" ] }, { "cell_type": "markdown", "id": "07ead5d5", "metadata": {}, "source": [ "#### Limiting Total Leverage and Short-Selling\n", "\n", "We limit the total of the short positions:\n", "\n", "\\begin{equation*}\n", "\\sum_{i \\in S} x^-_i \\leq s_\\text{total}\\tag{2}\n", "\\end{equation*}\n", "\n", "Note that in the optimal solution of the optimization problem, at least one of the two variables $x^+_i$ or $x^-_i$ is necessarily equal to zero for each asset $i$; this follows from the convexity of the problem. Generally though, if additional discrete constraints were added to the model, this complementarity is no longer guaranteed and more modeling care has to be taken; see [the notebook on transaction costs](transaction_costs.ipynb) for more details" ] }, { "cell_type": "code", "execution_count": 8, "id": "b34c471b", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.287452Z", "iopub.status.busy": "2025-01-31T10:05:04.287143Z", "iopub.status.idle": "2025-01-31T10:05:04.292518Z", "shell.execute_reply": "2025-01-31T10:05:04.291980Z" } }, "outputs": [], "source": [ "%%capture\n", "# Max short; see formula (2) above\n", "short_constr = m.addConstr(x_minus.sum() <= s_total, name=\"Total_Short\")" ] }, { "cell_type": "markdown", "id": "b50089f7", "metadata": {}, "source": [ "### Objective Function\n", "The objective is to maximize the expected return of the portfolio:\n", "$$\\max_x \\mu^\\top x $$" ] }, { "cell_type": "code", "execution_count": 9, "id": "0c5204eb", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.295410Z", "iopub.status.busy": "2025-01-31T10:05:04.294664Z", "iopub.status.idle": "2025-01-31T10:05:04.299022Z", "shell.execute_reply": "2025-01-31T10:05:04.298503Z" } }, "outputs": [], "source": [ "m.setObjective(mu.to_numpy() @ x, gp.GRB.MAXIMIZE)" ] }, { "cell_type": "markdown", "id": "17328185", "metadata": {}, "source": [ "We now solve the optimization problem:" ] }, { "cell_type": "code", "execution_count": 10, "id": "92111249", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.301292Z", "iopub.status.busy": "2025-01-31T10:05:04.301085Z", "iopub.status.idle": "2025-01-31T10:05:04.724020Z", "shell.execute_reply": "2025-01-31T10:05:04.723320Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Gurobi Optimizer version 11.0.3 build v11.0.3rc0 (linux64 - \"Ubuntu 24.04.1 LTS\")\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "CPU model: AMD EPYC 7763 64-Core Processor, instruction set [SSE2|AVX|AVX2]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Thread count: 1 physical cores, 2 logical processors, using up to 2 threads\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "WLS license 2443533 - registered to Gurobi GmbH\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Optimize a model with 464 rows, 1386 columns and 2310 nonzeros\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model fingerprint: 0x5705a198\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Model has 1 quadratic constraint\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Coefficient statistics:\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Matrix range [1e+00, 1e+00]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " QMatrix range [3e-03, 1e+02]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Objective range [7e-02, 6e-01]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Bounds range [1e-01, 2e-01]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " RHS range [3e-01, 1e+00]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " QRHS range [4e+00, 4e+00]\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Presolve removed 0 rows and 462 columns\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Presolve time: 0.04s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Presolved: 927 rows, 1387 columns, 109264 nonzeros\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Presolved model has 1 second-order cone constraint\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Ordering time: 0.01s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Barrier statistics:\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " AA' NZ : 2.153e+05\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Factor NZ : 2.423e+05 (roughly 3 MB of memory)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Factor Ops : 9.108e+07 (less than 1 second per iteration)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Threads : 1\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " Objective Residual\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Iter Primal Dual Primal Dual Compl Time\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 0 1.09530770e+01 6.63152811e+01 4.62e+01 5.22e-01 6.75e-02 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 1 1.06683696e+00 1.01784355e+01 3.23e+00 2.60e-03 5.81e-03 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 2 3.13698670e-01 1.45958398e+00 1.72e-01 1.43e-04 5.68e-04 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 3 3.32627798e-01 8.43175671e-01 5.01e-02 5.74e-05 2.36e-04 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 4 3.33107237e-01 6.88708709e-01 1.04e-02 3.53e-05 1.56e-04 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 5 3.77330169e-01 5.62141009e-01 1.45e-05 1.80e-05 8.00e-05 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 6 4.10777104e-01 4.65400413e-01 8.00e-07 5.13e-06 2.36e-05 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 7 4.18189425e-01 4.32791130e-01 1.91e-12 1.46e-06 6.32e-06 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 8 4.20353188e-01 4.23676729e-01 1.61e-12 3.92e-07 1.44e-06 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 9 4.20528316e-01 4.20638414e-01 1.29e-12 7.80e-09 4.76e-08 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 10 4.20558431e-01 4.20559964e-01 3.25e-12 9.27e-11 6.63e-10 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " 11 4.20558886e-01 4.20558929e-01 4.13e-10 4.79e-13 1.84e-11 0s\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Barrier solved model in 11 iterations and 0.41 seconds (0.75 work units)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "Optimal objective 4.20558886e-01\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "m.optimize()" ] }, { "cell_type": "markdown", "id": "347c1555", "metadata": {}, "source": [ "Display basic solution data for all non-negligible positions; for clarity we've rounded all solution quantities to five digits." ] }, { "cell_type": "code", "execution_count": 11, "id": "3e83058a", "metadata": { "execution": { "iopub.execute_input": "2025-01-31T10:05:04.726393Z", "iopub.status.busy": "2025-01-31T10:05:04.725807Z", "iopub.status.idle": "2025-01-31T10:05:04.744361Z", "shell.execute_reply": "2025-01-31T10:05:04.743695Z" } }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Expected return: 0.420559\n", "Variance: 4.000000\n", "Solution time: 0.41 seconds\n", "\n", "Total long: 1.299989\n", "Total short: 0.299994\n", "Number of positions: 37\n", " long: 27\n", " short: 10\n" ] }, { "data": { "text/html": [ "
\n", " | x | \n", "x_plus | \n", "x_minus | \n", "
---|---|---|---|
LLY | \n", "0.200000 | \n", "0.200000 | \n", "0.000000 | \n", "
PGR | \n", "0.151630 | \n", "0.151630 | \n", "0.000000 | \n", "
NVDA | \n", "0.114539 | \n", "0.114539 | \n", "0.000000 | \n", "
AVGO | \n", "0.094076 | \n", "0.094076 | \n", "0.000000 | \n", "
KDP | \n", "0.087209 | \n", "0.087209 | \n", "0.000000 | \n", "
CTAS | \n", "0.072373 | \n", "0.072373 | \n", "0.000000 | \n", "
ORLY | \n", "0.068337 | \n", "0.068337 | \n", "0.000000 | \n", "
ODFL | \n", "0.067242 | \n", "0.067242 | \n", "0.000000 | \n", "
TMUS | \n", "0.060544 | \n", "0.060544 | \n", "0.000000 | \n", "
UNH | \n", "0.048677 | \n", "0.048677 | \n", "0.000000 | \n", "
NOC | \n", "0.037328 | \n", "0.037328 | \n", "0.000000 | \n", "
DPZ | \n", "0.030310 | \n", "0.030310 | \n", "0.000000 | \n", "
TSLA | \n", "0.028205 | \n", "0.028205 | \n", "0.000000 | \n", "
NFLX | \n", "0.027622 | \n", "0.027622 | \n", "0.000000 | \n", "
META | \n", "0.026806 | \n", "0.026806 | \n", "0.000000 | \n", "
KR | \n", "0.024662 | \n", "0.024662 | \n", "0.000000 | \n", "
TTWO | \n", "0.024389 | \n", "0.024389 | \n", "0.000000 | \n", "
FICO | \n", "0.023286 | \n", "0.023286 | \n", "0.000000 | \n", "
TDG | \n", "0.018706 | \n", "0.018706 | \n", "0.000000 | \n", "
WST | \n", "0.017231 | \n", "0.017231 | \n", "0.000000 | \n", "
MNST | \n", "0.016325 | \n", "0.016325 | \n", "0.000000 | \n", "
DXCM | \n", "0.016308 | \n", "0.016308 | \n", "0.000000 | \n", "
FANG | \n", "0.013230 | \n", "0.013230 | \n", "0.000000 | \n", "
MSFT | \n", "0.011159 | \n", "0.011159 | \n", "0.000000 | \n", "
ENPH | \n", "0.010581 | \n", "0.010581 | \n", "0.000000 | \n", "
MOH | \n", "0.007055 | \n", "0.007055 | \n", "0.000000 | \n", "
AXON | \n", "0.002159 | \n", "0.002159 | \n", "0.000000 | \n", "
FCX | \n", "-0.000306 | \n", "0.000000 | \n", "0.000306 | \n", "
MOS | \n", "-0.005042 | \n", "0.000000 | \n", "0.005042 | \n", "
WY | \n", "-0.006748 | \n", "0.000000 | \n", "0.006748 | \n", "
WYNN | \n", "-0.007073 | \n", "0.000000 | \n", "0.007073 | \n", "
KMI | \n", "-0.015030 | \n", "0.000000 | \n", "0.015030 | \n", "
PARA | \n", "-0.027389 | \n", "0.000000 | \n", "0.027389 | \n", "
IVZ | \n", "-0.050755 | \n", "0.000000 | \n", "0.050755 | \n", "
VTRS | \n", "-0.050903 | \n", "0.000000 | \n", "0.050903 | \n", "
CCL | \n", "-0.056904 | \n", "0.000000 | \n", "0.056904 | \n", "
TRMB | \n", "-0.079845 | \n", "0.000000 | \n", "0.079845 | \n", "