{ "cells": [ { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "view-in-github" }, "source": [ "# **투자와 자산배분**\n", "## **1 포트폴리오 성과 측정**\n", "- 샤프지수 : 1단위 위험을 부담하는 대신 예상되는 수익 (삼각형 각도가 클수록 예상수익 높다)\n", "$$ 사프지수 = {(포트폴리오 예상 수익률 - 무위험률) \\over 포트폴리오 수익률 표준편차} $$\n", "- 젠센알파 지수 : 시장 대비 포트폴리오의 성과를 측정\n", "$$ 젠센의 알파(\\alpha) = 포트폴리오 수익률 - 기대 (적정) 수익률 $$\n", "- 트레이너 지수 (위험보상비율) (reword to volatility ratio)\n", "- 위험을 1단위 부담하는 대신 무위험 수익률을 초과하는 성과를 측정\n", "$$ 트레이너지수(T) = \\frac{포트폴리오 수익(R_{p})-무위험 수익(R_{f})}{ 포트폴리오 베타 (\\beta_{p})} $$" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "fR6bM7q701vq" }, "source": [ "## **2 맥시멈드로다운(MaxDrawDown)**\n", "- 최대 낙폭의 계산" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "id": "UGL3YRggVZSg", "outputId": "fe09fdd7-a93b-4d83-c2c1-1b992d5b82b7" }, "outputs": [ { "data": { "text/plain": [ "array([100, 120, 130, 130, 130, 130, 130, 130, 140, 160])" ] }, "execution_count": 1, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "np.maximum.accumulate(np.array([100, 120, 130, 100, 65, 80, 100, 120, 140, 160]))" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "id": "R80y9AWp24xC", "outputId": "faa597e6-4740-4f85-c8a0-6e50c1e66fd9" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.5333333333333333\n" ] } ], "source": [ "values = [100, 120, 130, 100, 65, 80, 100, 120, 140, 160]\n", "values = [100, 80, 75, 90,140,180, 220, 160, 190]\n", "values = [500000,750000,400000,600000,350000]\n", "\n", "def cummax( nums ):\n", " cum = []\n", " max = 0\n", " for item in nums:\n", " if item > max:\n", " max = item\n", " cum.append( max )\n", " return cum\n", "\n", "drawdown = [x - y for x, y in zip(values, cummax(values))]\n", "idx_lower = drawdown.index(min(drawdown)) \n", "idx_upper = values.index(max(values[:idx_lower])) \n", "print((values[idx_lower]-values[idx_upper])/values[idx_upper])" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 35 }, "colab_type": "code", "id": "eOHJprG-nZKJ", "outputId": "0f89892f-b811-4025-c379-8416eaad59bb" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-0.5333333333333333\n" ] } ], "source": [ "import numpy as np\n", "\n", "def mdd(x):\n", " arr = np.array(x) \n", " idx_lower = np.argmin(arr - np.maximum.accumulate(arr))\n", " idx_upper = np.argmax(arr[:idx_lower])\n", " return (arr[idx_lower] - arr[idx_upper]) / arr[idx_upper]\n", "\n", "print(mdd(values)) " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 54 }, "colab_type": "code", "id": "_UTTY3OZVmuw", "outputId": "b1887855-4967-4244-be2a-093dc26cfa8f" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[100, 120, 130, 130, 130, 130, 130, 130, 140, 160]\n", "[100 120 130 130 130 130 130 130 140 160]\n" ] } ], "source": [ "values = [100, 120, 130, 100, 65, 80, 100, 120, 140, 160]\n", "print(cummax(values))\n", "print(np.maximum.accumulate(np.array(values)))" ] } ], "metadata": { "colab": { "authorship_tag": "ABX9TyPhfHnRKXgQFDclAY5n1rzg", "collapsed_sections": [], "include_colab_link": true, "name": "2장 투자와 자산배분", "provenance": [] }, "kernelspec": { "display_name": "Python 3", "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }