{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Financial Investment Planning\n", "\n", "## Introduction\n", "\n", "A financial strategy produces orders. These orders are transmitted to a broker. The broker checks the validity of the order and sends each valid order to the market and sends back a transaction. Every time we buy some shares the broker opens a position with the buy price. If we sell some shares this should be related to a position in order to calculate the profit. Therefore the position information is important mainly in order to calculate profit. We call a buy/sell matching a trade. The sum of all positions are called the portfolio. \n", "\n", "\n", "\n", "#### Assumptions for this notebook\n", "\n", "+ no user account information\n", "+ stock market (consisting of 23 symbols),\n", "+ only market orders,\n", "+ no short positions, \n", "+ the price is determined by the historical *daily* candle data." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# TableOfContents\n", "+ [Order and Transaction](#OrderAndTransaction)\n", "+ [Portfolio](#Portfolio)\n", "+ [Dividend and Split](#DividendAndSplit)\n", "+ [Rebalance](#Rebalance)\n", "+ [Backtest](#Backtest)\n", "+ [Index Calculation](#IndexCalculation)\n", "+ [Risk Calculation](#RiskCalculation)\n", "+ [Visualization](#Visualization)\n", "+ [To Do](#ToDo)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Symbol, the price of a symbol\n", "*Symbols* are the financial instrument that we can invest in. At a given point, there is no known price but the price depends on the buyers' and sellers' bid prices. The price of a symbol is **calculated** by the market for a given order. Therefore the price of a symbol may change constantly. Usually symbols have *candle data* (5min, 1day) etc.. storing open, close, low and high values." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/can/anaconda2/lib/python2.7/site-packages/pandas/computation/__init__.py:19: UserWarning: The installed version of numexpr 2.4.4 is not supported in pandas and will be not be used\n", "\n", " UserWarning)\n" ] } ], "source": [ "import pandas as pd\n", "import pandas_datareader.data as web\n", "from pandas.tseries.offsets import BDay\n", "import datetime\n", "import warnings\n", "from copy import deepcopy\n", "import numpy as np\n", "%matplotlib inline\n", "from scipy.stats import linregress\n", "import matplotlib.pyplot as plt\n", "from math import sqrt\n", "import scipy.stats as st" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "symbols = ['AEFES.IS', 'AKENR.IS', 'AKSA.IS', 'AKBNK.IS', 'GARAN.IS',\n", " 'MGROS.IS', 'THYAO.IS', 'TRKCM.IS', 'ZOREN.IS', 'XU100.IS', \n", " 'ALARK.IS', 'CIMSA.IS', 'HALKB.IS', 'TKFEN.IS', 'FROTO.IS', \n", " 'DOAS.IS', 'KARSN.IS', 'TMSN.IS', 'YKBNK.IS', 'VAKBN.IS', \n", " 'ULKER.IS', 'TCELL.IS', 'SISE.IS', 'EREGL.IS', 'PETKM.IS', \n", " 'BJKAS.IS', 'AFYON.IS', 'KOZAL.IS', 'GOODY.IS', 'VAKFN.IS']\n", "\n", "start = datetime.datetime(2015,1,1)\n", "end = datetime.datetime.now()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "prices = pd.DataFrame()\n", "for symbol in symbols:\n", " f = web.DataReader(symbol, 'yahoo', start, end)\n", " f['symbol'] = symbol\n", " prices = pd.concat([prices, f])\n", "prices;" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "How do I calculae the adjusted closing price?\n", "http://www.investopedia.com/ask/answers/06/adjustedclosingprice.asp\n", "\n", "- **cash dividend (d)**: closing_price - d\n", "- **share dividend (x:y)**: closing_price* (y+x)/x\n", "- **share split (x:y)**: closing_price * y/x" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "prices = prices.pivot(columns=\"symbol\", values=\"Adj Close\")" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolAEFES.ISAFYON.ISAKBNK.ISAKENR.ISAKSA.ISALARK.ISBJKAS.ISCIMSA.ISDOAS.ISEREGL.IS...THYAO.ISTKFEN.ISTMSN.ISTRKCM.ISULKER.ISVAKBN.ISVAKFN.ISXU100.ISYKBNK.ISZOREN.IS
Date
2016-09-2618.705.697.960.948.203.444.5814.929.934.28...5.127.377.512.4421.444.431.1776725.70313.661.57
2016-09-2718.695.728.130.958.203.454.7214.989.924.24...5.137.537.512.4321.084.541.1777160.70313.701.58
2016-09-2818.495.858.310.958.273.524.7615.089.974.20...5.167.497.522.4521.244.701.1877677.79693.761.60
2016-09-2918.406.198.130.968.203.594.4115.079.934.19...5.167.707.562.4821.224.621.1777076.79693.701.60
2016-09-3018.176.308.040.958.163.574.2614.8910.054.13...5.147.727.532.4921.384.591.1876488.39843.671.59
\n", "

5 rows × 30 columns

\n", "
" ], "text/plain": [ "symbol AEFES.IS AFYON.IS AKBNK.IS AKENR.IS AKSA.IS ALARK.IS \\\n", "Date \n", "2016-09-26 18.70 5.69 7.96 0.94 8.20 3.44 \n", "2016-09-27 18.69 5.72 8.13 0.95 8.20 3.45 \n", "2016-09-28 18.49 5.85 8.31 0.95 8.27 3.52 \n", "2016-09-29 18.40 6.19 8.13 0.96 8.20 3.59 \n", "2016-09-30 18.17 6.30 8.04 0.95 8.16 3.57 \n", "\n", "symbol BJKAS.IS CIMSA.IS DOAS.IS EREGL.IS ... THYAO.IS \\\n", "Date ... \n", "2016-09-26 4.58 14.92 9.93 4.28 ... 5.12 \n", "2016-09-27 4.72 14.98 9.92 4.24 ... 5.13 \n", "2016-09-28 4.76 15.08 9.97 4.20 ... 5.16 \n", "2016-09-29 4.41 15.07 9.93 4.19 ... 5.16 \n", "2016-09-30 4.26 14.89 10.05 4.13 ... 5.14 \n", "\n", "symbol TKFEN.IS TMSN.IS TRKCM.IS ULKER.IS VAKBN.IS VAKFN.IS \\\n", "Date \n", "2016-09-26 7.37 7.51 2.44 21.44 4.43 1.17 \n", "2016-09-27 7.53 7.51 2.43 21.08 4.54 1.17 \n", "2016-09-28 7.49 7.52 2.45 21.24 4.70 1.18 \n", "2016-09-29 7.70 7.56 2.48 21.22 4.62 1.17 \n", "2016-09-30 7.72 7.53 2.49 21.38 4.59 1.18 \n", "\n", "symbol XU100.IS YKBNK.IS ZOREN.IS \n", "Date \n", "2016-09-26 76725.7031 3.66 1.57 \n", "2016-09-27 77160.7031 3.70 1.58 \n", "2016-09-28 77677.7969 3.76 1.60 \n", "2016-09-29 77076.7969 3.70 1.60 \n", "2016-09-30 76488.3984 3.67 1.59 \n", "\n", "[5 rows x 30 columns]" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "prices.tail()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [], "source": [ "dividends_and_splits= pd.DataFrame()\n", "\n", "for symbol in symbols:\n", " f = web.DataReader(symbol, 'yahoo-actions')\n", " if len(f) > 0:\n", " f['symbol'] = symbol\n", " dividends_and_splits = pd.concat([dividends_and_splits, f])" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionvaluesymbol
2013-06-26SPLIT0.869565THYAO.IS
2011-07-11SPLIT0.833333THYAO.IS
2013-07-03SPLIT0.980392TRKCM.IS
2012-07-16SPLIT0.869565TRKCM.IS
2010-11-25SPLIT0.500000DOAS.IS
2013-07-04SPLIT0.961538SISE.IS
2012-07-10SPLIT0.909091SISE.IS
2011-06-20SPLIT0.884956SISE.IS
2013-04-12SPLIT0.884956EREGL.IS
2012-04-30SPLIT0.699301EREGL.IS
2011-03-15SPLIT0.746269EREGL.IS
2010-07-02SPLIT0.250000PETKM.IS
2010-01-18SPLIT0.040000AFYON.IS
2010-06-16SPLIT0.500000KOZAL.IS
2016-06-01SPLIT0.045455GOODY.IS
2013-07-29SPLIT0.925926VAKFN.IS
2012-06-15SPLIT0.833333VAKFN.IS
2011-07-20SPLIT0.500000VAKFN.IS
\n", "
" ], "text/plain": [ " action value symbol\n", "2013-06-26 SPLIT 0.869565 THYAO.IS\n", "2011-07-11 SPLIT 0.833333 THYAO.IS\n", "2013-07-03 SPLIT 0.980392 TRKCM.IS\n", "2012-07-16 SPLIT 0.869565 TRKCM.IS\n", "2010-11-25 SPLIT 0.500000 DOAS.IS\n", "2013-07-04 SPLIT 0.961538 SISE.IS\n", "2012-07-10 SPLIT 0.909091 SISE.IS\n", "2011-06-20 SPLIT 0.884956 SISE.IS\n", "2013-04-12 SPLIT 0.884956 EREGL.IS\n", "2012-04-30 SPLIT 0.699301 EREGL.IS\n", "2011-03-15 SPLIT 0.746269 EREGL.IS\n", "2010-07-02 SPLIT 0.250000 PETKM.IS\n", "2010-01-18 SPLIT 0.040000 AFYON.IS\n", "2010-06-16 SPLIT 0.500000 KOZAL.IS\n", "2016-06-01 SPLIT 0.045455 GOODY.IS\n", "2013-07-29 SPLIT 0.925926 VAKFN.IS\n", "2012-06-15 SPLIT 0.833333 VAKFN.IS\n", "2011-07-20 SPLIT 0.500000 VAKFN.IS" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Splits = dividends_and_splits[dividends_and_splits[\"action\"] == 'SPLIT']\n", "Dividends = dividends_and_splits[dividends_and_splits[\"action\"] == 'DIVIDEND']\n", "Splits" ] }, { "cell_type": "code", "execution_count": 9, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionvaluesymbol
2016-05-30DIVIDEND0.245AEFES.IS
2015-05-29DIVIDEND0.460AEFES.IS
2013-05-30DIVIDEND0.450AEFES.IS
2012-05-29DIVIDEND0.450AEFES.IS
2011-05-27DIVIDEND0.480AEFES.IS
\n", "
" ], "text/plain": [ " action value symbol\n", "2016-05-30 DIVIDEND 0.245 AEFES.IS\n", "2015-05-29 DIVIDEND 0.460 AEFES.IS\n", "2013-05-30 DIVIDEND 0.450 AEFES.IS\n", "2012-05-29 DIVIDEND 0.450 AEFES.IS\n", "2011-05-27 DIVIDEND 0.480 AEFES.IS" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "Dividends.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## OrderAndTransaction\n", "[TOC](#TableOfContents)\n", "\n", "We give an *order* buy/sell a symbol of some amount of *shares* to a *brocker* which accepts this order and transmit to the market. The response of an order is a *transaction* and it contains the status of the orders, the price and the commissions." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "collapsed": true }, "outputs": [], "source": [ "order = {'symbol':'AKBNK.IS', \n", " 'shares':100, \n", " 'action':'buy', \n", " 'time':'2016-05-12'}\n", "\n", "transaction = {'status':'accepted', \n", " 'symbol': 'GARAN', \n", " 'action':'buy', \n", " 'shares':100, \n", " 'price':5.2, \n", " 'commision':2, \n", " 'time':'2016-05-13'}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In real situation, when we pass the order to a brocker, the brocker responds with a transaction. We will simulate this situation with the following function." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# TODO: check user account's free cash and update it accordingly\n", "def execute_order(order, holdings):\n", " 'Simulates the broker/market and creates a transaction.'\n", " transaction = deepcopy(order)\n", " symbol, shares, time = order['symbol'], order['shares'], order['time']\n", " \n", " if order['action']=='sell':\n", " if (holdings is None or \n", " not (symbol in holdings.index) or \n", " holdings.loc[symbol]['shares'] < order['shares']):\n", " \n", " warnings.warn('Your order ' + str(order) + ' is rejected.')\n", " transaction['status'] = 'rejected'\n", " return transaction\n", " \n", " transaction['status'] = 'accepted'\n", " price = get_price(symbol, time)\n", " commision = commision_calculation(order, price)\n", " transaction['price'], transaction['commision'] = price, commision\n", " return transaction\n", "\n", "def get_price(symbol, time = None, price_source=prices):\n", " 'Returns the last price of the symbol. We assume that prices is a pandas object.'\n", " if time is None:\n", " time = str(datetime.datetime.now())\n", " \n", " try: \n", " closest_time = (price_source.index[time >= price_source.index]).sort_values()[-1]\n", " return price_source[symbol].loc[closest_time]\n", " except ValueError:\n", " raise ValueError(\"We don't have historical data for an order at \" + order_time)\n", " except IndexError:\n", " raise IndexError(\"We don't have historical data for an order at \" + order_time)\n", "\n", "def commision_calculation(order, price, commission_ratio=0.0001):\n", " 'Calculates commision to be paid.'\n", " return order['shares']*price*commission_ratio\n", "\n", "def current_time(prices=prices):\n", " 'Returns the maximum date from the prices table.'\n", " return max(prices.index).strftime(\"%Y-%m-%d\")" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "{'action': 'buy',\n", " 'commision': 0.076999999999999999,\n", " 'price': 7.7000000000000002,\n", " 'shares': 100,\n", " 'status': 'accepted',\n", " 'symbol': 'AKBNK.IS',\n", " 'time': '2016-05-12'}" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "execute_order(order, [])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "TODO: make a real example\n", "\n", "## Positions and Trades\n", "\n", "Every time we have an accepted buy order we create a *position*. A trade is a *matching* of buy/sell transactions of the same symbol. We need these trade objects in order to calculate the *current* cost of the portfolio and realized profits. \n", "\n", "Example\n", "---\n", "Transactions\n", "+ $t_1$: (GARAN, buy, 100, 7.02)\n", "+ $t_2$: (GARAN, buy, 200, 7.05)\n", "+ $t_3$: (GARAN, sell, 150, 7.10)\n", "\n", "Cost\n", "+ $t_1$: 702\n", "+ $t_2$: 702 + 1410\n", "+ $t_3$: 702 + 1410 - $x $\n", "\n", "In order to calculate $x $, we need to match the sell order at *t3* with the buy orders *t1* and *t2*. For the matching we assume first-in first-out rule. We first match the sell order at *t3* with the buy order at *t1* and then the remaining with the order at *t2*." ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def apply_transaction(transaction, positions, trades):\n", " 'Update positions and trades with the transaction.'\n", " if transaction[\"status\"] == \"accepted\":\n", " symbol, action, shares = transaction[\"symbol\"], transaction[\"action\"], transaction[\"shares\"]\n", " price, time = transaction[\"price\"], transaction['time']\n", " if action == \"buy\":\n", " position = {'type':'long', \n", " 'symbol':symbol, \n", " 'initial_shares':shares, \n", " 'shares':shares, \n", " 'price': price, \n", " 'cost': price*shares, \n", " 'time': time}\n", " positions.append(position)\n", " else:\n", " match_sell_transaction_to_position(transaction, positions, trades)\n", "\n", "def match_sell_transaction_to_position(transaction, positions, trades):\n", " \"\"\"We will select the positions with the same symbol and order them according to time desc.\n", " Until we finish the order's volume we match it with a position. If a position is fulfilled,\n", " we continue with the next one in the order. We create a trade, we remove the amount traded \n", " from the position. If the position's volume is empty we remove the position from the list.\n", " \n", " Assumption: Since the broker rejects sells orders greater then our holdings, \n", " we assume that transaction.shares <= sum(positions.shares).\"\"\"\n", " \n", " sorted(positions, key=lambda k: k['time']) \n", " shares, time, symbol = transaction[\"shares\"], transaction[\"time\"], transaction[\"symbol\"]\n", " \n", " for position in positions:\n", " if not shares > 0:\n", " break\n", " if position[\"symbol\"] == transaction[\"symbol\"] and position[\"shares\"] > 0:\n", " traded_shares = min(shares, position['shares'])\n", " buy_price, sell_price = position[\"price\"], transaction[\"price\"]\n", " profit = (sell_price - buy_price) * traded_shares\n", " trade = {'symbol':symbol, \n", " 'shares':traded_shares, \n", " 'time':time, \n", " 'buy_price': buy_price, \n", " 'sell_price': sell_price, \n", " 'profit': profit}\n", " trades.append(trade)\n", " shares -= traded_shares\n", " position[\"shares\"] = position[\"shares\"] - traded_shares\n", " position[\"cost\"] = position[\"shares\"] * buy_price" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def calculate_portfolio(positions):\n", " if len(positions) == 0:\n", " return []\n", " else:\n", " temp = pd.DataFrame(positions)\n", " return temp.pivot_table(index='symbol', aggfunc='sum', values=[\"cost\", 'shares'])" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionsharessymboltime
0buy100GARAN.IS2016-05-15 10:00:00
1buy100GARAN.IS2016-05-20 11:00:00
2sel120GARAN.IS2016-05-22 09:50:00
3buy100AKBNK.IS2016-05-20 16:30:00
4buy100AKBNK.IS2016-05-21 10:57:23
5buy220AKBNK.IS2016-05-24 10:00:00
6sell200AKBNK.IS2016-05-24 12:00:00
7sell110AKBNK.IS2016-05-27 00:00:00
8sell50ZOREN.IS2016-05-28 00:00:00
\n", "
" ], "text/plain": [ " action shares symbol time\n", "0 buy 100 GARAN.IS 2016-05-15 10:00:00\n", "1 buy 100 GARAN.IS 2016-05-20 11:00:00\n", "2 sel 120 GARAN.IS 2016-05-22 09:50:00\n", "3 buy 100 AKBNK.IS 2016-05-20 16:30:00\n", "4 buy 100 AKBNK.IS 2016-05-21 10:57:23\n", "5 buy 220 AKBNK.IS 2016-05-24 10:00:00\n", "6 sell 200 AKBNK.IS 2016-05-24 12:00:00\n", "7 sell 110 AKBNK.IS 2016-05-27 00:00:00\n", "8 sell 50 ZOREN.IS 2016-05-28 00:00:00" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "orders = [\n", " {'symbol':'GARAN.IS', 'shares':100, 'action':'buy', 'time':'2016-05-15 10:00:00'},\n", " {'symbol':'GARAN.IS', 'shares':100, 'action':'buy', 'time':'2016-05-20 11:00:00'},\n", " {'symbol':'GARAN.IS', 'shares':120, 'action':'sel', 'time':'2016-05-22 09:50:00'},\n", " {'symbol':'AKBNK.IS', 'shares':100, 'action':'buy', 'time':'2016-05-20 16:30:00'}, \n", " {'symbol':'AKBNK.IS', 'shares':100, 'action':'buy', 'time':'2016-05-21 10:57:23'},\n", " {'symbol':'AKBNK.IS', 'shares':220, 'action':'buy', 'time':'2016-05-24 10:00:00'},\n", " {'symbol':'AKBNK.IS', 'shares':200, 'action':'sell', 'time':'2016-05-24 12:00:00'},\n", " {'symbol':'AKBNK.IS', 'shares':110, 'action':'sell', 'time':'2016-05-27 00:00:00'},\n", " {'symbol':'ZOREN.IS', 'shares':50, 'action':'sell', 'time':'2016-05-28 00:00:00'},\n", "]\n", "\n", "pd.DataFrame(orders)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Account" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def execute_orders(orders, transactions, positions, trades):\n", " \"\"\"Calls execute_order function for each order in the order list.\n", " Updates transaction, position and trade lists.\n", " \"\"\"\n", " \n", " portfolio = calculate_portfolio(positions)\n", " for order in orders:\n", " transaction = execute_order(order, portfolio)\n", " transactions.append(transaction)\n", " apply_transaction(transaction, positions, trades)\n", " portfolio = calculate_portfolio(positions)" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "collapsed": false }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/can/.local/lib/python2.7/site-packages/ipykernel/__main__.py:12: UserWarning: Your order {'action': 'sell', 'symbol': 'ZOREN.IS', 'shares': 50, 'time': '2016-05-28 00:00:00'} is rejected.\n" ] } ], "source": [ "transactions, positions, trades = [], [], []\n", "execute_orders(orders, transactions, positions, trades);" ] }, { "cell_type": "code", "execution_count": 18, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actioncommisionpricesharesstatussymboltime
0buy0.075107.51100acceptedGARAN.IS2016-05-15 10:00:00
1buy0.072507.25100acceptedGARAN.IS2016-05-20 11:00:00
2sel0.087007.25120acceptedGARAN.IS2016-05-22 09:50:00
3buy0.075007.50100acceptedAKBNK.IS2016-05-20 16:30:00
4buy0.075007.50100acceptedAKBNK.IS2016-05-21 10:57:23
5buy0.177108.05220acceptedAKBNK.IS2016-05-24 10:00:00
6sell0.161008.05200acceptedAKBNK.IS2016-05-24 12:00:00
7sell0.087457.95110acceptedAKBNK.IS2016-05-27 00:00:00
8sellNaNNaN50rejectedZOREN.IS2016-05-28 00:00:00
\n", "
" ], "text/plain": [ " action commision price shares status symbol time\n", "0 buy 0.07510 7.51 100 accepted GARAN.IS 2016-05-15 10:00:00\n", "1 buy 0.07250 7.25 100 accepted GARAN.IS 2016-05-20 11:00:00\n", "2 sel 0.08700 7.25 120 accepted GARAN.IS 2016-05-22 09:50:00\n", "3 buy 0.07500 7.50 100 accepted AKBNK.IS 2016-05-20 16:30:00\n", "4 buy 0.07500 7.50 100 accepted AKBNK.IS 2016-05-21 10:57:23\n", "5 buy 0.17710 8.05 220 accepted AKBNK.IS 2016-05-24 10:00:00\n", "6 sell 0.16100 8.05 200 accepted AKBNK.IS 2016-05-24 12:00:00\n", "7 sell 0.08745 7.95 110 accepted AKBNK.IS 2016-05-27 00:00:00\n", "8 sell NaN NaN 50 rejected ZOREN.IS 2016-05-28 00:00:00" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.DataFrame(transactions)" ] }, { "cell_type": "code", "execution_count": 19, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ***Transactions*** \n", "----------------------------------------------------------------------\n", " action commision price shares status symbol time\n", "0 buy 0.07510 7.51 100 accepted GARAN.IS 2016-05-15 10:00:00\n", "1 buy 0.07250 7.25 100 accepted GARAN.IS 2016-05-20 11:00:00\n", "2 sel 0.08700 7.25 120 accepted GARAN.IS 2016-05-22 09:50:00\n", "3 buy 0.07500 7.50 100 accepted AKBNK.IS 2016-05-20 16:30:00\n", "4 buy 0.07500 7.50 100 accepted AKBNK.IS 2016-05-21 10:57:23\n", "5 buy 0.17710 8.05 220 accepted AKBNK.IS 2016-05-24 10:00:00\n", "6 sell 0.16100 8.05 200 accepted AKBNK.IS 2016-05-24 12:00:00\n", "7 sell 0.08745 7.95 110 accepted AKBNK.IS 2016-05-27 00:00:00\n", "8 sell NaN NaN 50 rejected ZOREN.IS 2016-05-28 00:00:00\n", "\n", " ***Positions*** \n", "----------------------------------------------------------------------\n", " cost initial_shares price shares symbol time type\n", "0 0.0 100 7.51 0 GARAN.IS 2016-05-15 10:00:00 long\n", "1 580.0 100 7.25 80 GARAN.IS 2016-05-20 11:00:00 long\n", "2 0.0 100 7.50 0 AKBNK.IS 2016-05-20 16:30:00 long\n", "3 0.0 100 7.50 0 AKBNK.IS 2016-05-21 10:57:23 long\n", "4 885.5 220 8.05 110 AKBNK.IS 2016-05-24 10:00:00 long\n", "\n", " ***Trades*** \n", "----------------------------------------------------------------------\n", " buy_price profit sell_price shares symbol time\n", "0 7.51 -26.0 7.25 100 GARAN.IS 2016-05-22 09:50:00\n", "1 7.25 0.0 7.25 20 GARAN.IS 2016-05-22 09:50:00\n", "2 7.50 55.0 8.05 100 AKBNK.IS 2016-05-24 12:00:00\n", "3 7.50 55.0 8.05 100 AKBNK.IS 2016-05-24 12:00:00\n", "4 8.05 -11.0 7.95 110 AKBNK.IS 2016-05-27 00:00:00\n" ] } ], "source": [ "def summary(transactions, positions, trades):\n", " print \"***Transactions***\".center(70)\n", " print '-' * 70\n", " print pd.DataFrame(transactions)\n", " print ''\n", "\n", " print \"***Positions***\".center(70)\n", " print '-' * 70\n", " print pd.DataFrame(positions)\n", " print ''\n", "\n", " print \"***Trades***\".center(70)\n", " print '-' * 70\n", " print pd.DataFrame(trades)\n", "\n", "summary(transactions, positions, trades)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Portfolio\n", "[TOC](#TableOfContents)\n", "\n", "An *asset* is financial instruments that we own. The assets can be calculated using transaction reports. *Market value* is the current value of an asset. It represent the value as if we want to sell the asset right now. It is calculated by some estimation of the current price of the corresponding symbol. The collection of assets that we own are called our *portfolio*. \n", "\n", "##### Portfolio Market Value" ] }, { "cell_type": "code", "execution_count": 20, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costshares
symbol
AKBNK.IS885.5110
GARAN.IS580.080
\n", "
" ], "text/plain": [ " cost shares\n", "symbol \n", "AKBNK.IS 885.5 110\n", "GARAN.IS 580.0 80" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio = calculate_portfolio(positions)\n", "portfolio" ] }, { "cell_type": "code", "execution_count": 21, "metadata": { "collapsed": false }, "outputs": [], "source": [ "x = pd.Series({\"GARAN.IS\": get_price(\"GARAN.IS\"), \"AKBNK.IS\": get_price(\"AKBNK.IS\")})" ] }, { "cell_type": "code", "execution_count": 22, "metadata": { "collapsed": true }, "outputs": [], "source": [ "portfolio[\"current_price\"] = x" ] }, { "cell_type": "code", "execution_count": 23, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "symbol\n", "AKBNK.IS 884.4\n", "GARAN.IS 636.0\n", "dtype: float64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio[\"shares\"] * portfolio[\"current_price\"]" ] }, { "cell_type": "code", "execution_count": 24, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "AKBNK.IS 8.04\n", "GARAN.IS 7.95\n", "dtype: float64" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "def get_prices(assets, time = None):\n", " return {symbol: get_price(symbol, time) for symbol in assets}\n", "\n", "pd.Series(get_prices(portfolio.index))" ] }, { "cell_type": "code", "execution_count": 25, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "symbol\n", "AKBNK.IS 55.0\n", "GARAN.IS 40.0\n", "Name: shares, dtype: float64" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio[\"shares\"] / 2" ] }, { "cell_type": "code", "execution_count": 26, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def current_performance(portfolio, time=None):\n", " portfolio[\"current_price\"] = pd.Series(get_prices(portfolio.index, time))\n", " portfolio[\"market_value\"] = portfolio[\"shares\"] * portfolio[\"current_price\"]\n", " portfolio[\"profit\"] = portfolio[\"market_value\"] - portfolio[\"cost\"]\n", " \n", " total_market_value = portfolio.market_value.sum()\n", " portfolio[\"weight\"] = portfolio[\"market_value\"] / total_market_value" ] }, { "cell_type": "code", "execution_count": 27, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AKBNK.IS885.51108.04884.4-1.10.581689
GARAN.IS580.0807.95636.056.00.418311
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit weight\n", "symbol \n", "AKBNK.IS 885.5 110 8.04 884.4 -1.1 0.581689\n", "GARAN.IS 580.0 80 7.95 636.0 56.0 0.418311" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "current_performance(portfolio)\n", "portfolio" ] }, { "cell_type": "code", "execution_count": 28, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def historical_performance(transactions, prices):\n", " \"Returns historical market value of a portfolio.\"\n", " starting_date = min(transactions, key=lambda x: x[\"time\"])[\"time\"]\n", " ending_date = datetime.datetime.now()\n", " symbols = set([t[\"symbol\"] for t in transactions if t[\"status\"]==\"accepted\"] )\n", " \n", " symbol_price = (prices.loc[starting_date:ending_date][list(symbols)])\n", " \n", " holdings_list = holdings(transactions)\n", " \n", " return (holdings_list\n", " .fillna(method='ffill')\n", " .reindex(symbol_price.index.union(holdings_list.index))\n", " .fillna(method='ffill')\n", " .reindex(symbol_price.index)\n", " .mul(symbol_price).sum(axis=1)\n", " )\n", "\n", "def holdings(transactions):\n", " t = pd.DataFrame(transactions)\n", " t[\"sign\"] = t[\"action\"].apply(lambda x: 1 if x==\"buy\" else -1)\n", " t[\"signed_shares\"] = t[\"sign\"] * t[\"shares\"]\n", " t[\"time\"] = pd.to_datetime(t[\"time\"])\n", " \n", " return (t.query(\"status == 'accepted'\")\n", " .pivot_table(values=\"signed_shares\", columns=\"symbol\", index=\"time\")\n", " .cumsum()\n", " )" ] }, { "cell_type": "code", "execution_count": 29, "metadata": { "collapsed": false }, "outputs": [], "source": [ "symbols = set([t[\"symbol\"] for t in transactions if t[\"status\"]==\"accepted\"] )\n", "starting_date = min(transactions, key=lambda x: x[\"time\"])[\"time\"]\n", "ending_date = datetime.datetime.now()\n", "symbol_price = (prices.loc[starting_date:ending_date][list(symbols)])" ] }, { "cell_type": "code", "execution_count": 30, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def compare_with_benchmark(historical_value, benchmark_symbol=\"XU100.IS\"):\n", " algo = (historical_value[historical_value > 0].pct_change() + 1).cumprod()\n", " algo.name = \"Algorithm\"\n", " algo.plot(legend=True)\n", " print \"Algorithm performance:\", (algo.ix[-1] - 1)*100\n", " \n", " start_date = historical_value.index[0]\n", "\n", " benchmark = (prices[benchmark_symbol].dropna().pct_change().loc[start_date:] + 1).cumprod()\n", " benchmark.name = \"Benchmark\"\n", " benchmark.plot(legend = True, figsize=[15,10])\n", " print \"Benchmark performance:\", (benchmark.ix[-1] - 1)*100" ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ntl5tl12svX91dfDHmDfP9nN7/PGGb7R94onS88/n5v1o8WLbSy6XCG8BRC28UXkDUJ+RI6PTqCRR\nq1a23xxNSwCguKxaZZ9dd9pJevppacwYafhwab/9bOPsunzzjVXazj9f2nlnWwpQViZ169bw8XTs\nKHXoIE2Z0vDHSvS//0lHHy1dcok0bFh2HztRmj1aihPhDUAh+PJLe1OcOTPskdQtvu5t993DHgkA\nhGvqVOvCu912YY8k91aulJo3r/n7gQfa9//UU9JZZ9katLIyq1q9+qqtR/vkE2vrf9hh0p/+JHXp\nIjXJYskpPnXykEOy83grV9pm4AcdJF12mX2P7dtbd8tso/IWAOENQNS9/rqdxbzySjujGEWsewNQ\n7KZPt/03/+//pNJSO+nW2MUrb4mck/r2lT74wELascdKt91mszSGD7fK2/jx0qWXSnvumd3gJtWE\nN+8b/ljr1kmnnSZttZXtP9exozRunG0I/uabDX/82ghvAUQtvDVtav9R1q0LeyQAwua9dOed0skn\nSw88YOEtqghvAIrV++9LvXrZ2q8+faSFC62x1FFHScuWhT263KpdeUu00UbS5ZdbiC0vl/7yF6lH\nj9x/7u7cWWrWTHrnnYY9jvfSwIHSt9/aOr74koV99rG1b336SB991PDxJmLaZABRC2/O1VTfNtkk\n7NGgWA0bZouOjzoq7JEUrx9/tPVt8+fbQvBM9rzJp332qWlaku7GqgAQpuXLpc8+q/lq2tSmgO++\nu7T55vXfb948mxL42mvSVVfZVi7xKtRVV0lffy0dd5w0caK08cZ5+Vbyrq7KW9icq6m+de2a+ePc\ndJOtnXvttV8G1KOPlm680f6cOtW2KcgG3j4DiFp4kwhvCNf999sLVosWNuUhar8f2bRsmTRiRPYX\nNtdlo42kI4+0efPbbJP8th9+aGf09t/fxha1N8a6tGxpTUs++MDWLwBA1HgvjRolvfeehbTPP7c/\nvbf1adttJ227rbR6tfTII9KcOTbVLx7k4l+bbGLTAF980dZAjRolbbrp+s/lnHTHHdKZZ9o0yuef\nb5zvp8kqb2Hq00fq398CViZGjZIefNDeg1u1qvs255xj/4eOO06aPDk7n9sJbwGsWWOl1Shh3RvC\nMn68dO210n//a12gHnzQ5nU3NpWVNh3xoYfsRfe883LfwXH5cnujv/JKaa+97M28Tx9b1J5o7Fgb\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "historical_performance(transactions, prices).plot(figsize= [15,10])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## DividendAndSplit\n", "[TOC](#TableOfContents)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": { "collapsed": true }, "outputs": [], "source": [ "def paid_dividends(transactions, dividends):\n", " \n", " start_date = min(transactions, key=lambda x: x[\"time\"])[\"time\"]\n", " end_date = datetime.datetime.now()\n", " \n", " H= holdings(transactions)\n", " H.index = pd.to_datetime(H.index)\n", " \n", " H = (H.reindex(pd.date_range(start=start_date, end=end_date, freq='D'))\n", " .fillna(method='ffill')\n", " .fillna(0))\n", " \n", " return (pd.melt(Dividends[Dividends.symbol.apply(lambda x: x in H.columns)]\n", " .reset_index()\n", " .rename(columns={'index':'time'})\n", " .pivot_table(values=\"value\", columns=\"symbol\", index = 'time')\n", " .reindex(H.index)\n", " .mul(H)\n", " .reset_index()\n", " .rename(columns={'index':'time'})\n", " , id_vars = 'time', var_name= 'symbol', value_name='paid_dividend'\n", " )\n", " ).query(\"paid_dividend > 0\")" ] }, { "cell_type": "code", "execution_count": 33, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timesymbolpaid_dividend
\n", "
" ], "text/plain": [ "Empty DataFrame\n", "Columns: [time, symbol, paid_dividend]\n", "Index: []" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paid_dividends(transactions, Dividends)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Rebalance\n", "[TOC](#TableOfContents)" ] }, { "cell_type": "code", "execution_count": 34, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def rebalance(portfolio, target_weights, target_value = None, time = None):\n", " \"\"\"New weights is a dictionary of {symbol: weights}.\n", " Creates orders to make portfolio's weight 'new weights'.\n", " Time indicates execution of rebalance operation.\n", " \"\"\"\n", " if time is None:\n", " time = current_time()\n", " \n", " if target_value is None: \n", " target_value = portfolio.market_value.sum()\n", " \n", " if len(portfolio)>0:\n", " target_weights = {s:target_weights[s] if s in target_weights.keys() else 0 \n", " for s in set(portfolio.index | target_weights.keys())}\n", " \n", " # check if the weights sum up to 1.\n", " assert(sum(target_weights.values()) == 1)\n", " \n", " rebalance_orders = []\n", " \n", " target_market_value = {s:target_weights[s]*target_value for s in target_weights.keys()}\n", " \n", " for symbol, weight in target_weights.iteritems():\n", " \n", " if len(portfolio)>0 and symbol in portfolio.index:\n", " delta_value = target_market_value[symbol] - portfolio[\"market_value\"].loc[symbol]\n", " \n", " if weight:\n", " delta_lot = int(abs(delta_value / get_price(symbol, time)))\n", " else:\n", " delta_lot = portfolio[\"shares\"].loc[symbol]\n", " \n", " if delta_lot:\n", " if delta_value > 0:\n", " action = 'buy'\n", " else:\n", " action = 'sell'\n", " \n", " order = {'symbol': symbol, 'shares': delta_lot, 'action': action, 'time': time}\n", " rebalance_orders.append(order)\n", " else:\n", " delta_lot = int(target_market_value[symbol] / get_price(symbol, time))\n", " order = {'symbol': symbol, 'shares': delta_lot, 'action': 'buy', 'time': time}\n", " rebalance_orders.append(order) \n", " \n", " return rebalance_orders" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AKBNK.IS885.51108.04884.4-1.10.581689
GARAN.IS580.0807.95636.056.00.418311
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit weight\n", "symbol \n", "AKBNK.IS 885.5 110 8.04 884.4 -1.1 0.581689\n", "GARAN.IS 580.0 80 7.95 636.0 56.0 0.418311" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio" ] }, { "cell_type": "code", "execution_count": 36, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "884.39999999999986" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio[\"market_value\"].loc['AKBNK.IS']" ] }, { "cell_type": "code", "execution_count": 37, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionsharessymboltime
0sell41GARAN.IS2016-09-30
1buy286ZOREN.IS2016-09-30
2sell15AKBNK.IS2016-09-30
\n", "
" ], "text/plain": [ " action shares symbol time\n", "0 sell 41 GARAN.IS 2016-09-30\n", "1 buy 286 ZOREN.IS 2016-09-30\n", "2 sell 15 AKBNK.IS 2016-09-30" ] }, "execution_count": 37, "metadata": {}, "output_type": "execute_result" } ], "source": [ "orders_to_rebalance = rebalance(portfolio, {\"AKBNK.IS\":0.50, \"GARAN.IS\": 0.20, \"ZOREN.IS\": 0.30 })\n", "pd.DataFrame(orders_to_rebalance)" ] }, { "cell_type": "code", "execution_count": 38, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ***Transactions*** \n", "----------------------------------------------------------------------\n", " action commision price shares status symbol time\n", "0 buy 0.075100 7.51 100 accepted GARAN.IS 2016-05-15 10:00:00\n", "1 buy 0.072500 7.25 100 accepted GARAN.IS 2016-05-20 11:00:00\n", "2 sel 0.087000 7.25 120 accepted GARAN.IS 2016-05-22 09:50:00\n", "3 buy 0.075000 7.50 100 accepted AKBNK.IS 2016-05-20 16:30:00\n", "4 buy 0.075000 7.50 100 accepted AKBNK.IS 2016-05-21 10:57:23\n", "5 buy 0.177100 8.05 220 accepted AKBNK.IS 2016-05-24 10:00:00\n", "6 sell 0.161000 8.05 200 accepted AKBNK.IS 2016-05-24 12:00:00\n", "7 sell 0.087450 7.95 110 accepted AKBNK.IS 2016-05-27 00:00:00\n", "8 sell NaN NaN 50 rejected ZOREN.IS 2016-05-28 00:00:00\n", "9 sell 0.032595 7.95 41 accepted GARAN.IS 2016-09-30\n", "10 buy 0.045474 1.59 286 accepted ZOREN.IS 2016-09-30\n", "11 sell 0.012060 8.04 15 accepted AKBNK.IS 2016-09-30\n", "\n", " ***Positions*** \n", "----------------------------------------------------------------------\n", " cost initial_shares price shares symbol time type\n", "0 0.00 100 7.51 0 GARAN.IS 2016-05-15 10:00:00 long\n", "1 282.75 100 7.25 39 GARAN.IS 2016-05-20 11:00:00 long\n", "2 0.00 100 7.50 0 AKBNK.IS 2016-05-20 16:30:00 long\n", "3 0.00 100 7.50 0 AKBNK.IS 2016-05-21 10:57:23 long\n", "4 764.75 220 8.05 95 AKBNK.IS 2016-05-24 10:00:00 long\n", "5 454.74 286 1.59 286 ZOREN.IS 2016-09-30 long\n", "\n", " ***Trades*** \n", "----------------------------------------------------------------------\n", " buy_price profit sell_price shares symbol time\n", "0 7.51 -26.00 7.25 100 GARAN.IS 2016-05-22 09:50:00\n", "1 7.25 0.00 7.25 20 GARAN.IS 2016-05-22 09:50:00\n", "2 7.50 55.00 8.05 100 AKBNK.IS 2016-05-24 12:00:00\n", "3 7.50 55.00 8.05 100 AKBNK.IS 2016-05-24 12:00:00\n", "4 8.05 -11.00 7.95 110 AKBNK.IS 2016-05-27 00:00:00\n", "5 7.25 28.70 7.95 41 GARAN.IS 2016-09-30\n", "6 8.05 -0.15 8.04 15 AKBNK.IS 2016-09-30\n" ] } ], "source": [ "execute_orders(orders_to_rebalance, transactions, positions, trades)\n", "summary(transactions, positions, trades)" ] }, { "cell_type": "code", "execution_count": 39, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costshares
symbol
AKBNK.IS764.7595
GARAN.IS282.7539
ZOREN.IS454.74286
\n", "
" ], "text/plain": [ " cost shares\n", "symbol \n", "AKBNK.IS 764.75 95\n", "GARAN.IS 282.75 39\n", "ZOREN.IS 454.74 286" ] }, "execution_count": 39, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio = calculate_portfolio(positions)\n", "portfolio" ] }, { "cell_type": "code", "execution_count": 40, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AKBNK.IS764.75958.04763.80-0.950.499676
GARAN.IS282.75397.95310.0527.300.202834
ZOREN.IS454.742861.59454.740.000.297490
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit weight\n", "symbol \n", "AKBNK.IS 764.75 95 8.04 763.80 -0.95 0.499676\n", "GARAN.IS 282.75 39 7.95 310.05 27.30 0.202834\n", "ZOREN.IS 454.74 286 1.59 454.74 0.00 0.297490" ] }, "execution_count": 40, "metadata": {}, "output_type": "execute_result" } ], "source": [ "current_performance(portfolio)\n", "portfolio" ] }, { "cell_type": "code", "execution_count": 41, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionsharessymboltime
0buy62893GARAN.IS2016-09-30
1buy62189AKBNK.IS2016-09-30
\n", "
" ], "text/plain": [ " action shares symbol time\n", "0 buy 62893 GARAN.IS 2016-09-30\n", "1 buy 62189 AKBNK.IS 2016-09-30" ] }, "execution_count": 41, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio, transactions, positions, trades = [], [], [], []\n", "\n", "orders_to_rebalance = rebalance([], {'AKBNK.IS': 0.50, 'GARAN.IS': 0.50}, 1000000)\n", "pd.DataFrame(orders_to_rebalance)" ] }, { "cell_type": "code", "execution_count": 42, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ***Transactions*** \n", "----------------------------------------------------------------------\n", " action commision price shares status symbol time\n", "0 buy 49.999935 7.95 62893 accepted GARAN.IS 2016-09-30\n", "1 buy 49.999956 8.04 62189 accepted AKBNK.IS 2016-09-30\n", "\n", " ***Positions*** \n", "----------------------------------------------------------------------\n", " cost initial_shares price shares symbol time type\n", "0 499999.35 62893 7.95 62893 GARAN.IS 2016-09-30 long\n", "1 499999.56 62189 8.04 62189 AKBNK.IS 2016-09-30 long\n", "\n", " ***Trades*** \n", "----------------------------------------------------------------------\n", "Empty DataFrame\n", "Columns: []\n", "Index: []\n" ] } ], "source": [ "execute_orders(orders_to_rebalance, transactions, positions, trades)\n", "summary(transactions, positions, trades)" ] }, { "cell_type": "code", "execution_count": 43, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AKBNK.IS499999.56621898.04499999.560.00.5
GARAN.IS499999.35628937.95499999.350.00.5
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit weight\n", "symbol \n", "AKBNK.IS 499999.56 62189 8.04 499999.56 0.0 0.5\n", "GARAN.IS 499999.35 62893 7.95 499999.35 0.0 0.5" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio = calculate_portfolio(positions)\n", "current_performance(portfolio)\n", "portfolio" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Backtest\n", "[TOC](#TableOfContents)\n", "\n", "" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Algoritm Example: Beta\n", "\n", "- Repeat each month the following procedure:\n", " - Calculate beta values of each stocks against BIST 100 index. **time window** *for beta calculation?*\n", " - Choose 10 stocks with the highest beta value.\n", " - Rebalance the portfolio to be equal weight. " ] }, { "cell_type": "code", "execution_count": 44, "metadata": { "collapsed": false }, "outputs": [], "source": [ "capital_base = 100000\n", "start, end = np.datetime64('2016-01-20 00:00:00'), np.datetime64('2016-07-18 00:00:00')\n", "running_points = [date for date in prices.index if start <= date <= end]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "http://markets.ft.com/data/lexicon/term/beta\n", "\n", "We use Beta 5Y from the Multex Ratios and Statistics table, which is provided to us by Reuters. The Market Guide Beta is the slope of the 60 month regression line of the percentage price change of the stock relative to the percentage price change of the S&P 500. Beta values are not calculated if less than 24 months of pricing is available." ] }, { "cell_type": "code", "execution_count": 45, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def beta(price_data, start, end):\n", " returns = (prices.loc[start:end]\n", " .resample('3BMS', 'first')\n", " .pct_change()\n", " .dropna())\n", " \n", " beta_values = {symbol: linregress(returns[\"XU100.IS\"], returns[symbol])[0] \n", " for symbol in price_data.columns if symbol != 'XU100.IS'}\n", " return beta_values" ] }, { "cell_type": "code", "execution_count": 46, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2016-01-29 00:00:00\n", "--------------------\n", "AFYON.IS 56.9642159504\n", "GOODY.IS 6.87604665207\n", "DOAS.IS 5.19504241764\n", "AEFES.IS 3.51989365886\n", "KOZAL.IS 3.3448762139\n", "AKSA.IS 3.12012336438\n", "EREGL.IS 2.84900427814\n", "SISE.IS 2.51218079997\n", "TCELL.IS 2.10369051414\n", "FROTO.IS 2.09457851314\n", "PETKM.IS 1.81512146095\n", "TRKCM.IS 1.48578088376\n", "THYAO.IS 1.18962314346\n", "MGROS.IS 1.15606357034\n", "TKFEN.IS 1.00811513171\n", "GARAN.IS 1.00615148771\n", "AKBNK.IS 0.886587616544\n", "YKBNK.IS 0.867160616649\n", "HALKB.IS 0.855486536853\n", "ALARK.IS 0.820330070269\n", "VAKBN.IS 0.750041809138\n", "ZOREN.IS 0.646334486257\n", "VAKFN.IS 0.251506076805\n", "CIMSA.IS -0.00851550187079\n", "AKENR.IS -0.796155439582\n", "ULKER.IS -1.00029164062\n", "KARSN.IS -1.51552933437\n", "TMSN.IS -1.73699367046\n", "BJKAS.IS -3.00339814457\n", "{'DOAS.IS': 0.2, 'AFYON.IS': 0.2, 'AEFES.IS': 0.2, 'KOZAL.IS': 0.2, 'GOODY.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "[]\n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 2059 DOAS.IS 2016-01-29\n", "1 buy 3384 AFYON.IS 2016-01-29\n", "2 buy 1108 AEFES.IS 2016-01-29\n", "3 buy 1594 KOZAL.IS 2016-01-29\n", "4 buy 417101 GOODY.IS 2016-01-29\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit weight\n", "symbol \n", "AEFES.IS 19999.40000 1108 18.05000 19999.40000 0.0 0.200036\n", "AFYON.IS 19999.44000 3384 5.91000 19999.44000 0.0 0.200036\n", "DOAS.IS 19991.44870 2059 9.70930 19991.44870 0.0 0.199956\n", "GOODY.IS 19999.99295 417101 0.04795 19999.99295 0.0 0.200042\n", "KOZAL.IS 19988.76000 1594 12.54000 19988.76000 0.0 0.199930\n", " \n", "2016-02-29 00:00:00\n", "--------------------\n", "AFYON.IS 56.9642159504\n", "GOODY.IS 6.87604665207\n", "DOAS.IS 5.19504241764\n", "AEFES.IS 3.51989365886\n", "KOZAL.IS 3.3448762139\n", "AKSA.IS 3.12012336438\n", "EREGL.IS 2.84900427814\n", "SISE.IS 2.51218079997\n", "TCELL.IS 2.10369051414\n", "FROTO.IS 2.09457851314\n", "PETKM.IS 1.81512146095\n", "TRKCM.IS 1.48578088376\n", "THYAO.IS 1.18962314346\n", "MGROS.IS 1.15606357034\n", "TKFEN.IS 1.00811513171\n", "GARAN.IS 1.00615148771\n", "AKBNK.IS 0.886587616544\n", "YKBNK.IS 0.867160616649\n", "HALKB.IS 0.855486536853\n", "ALARK.IS 0.820330070269\n", "VAKBN.IS 0.750041809138\n", "ZOREN.IS 0.646334486257\n", "VAKFN.IS 0.251506076805\n", "CIMSA.IS -0.00851550187079\n", "AKENR.IS -0.796155439582\n", "ULKER.IS -1.00029164062\n", "KARSN.IS -1.51552933437\n", "TMSN.IS -1.73699367046\n", "BJKAS.IS -3.00339814457\n", "{'DOAS.IS': 0.2, 'AFYON.IS': 0.2, 'AEFES.IS': 0.2, 'KOZAL.IS': 0.2, 'GOODY.IS': 0.2}\n", "Before Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 19999.40000 1108 16.98000 18813.84000 -1185.56000 \n", "AFYON.IS 19999.44000 3384 5.98000 20236.32000 236.88000 \n", "DOAS.IS 19991.44870 2059 10.08480 20764.60320 773.15450 \n", "GOODY.IS 19999.99295 417101 0.04646 19378.51246 -621.48049 \n", "KOZAL.IS 19988.76000 1594 16.24000 25886.56000 5897.80000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.179043 \n", "AFYON.IS 0.192580 \n", "DOAS.IS 0.197608 \n", "GOODY.IS 0.184417 \n", "KOZAL.IS 0.246351 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 24 DOAS.IS 2016-02-29\n", "1 buy 130 AFYON.IS 2016-02-29\n", "2 buy 129 AEFES.IS 2016-02-29\n", "3 sell 299 KOZAL.IS 2016-02-29\n", "4 buy 35244 GOODY.IS 2016-02-29\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 22189.82000 1237 16.98000 21004.2600 -1185.56000 \n", "AFYON.IS 20776.84000 3514 5.98000 21013.7200 236.88000 \n", "DOAS.IS 20233.48390 2083 10.08480 21006.6384 773.15450 \n", "GOODY.IS 21637.42919 452345 0.04646 21015.9487 -621.48049 \n", "KOZAL.IS 16239.30000 1295 16.24000 21030.8000 4791.50000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.199905 \n", "AFYON.IS 0.199995 \n", "DOAS.IS 0.199927 \n", "GOODY.IS 0.200016 \n", "KOZAL.IS 0.200157 \n", " \n", "2016-03-31 00:00:00\n", "--------------------\n", "AFYON.IS 56.9642159504\n", "GOODY.IS 6.87604665207\n", "DOAS.IS 5.19504241764\n", "AEFES.IS 3.51989365886\n", "KOZAL.IS 3.3448762139\n", "AKSA.IS 3.12012336438\n", "EREGL.IS 2.84900427814\n", "SISE.IS 2.51218079997\n", "TCELL.IS 2.10369051414\n", "FROTO.IS 2.09457851314\n", "PETKM.IS 1.81512146095\n", "TRKCM.IS 1.48578088376\n", "THYAO.IS 1.18962314346\n", "MGROS.IS 1.15606357034\n", "TKFEN.IS 1.00811513171\n", "GARAN.IS 1.00615148771\n", "AKBNK.IS 0.886587616544\n", "YKBNK.IS 0.867160616649\n", "HALKB.IS 0.855486536853\n", "ALARK.IS 0.820330070269\n", "VAKBN.IS 0.750041809138\n", "ZOREN.IS 0.646334486257\n", "VAKFN.IS 0.251506076805\n", "CIMSA.IS -0.00851550187079\n", "AKENR.IS -0.796155439582\n", "ULKER.IS -1.00029164062\n", "KARSN.IS -1.51552933437\n", "TMSN.IS -1.73699367046\n", "BJKAS.IS -3.00339814457\n", "{'DOAS.IS': 0.2, 'AFYON.IS': 0.2, 'AEFES.IS': 0.2, 'KOZAL.IS': 0.2, 'GOODY.IS': 0.2}\n", "Before Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 22189.82000 1237 21.16000 26174.92000 3985.10000 \n", "AFYON.IS 20776.84000 3514 6.37000 22384.18000 1607.34000 \n", "DOAS.IS 20233.48390 2083 11.24710 23427.70930 3194.22540 \n", "GOODY.IS 21637.42919 452345 0.08757 39611.85165 17974.42246 \n", "KOZAL.IS 16239.30000 1295 18.07000 23400.65000 7161.35000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.193889 \n", "AFYON.IS 0.165810 \n", "DOAS.IS 0.173539 \n", "GOODY.IS 0.293423 \n", "KOZAL.IS 0.173339 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 317 DOAS.IS 2016-03-31\n", "1 buy 724 AFYON.IS 2016-03-31\n", "2 buy 38 AEFES.IS 2016-03-31\n", "3 buy 199 KOZAL.IS 2016-03-31\n", "4 sell 144021 GOODY.IS 2016-03-31\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 22993.90000 1275 21.16000 26979.00000 3985.10000 \n", "AFYON.IS 25388.72000 4238 6.37000 26996.06000 1607.34000 \n", "DOAS.IS 23798.81460 2400 11.24710 26993.04000 3194.22540 \n", "GOODY.IS 14731.62224 308324 0.08757 26999.93268 12268.31044 \n", "KOZAL.IS 19835.23000 1494 18.07000 26996.58000 7161.35000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.199897 \n", "AFYON.IS 0.200023 \n", "DOAS.IS 0.200001 \n", "GOODY.IS 0.200052 \n", "KOZAL.IS 0.200027 \n", " \n", "2016-04-29 00:00:00\n", "--------------------\n", "BJKAS.IS 5.33745899346\n", "GOODY.IS 3.70296155031\n", "AFYON.IS 2.73888471627\n", "EREGL.IS 2.26335412215\n", "KOZAL.IS 2.17678028137\n", "TKFEN.IS 1.91104031464\n", "YKBNK.IS 1.47010564428\n", "DOAS.IS 1.28165996194\n", "VAKBN.IS 1.27942651058\n", "VAKFN.IS 1.25114330665\n", "PETKM.IS 1.2243493208\n", "FROTO.IS 1.18892366153\n", "TCELL.IS 1.17502050664\n", "AKBNK.IS 1.15415096839\n", "TRKCM.IS 1.15112004053\n", "AEFES.IS 1.0820661819\n", "ALARK.IS 1.04582594283\n", "GARAN.IS 0.924882254881\n", "SISE.IS 0.819848136752\n", "ULKER.IS 0.651242173138\n", "THYAO.IS 0.577994374221\n", "MGROS.IS 0.432742947264\n", "AKENR.IS 0.411572932002\n", "CIMSA.IS 0.409761734264\n", "HALKB.IS 0.29317300613\n", "ZOREN.IS 0.177975826959\n", "AKSA.IS -0.164770083225\n", "KARSN.IS -0.444213608009\n", "TMSN.IS -1.12383635356\n", "{'AFYON.IS': 0.2, 'BJKAS.IS': 0.2, 'EREGL.IS': 0.2, 'GOODY.IS': 0.2, 'KOZAL.IS': 0.2}\n", "Before Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 22993.90000 1275 21.72000 27693.00000 4699.10000 \n", "AFYON.IS 25388.72000 4238 6.15000 26063.70000 674.98000 \n", "DOAS.IS 23798.81460 2400 12.08000 28992.00000 5193.18540 \n", "GOODY.IS 14731.62224 308324 0.08822 27200.34328 12468.72104 \n", "KOZAL.IS 19835.23000 1494 18.30000 27340.20000 7504.97000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.201713 \n", "AFYON.IS 0.189845 \n", "DOAS.IS 0.211175 \n", "GOODY.IS 0.198124 \n", "KOZAL.IS 0.199143 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 5310 BJKAS.IS 2016-04-29\n", "1 buy 6309 EREGL.IS 2016-04-29\n", "2 sell 1275 AEFES.IS 2016-04-29\n", "3 buy 6 KOZAL.IS 2016-04-29\n", "4 sell 2400 DOAS.IS 2016-04-29\n", "5 buy 226 AFYON.IS 2016-04-29\n", "6 buy 2918 GOODY.IS 2016-04-29\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 21.72000 0.00000 0.00000 \n", "AFYON.IS 26778.62000 4464 6.15000 27453.60000 674.98000 \n", "BJKAS.IS 27452.70000 5310 5.17000 27452.70000 0.00000 \n", "DOAS.IS 0.00000 0 12.08000 0.00000 0.00000 \n", "EREGL.IS 27454.18131 6309 4.35159 27454.18131 0.00000 \n", "GOODY.IS 14989.04820 311242 0.08822 27457.76924 12468.72104 \n", "KOZAL.IS 19945.03000 1500 18.30000 27450.00000 7504.97000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.200000 \n", "BJKAS.IS 0.199993 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.200004 \n", "GOODY.IS 0.200030 \n", "KOZAL.IS 0.199973 \n", " \n", "2016-05-31 00:00:00\n", "--------------------\n", "BJKAS.IS 5.33745899346\n", "GOODY.IS 3.70296155031\n", "AFYON.IS 2.73888471627\n", "EREGL.IS 2.26335412215\n", "KOZAL.IS 2.17678028137\n", "TKFEN.IS 1.91104031464\n", "YKBNK.IS 1.47010564428\n", "DOAS.IS 1.28165996194\n", "VAKBN.IS 1.27942651058\n", "VAKFN.IS 1.25114330665\n", "PETKM.IS 1.2243493208\n", "FROTO.IS 1.18892366153\n", "TCELL.IS 1.17502050664\n", "AKBNK.IS 1.15415096839\n", "TRKCM.IS 1.15112004053\n", "AEFES.IS 1.0820661819\n", "ALARK.IS 1.04582594283\n", "GARAN.IS 0.924882254881\n", "SISE.IS 0.819848136752\n", "ULKER.IS 0.651242173138\n", "THYAO.IS 0.577994374221\n", "MGROS.IS 0.432742947264\n", "AKENR.IS 0.411572932002\n", "CIMSA.IS 0.409761734264\n", "HALKB.IS 0.29317300613\n", "ZOREN.IS 0.177975826959\n", "AKSA.IS -0.164770083225\n", "KARSN.IS -0.444213608009\n", "TMSN.IS -1.12383635356\n", "{'AFYON.IS': 0.2, 'BJKAS.IS': 0.2, 'EREGL.IS': 0.2, 'GOODY.IS': 0.2, 'KOZAL.IS': 0.2}\n", "Before Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 18.70000 0.000000e+00 0.000000e+00 \n", "AFYON.IS 26778.62000 4464 5.84000 2.606976e+04 -7.088600e+02 \n", "BJKAS.IS 27452.70000 5310 3.22000 1.709820e+04 -1.035450e+04 \n", "DOAS.IS 0.00000 0 10.92000 0.000000e+00 0.000000e+00 \n", "EREGL.IS 27454.18131 6309 4.12000 2.599308e+04 -1.461101e+03 \n", "GOODY.IS 14989.04820 311242 4.69645 1.461732e+06 1.446743e+06 \n", "KOZAL.IS 19945.03000 1500 13.74000 2.061000e+04 6.649700e+02 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.016803 \n", "BJKAS.IS 0.011020 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.016753 \n", "GOODY.IS 0.942139 \n", "KOZAL.IS 0.013284 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 91056 BJKAS.IS 2016-05-31\n", "1 buy 69006 EREGL.IS 2016-05-31\n", "2 buy 21083 KOZAL.IS 2016-05-31\n", "3 buy 48669 AFYON.IS 2016-05-31\n", "4 sell 245170 GOODY.IS 2016-05-31\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 18.70000 0.0000 0.00000 \n", "AFYON.IS 311005.58000 53133 5.84000 310296.7200 -708.86000 \n", "BJKAS.IS 320653.02000 96366 3.22000 310298.5200 -10354.50000 \n", "DOAS.IS 0.00000 0 10.92000 0.0000 0.00000 \n", "EREGL.IS 311758.90131 75315 4.12000 310297.8000 -1461.10131 \n", "GOODY.IS 3233.14670 66072 4.69645 310303.8444 307070.69770 \n", "KOZAL.IS 309625.45000 22583 13.74000 310290.4200 664.97000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.200000 \n", "BJKAS.IS 0.200001 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.200000 \n", "GOODY.IS 0.200004 \n", "KOZAL.IS 0.199995 \n", " \n", "2016-06-30 00:00:00\n", "--------------------\n", "BJKAS.IS 5.33745899346\n", "GOODY.IS 3.70296155031\n", "AFYON.IS 2.73888471627\n", "EREGL.IS 2.26335412215\n", "KOZAL.IS 2.17678028137\n", "TKFEN.IS 1.91104031464\n", "YKBNK.IS 1.47010564428\n", "DOAS.IS 1.28165996194\n", "VAKBN.IS 1.27942651058\n", "VAKFN.IS 1.25114330665\n", "PETKM.IS 1.2243493208\n", "FROTO.IS 1.18892366153\n", "TCELL.IS 1.17502050664\n", "AKBNK.IS 1.15415096839\n", "TRKCM.IS 1.15112004053\n", "AEFES.IS 1.0820661819\n", "ALARK.IS 1.04582594283\n", "GARAN.IS 0.924882254881\n", "SISE.IS 0.819848136752\n", "ULKER.IS 0.651242173138\n", "THYAO.IS 0.577994374221\n", "MGROS.IS 0.432742947264\n", "AKENR.IS 0.411572932002\n", "CIMSA.IS 0.409761734264\n", "HALKB.IS 0.29317300613\n", "ZOREN.IS 0.177975826959\n", "AKSA.IS -0.164770083225\n", "KARSN.IS -0.444213608009\n", "TMSN.IS -1.12383635356\n", "{'AFYON.IS': 0.2, 'BJKAS.IS': 0.2, 'EREGL.IS': 0.2, 'GOODY.IS': 0.2, 'KOZAL.IS': 0.2}\n", "Before Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 19.45 0.00 0.00000 \n", "AFYON.IS 311005.58000 53133 5.46 290106.18 -20899.40000 \n", "BJKAS.IS 320653.02000 96366 3.47 334390.02 13737.00000 \n", "DOAS.IS 0.00000 0 10.60 0.00 0.00000 \n", "EREGL.IS 311758.90131 75315 4.06 305778.90 -5980.00131 \n", "GOODY.IS 3233.14670 66072 3.32 219359.04 216125.89330 \n", "KOZAL.IS 309625.45000 22583 12.73 287481.59 -22143.86000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.201867 \n", "BJKAS.IS 0.232681 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.212773 \n", "GOODY.IS 0.152638 \n", "KOZAL.IS 0.200041 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 sell 13535 BJKAS.IS 2016-06-30\n", "1 sell 4521 EREGL.IS 2016-06-30\n", "2 sell 4 KOZAL.IS 2016-06-30\n", "3 sell 491 AFYON.IS 2016-06-30\n", "4 buy 20501 GOODY.IS 2016-06-30\n", " \n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 19.45 0.00 0.00000 \n", "AFYON.IS 308103.77000 52642 5.46 287425.32 -20678.45000 \n", "BJKAS.IS 266715.82000 82831 3.47 287423.57 20707.75000 \n", "DOAS.IS 0.00000 0 10.60 0.00 0.00000 \n", "EREGL.IS 292085.36292 70794 4.06 287423.64 -4661.72292 \n", "GOODY.IS 71296.46670 86573 3.32 287422.36 216125.89330 \n", "KOZAL.IS 309575.29000 22579 12.73 287430.67 -22144.62000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.200000 \n", "BJKAS.IS 0.199999 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.199999 \n", "GOODY.IS 0.199998 \n", "KOZAL.IS 0.200004 \n", " \n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/can/.local/lib/python2.7/site-packages/ipykernel/__main__.py:3: FutureWarning: how in .resample() is deprecated\n", "the new syntax is .resample(...).first()\n", " app.launch_new_instance()\n" ] } ], "source": [ "portfolio, transactions, positions, trades = [], [], [], []\n", "\n", "for t in running_points:\n", " time = t.strftime(\"%Y-%m-%d\")\n", " \n", " if t in pd.date_range(start=running_points[0], periods=12, freq='BM'):\n", " print t\n", " print '-'*20\n", " beta_values = beta(prices, prices.index[0], t)\n", " for s in sorted(beta_values, key=beta_values.get, reverse=True):\n", " print s, beta_values[s]\n", " \n", " n = 5 \n", " new_weights = {s: 1./n for s in sorted(beta_values, key=beta_values.get, reverse=True)[:n]}\n", " print new_weights\n", " \n", " target_value = None if len(portfolio) else capital_base\n", " \n", " if len(portfolio) > 0:\n", " current_performance(portfolio, time)\n", " \n", " rebalance_orders = rebalance(portfolio, new_weights, target_value, time)\n", " \n", " print \"Before Orders\"\n", " print \"-\"*20\n", " print portfolio\n", " print \" \"\n", " \n", " print \"Orders\"\n", " print \"-\"*20\n", " print pd.DataFrame(rebalance_orders)\n", " print \" \"\n", " execute_orders(rebalance_orders, transactions, positions, trades)\n", " portfolio = calculate_portfolio(positions)\n", " current_performance(portfolio, time)\n", " \n", " print \"After Orders\"\n", " print \"-\"*20 \n", " print portfolio\n", " print \" \"\n", " \n", "portfolio = calculate_portfolio(positions)" ] }, { "cell_type": "code", "execution_count": 47, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ***Transactions*** \n", "----------------------------------------------------------------------\n", " action commision price shares status symbol time\n", "0 buy 1.999145 9.70930 2059 accepted DOAS.IS 2016-01-29\n", "1 buy 1.999944 5.91000 3384 accepted AFYON.IS 2016-01-29\n", "2 buy 1.999940 18.05000 1108 accepted AEFES.IS 2016-01-29\n", "3 buy 1.998876 12.54000 1594 accepted KOZAL.IS 2016-01-29\n", "4 buy 1.999999 0.04795 417101 accepted GOODY.IS 2016-01-29\n", "5 buy 0.024204 10.08480 24 accepted DOAS.IS 2016-02-29\n", "6 buy 0.077740 5.98000 130 accepted AFYON.IS 2016-02-29\n", "7 buy 0.219042 16.98000 129 accepted AEFES.IS 2016-02-29\n", "8 sell 0.485576 16.24000 299 accepted KOZAL.IS 2016-02-29\n", "9 buy 0.163744 0.04646 35244 accepted GOODY.IS 2016-02-29\n", "10 buy 0.356533 11.24710 317 accepted DOAS.IS 2016-03-31\n", "11 buy 0.461188 6.37000 724 accepted AFYON.IS 2016-03-31\n", "12 buy 0.080408 21.16000 38 accepted AEFES.IS 2016-03-31\n", "13 buy 0.359593 18.07000 199 accepted KOZAL.IS 2016-03-31\n", "14 sell 1.261192 0.08757 144021 accepted GOODY.IS 2016-03-31\n", "15 buy 2.745270 5.17000 5310 accepted BJKAS.IS 2016-04-29\n", "16 buy 2.745418 4.35159 6309 accepted EREGL.IS 2016-04-29\n", "17 sell 2.769300 21.72000 1275 accepted AEFES.IS 2016-04-29\n", "18 buy 0.010980 18.30000 6 accepted KOZAL.IS 2016-04-29\n", "19 sell 2.899200 12.08000 2400 accepted DOAS.IS 2016-04-29\n", "20 buy 0.138990 6.15000 226 accepted AFYON.IS 2016-04-29\n", "21 buy 0.025743 0.08822 2918 accepted GOODY.IS 2016-04-29\n", "22 buy 29.320032 3.22000 91056 accepted BJKAS.IS 2016-05-31\n", "23 buy 28.430472 4.12000 69006 accepted EREGL.IS 2016-05-31\n", "24 buy 28.968042 13.74000 21083 accepted KOZAL.IS 2016-05-31\n", "25 buy 28.422696 5.84000 48669 accepted AFYON.IS 2016-05-31\n", "26 sell 115.142865 4.69645 245170 accepted GOODY.IS 2016-05-31\n", "27 sell 4.696645 3.47000 13535 accepted BJKAS.IS 2016-06-30\n", "28 sell 1.835526 4.06000 4521 accepted EREGL.IS 2016-06-30\n", "29 sell 0.005092 12.73000 4 accepted KOZAL.IS 2016-06-30\n", "30 sell 0.268086 5.46000 491 accepted AFYON.IS 2016-06-30\n", "31 buy 6.806332 3.32000 20501 accepted GOODY.IS 2016-06-30\n", "\n", " ***Positions*** \n", "----------------------------------------------------------------------\n", " cost initial_shares price shares symbol time type\n", "0 0.00000 2059 9.70930 0 DOAS.IS 2016-01-29 long\n", "1 17097.63000 3384 5.91000 2893 AFYON.IS 2016-01-29 long\n", "2 0.00000 1108 18.05000 0 AEFES.IS 2016-01-29 long\n", "3 16189.14000 1594 12.54000 1291 KOZAL.IS 2016-01-29 long\n", "4 1338.28450 417101 0.04795 27910 GOODY.IS 2016-01-29 long\n", "5 0.00000 24 10.08480 0 DOAS.IS 2016-02-29 long\n", "6 777.40000 130 5.98000 130 AFYON.IS 2016-02-29 long\n", "7 0.00000 129 16.98000 0 AEFES.IS 2016-02-29 long\n", "8 1637.43624 35244 0.04646 35244 GOODY.IS 2016-02-29 long\n", "9 0.00000 317 11.24710 0 DOAS.IS 2016-03-31 long\n", "10 4611.88000 724 6.37000 724 AFYON.IS 2016-03-31 long\n", "11 0.00000 38 21.16000 0 AEFES.IS 2016-03-31 long\n", "12 3595.93000 199 18.07000 199 KOZAL.IS 2016-03-31 long\n", "13 0.00000 5310 5.17000 0 BJKAS.IS 2016-04-29 long\n", "14 7780.64292 6309 4.35159 1788 EREGL.IS 2016-04-29 long\n", "15 109.80000 6 18.30000 6 KOZAL.IS 2016-04-29 long\n", "16 1389.90000 226 6.15000 226 AFYON.IS 2016-04-29 long\n", "17 257.42596 2918 0.08822 2918 GOODY.IS 2016-04-29 long\n", "18 266715.82000 91056 3.22000 82831 BJKAS.IS 2016-05-31 long\n", "19 284304.72000 69006 4.12000 69006 EREGL.IS 2016-05-31 long\n", "20 289680.42000 21083 13.74000 21083 KOZAL.IS 2016-05-31 long\n", "21 284226.96000 48669 5.84000 48669 AFYON.IS 2016-05-31 long\n", "22 68063.32000 20501 3.32000 20501 GOODY.IS 2016-06-30 long\n", "\n", " ***Trades*** \n", "----------------------------------------------------------------------\n", " buy_price profit sell_price shares symbol time\n", "0 12.54000 1.106300e+03 16.24000 299 KOZAL.IS 2016-02-29\n", "1 0.04795 5.706112e+03 0.08757 144021 GOODY.IS 2016-03-31\n", "2 18.05000 4.066360e+03 21.72000 1108 AEFES.IS 2016-04-29\n", "3 16.98000 6.114600e+02 21.72000 129 AEFES.IS 2016-04-29\n", "4 21.16000 2.128000e+01 21.72000 38 AEFES.IS 2016-04-29\n", "5 9.70930 4.881271e+03 12.08000 2059 DOAS.IS 2016-04-29\n", "6 10.08480 4.788480e+01 12.08000 24 DOAS.IS 2016-04-29\n", "7 11.24710 2.640293e+02 12.08000 317 DOAS.IS 2016-04-29\n", "8 0.04795 1.139673e+06 4.69645 245170 GOODY.IS 2016-05-31\n", "9 5.17000 -9.027000e+03 3.47000 5310 BJKAS.IS 2016-06-30\n", "10 3.22000 2.056250e+03 3.47000 8225 BJKAS.IS 2016-06-30\n", "11 4.35159 -1.318278e+03 4.06000 4521 EREGL.IS 2016-06-30\n", "12 12.54000 7.600000e-01 12.73000 4 KOZAL.IS 2016-06-30\n", "13 5.91000 -2.209500e+02 5.46000 491 AFYON.IS 2016-06-30\n" ] } ], "source": [ "summary(transactions, positions, trades)" ] }, { "cell_type": "code", "execution_count": 48, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AEFES.IS0.00000020.140.000.000000.000000
AFYON.IS308103.77000526425.48288478.16-19625.610000.190931
BJKAS.IS266715.82000828314.25352031.7585315.930000.232994
DOAS.IS0.00000010.290.000.000000.000000
EREGL.IS292085.36292707944.67330607.9838522.617080.218815
GOODY.IS71296.46670865733.58309931.34238634.873300.205130
KOZAL.IS309575.290002257910.18229854.22-79721.070000.152130
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit \\\n", "symbol \n", "AEFES.IS 0.00000 0 20.14 0.00 0.00000 \n", "AFYON.IS 308103.77000 52642 5.48 288478.16 -19625.61000 \n", "BJKAS.IS 266715.82000 82831 4.25 352031.75 85315.93000 \n", "DOAS.IS 0.00000 0 10.29 0.00 0.00000 \n", "EREGL.IS 292085.36292 70794 4.67 330607.98 38522.61708 \n", "GOODY.IS 71296.46670 86573 3.58 309931.34 238634.87330 \n", "KOZAL.IS 309575.29000 22579 10.18 229854.22 -79721.07000 \n", "\n", " weight \n", "symbol \n", "AEFES.IS 0.000000 \n", "AFYON.IS 0.190931 \n", "BJKAS.IS 0.232994 \n", "DOAS.IS 0.000000 \n", "EREGL.IS 0.218815 \n", "GOODY.IS 0.205130 \n", "KOZAL.IS 0.152130 " ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "current_performance(portfolio, time = '2016-08-04')\n", "portfolio" ] }, { "cell_type": "code", "execution_count": 49, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "1510903.45" ] }, "execution_count": 49, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio.market_value.sum()" ] }, { "cell_type": "code", "execution_count": 50, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timesymbolpaid_dividend
8162016-04-07DOAS.IS3.272736e+03
11132016-05-25EREGL.IS1.892700e+03
13622016-05-25GOODY.IS1.720580e+06
\n", "
" ], "text/plain": [ " time symbol paid_dividend\n", "816 2016-04-07 DOAS.IS 3.272736e+03\n", "1113 2016-05-25 EREGL.IS 1.892700e+03\n", "1362 2016-05-25 GOODY.IS 1.720580e+06" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paid_dividends(transactions, Dividends)" ] }, { "cell_type": "code", "execution_count": 51, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
actionvaluesymbol
2016-06-01SPLIT0.045455GOODY.IS
2016-05-25DIVIDEND5.528110GOODY.IS
2015-05-20DIVIDEND0.794024GOODY.IS
2015-05-12DIVIDEND0.794024GOODY.IS
2014-05-06DIVIDEND5.243630GOODY.IS
2013-05-16DIVIDEND0.833000GOODY.IS
2012-05-31DIVIDEND1.035160GOODY.IS
2011-05-26DIVIDEND0.230000GOODY.IS
\n", "
" ], "text/plain": [ " action value symbol\n", "2016-06-01 SPLIT 0.045455 GOODY.IS\n", "2016-05-25 DIVIDEND 5.528110 GOODY.IS\n", "2015-05-20 DIVIDEND 0.794024 GOODY.IS\n", "2015-05-12 DIVIDEND 0.794024 GOODY.IS\n", "2014-05-06 DIVIDEND 5.243630 GOODY.IS\n", "2013-05-16 DIVIDEND 0.833000 GOODY.IS\n", "2012-05-31 DIVIDEND 1.035160 GOODY.IS\n", "2011-05-26 DIVIDEND 0.230000 GOODY.IS" ] }, "execution_count": 51, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dividends_and_splits.query(\"symbol == 'GOODY.IS'\")" ] }, { "cell_type": "code", "execution_count": 52, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Algorithm performance: 1565.96392855\n", "Benchmark performance: 5.60699416203\n" ] }, { "data": { "image/png": "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\n998vbdhQ9fGXOmdyT0tfdlMfzLVr1+rpp59Wjx49JElXXXWVvv32W82ePVvffvutFixYoBtvvLH4\neYsWLdLKlSu1cOFCPfroo7r44ou1YsUKSdLf//53zZo1S9OnT9fvv/+uO+64o1QR9N577+mbb77R\nW2+9pRtvvFFff/118X0vv/yyTj/9dC1btkzdunXTEUccIUlauHChbrjhBp1//vnFj83NzdUrr7yi\nlStXasyYMbrssss0a9asUmNctmyZ5s+frwcffLD47ypJN954o8aPH693331Xbdu2DfJbCgAVisel\njh2lX35xXbAAACjP2rWbC7HevaUffnAfJRUVSxddJLVsWfVj9+snTZpU/v2rVrkU7sMP3ZuHkya5\nj113lR57LImui9balHy4Q2+pvNtrg/bt29usrCzbvHlz26BBA7vtttvazz77zMbjcdu0aVM7b968\n4se+//77docddrDWWvv222/bzMxMG4vFiu/PycmxH374oY3FYjYzM9N++umnW5zv+++/t8YYu2DB\nguLb9t9/f/v0009ba60dNmyYPfzww4vve+mll2xWVpaNx+PWWmtXrlxpjTF2xYoVCf8+xx13nL3n\nnnuKx9iwYUNbWFhYfP/bb79tt912W3vZZZfZgw46yK5cubLC709t/tkBqLvuvdfaiy6ytlMna7/4\nIurRAABqs549rZ02bfPX55xj7V13bf568WJrDz3U2kMOsbacl8jlWrfO2mbNrF2yZMv7vvvO2j32\nsPb8863dsKH0fQUFblzdulm7fHnp+za9fk5YL9WvZt0WCjPcVP6gSthhVdzhreR5jdGkSZN0yCGH\nyFqriRMnqnfv3vrkk0+0du1a7bPPPpuPb22pboctW7ZURsbmgLFJkyZavXq1li5dqvXr16tjx47l\nnnebbbbZ4nlFckosas3MzFSrVq2K07TMTW8HrF69Ws2aNdOUKVM0fPhwzZ07V/F4XGvXrtWee+5Z\n/PzWrVurYcOGpc69fPlyPfLII3rqqaeUnZ1d5e8VAAQlHpfq1ZM6dXLvMO62W9QjAgDUViWXJkpu\neeLNN0tDh0rTp0snnSQNGiTdeKObW6qjcWO35PCf/5S6d3d7XG7cKC1fLg0bJl17rXTxxVKZq3vU\nu7c0bZp0ySXS6adLL77oljpWplYWYskUUUEzxqh///46//zz9cEHHygzM1Nffvml2lTW+7KMVq1a\n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\n9f7iafsrt/21nHdt/8bf/vW21vfPWt7+Ws67tq/tr3Zref+s5bxr+yu//YarDcTcsuZimaz1g6Lt\nr8y2tX1tf7Vb6/tnLW9/Ledd29f2V7u1vH/Wct61/ZXffoM59+ZjKjN7EPioc+6d9dcfBkLn3H9f\n8JlVGayJiIiIiIi0inPOLrT8agOxGHAQ+AHgLPBt4DHn3OvXkkkREREREZGbQexqVnLO1czsQ8A/\nAFHgjxWEiYiIiIiIXJmrqhETERERERGRq3fVD3S+EDMLzOy7C9KWS3z2GTO7bzn/vswzs9DM/mzB\n65iZjZrZ36xkvuTKmdmP1o/jrSudl5uVzqO1x8xmVjoPcmUud6xUTrj+dJ1Zm8zs183sgJm9Ui9v\nP7DSeZKrs6yBGDDnnLtnQTp5ic+qKu76mgXuMLNU/fXb8Y8ZuOL9Xu8LKCvnMeDZ+vSKmdlyn9c3\ns2s+j6TldGzWjssdK3cFn5Frc1XXGVk5ZvYW4J8D9zjn7saP13Dq0mvJanXdC2xmdl/9rtZ3zOzv\nzWxgwds/XY/k95vZ91zvvNyE/hZ/soL/kf08YABm9oCZfdPMXjKzb5jZ7vry95vZX5vZV4Avr0iu\nBTNrB94K/CvgvfVl32dmXzezJ83sDTP7AzNrHM8ZM/ttM3sZeHDlcn5Duprz6GtmdndjA2b2nJnt\nbXXGb1Zm9sjCWksz+7SZva8+P2hmHzWzF81sn2oCVtaljpVcX5e4zlzs3PlnZvZ6vTz3SbUMWDED\nwJhzrgrgnJtwzp27WHm7vux3Vd5enZY7EEsvaJb4RL1G5VPAv3DO3Q/8KfDx+mcNSDvn7gF+HviT\nZc6LwF8A7zWzJLAX+McF770OPOScuxf4L8AnFrx3D/6YPdqynMpSPwL8nXPuMDBuZvfWl38P8CFg\nD7AT+LH68jbgeefcP3HOfbPlub2xXc159MfA+wHqwVnSObe/ZTmWpRbWrDhg1Dl3H/AHwC+tWK7k\nQlQL1joXus4s3fcOcPVWAZ8B3lkvz/Vc4LPSGk8Bm83soJn9npk9bGZxLl7edqi8vWotd9OzYv1A\nA2BmdwJ3AP+vfuM+ih/uHvwX4/MAzrlnzazTzDqdc9PLnKeblnNuv5ltw9/F/9KSt7PA58xsF/5Y\nLPwuPOWcy7ckk3IxjwG/W5//i/rrJ4FvO+cGAczs88DbgCeAoD6VZfYmz6N4ffkXgf9kZv8R+Bn8\n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\nTkSuQmCC\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "temp = historical_performance(transactions, prices)\n", "compare_with_benchmark(temp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Momentum Strategy\n", "\n", "**Initialization** \n", "1. Calculate absolute momentum (return) of funds and select *n* stocks with the highest moment.\n", "2. Equal weight\n", "\n", "**Every month**\n", "1. If the moment of a stock in the portfolio is negative then replace it with the best option\n", "2. Rebalance" ] }, { "cell_type": "code", "execution_count": 53, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# TODO: fill nan values\n", "def momentum(price_data, start, end):\n", " momentum_values = {symbol: (price_data[symbol].loc[end] - price_data[symbol].loc[start]) \n", " for symbol in price_data.columns if symbol != 'XU100.IS'}\n", " return momentum_values" ] }, { "cell_type": "code", "execution_count": 54, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "DatetimeIndex(['2016-01-29', '2016-02-29', '2016-03-31', '2016-04-29',\n", " '2016-05-31', '2016-06-30', '2016-07-29', '2016-08-31',\n", " '2016-09-30', '2016-10-31', '2016-11-30', '2016-12-30'],\n", " dtype='datetime64[ns]', freq='BM')" ] }, "execution_count": 54, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.date_range(start=running_points[0], periods=12, freq='BM')" ] }, { "cell_type": "code", "execution_count": 55, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2016-01-29 00:00:00\n", "--------------------\n", "TMSN.IS 4.5\n", "FROTO.IS 2.4809\n", "BJKAS.IS 1.02\n", "PETKM.IS 0.83363\n", "AFYON.IS 0.61\n", "ALARK.IS 0.54994\n", "ULKER.IS 0.39\n", "ZOREN.IS 0.23881\n", "AKBNK.IS 0.14716\n", "SISE.IS 0.10687\n", "YKBNK.IS 0.06\n", "VAKFN.IS 0.0523\n", "GARAN.IS 0.039\n", "KARSN.IS 0.03\n", "GOODY.IS 0.00778\n", "AKSA.IS 0.0\n", "AKENR.IS -0.01\n", "TRKCM.IS -0.04577\n", "VAKBN.IS -0.05946\n", "TKFEN.IS -0.11\n", "CIMSA.IS -0.6547\n", "MGROS.IS -0.7\n", "THYAO.IS -0.73\n", "EREGL.IS -0.76409\n", "HALKB.IS -0.79\n", "TCELL.IS -1.23\n", "DOAS.IS -1.7434\n", "AEFES.IS -2.81\n", "KOZAL.IS -12.3\n", "{'AFYON.IS': 0.2, 'TMSN.IS': 0.2, 'BJKAS.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "0\n", "[]\n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 3384 AFYON.IS 2016-01-29\n", "1 buy 1901 TMSN.IS 2016-01-29\n", "2 buy 6734 BJKAS.IS 2016-01-29\n", "3 buy 636 FROTO.IS 2016-01-29\n", "4 buy 6250 PETKM.IS 2016-01-29\n", " \n", "99982.3716\n", "0\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit weight\n", "symbol \n", "AFYON.IS 19999.4400 3384 5.91000 19999.4400 0.0 0.200030\n", "BJKAS.IS 19999.9800 6734 2.97000 19999.9800 0.0 0.200035\n", "FROTO.IS 19986.6816 636 31.42560 19986.6816 0.0 0.199902\n", "PETKM.IS 19997.7500 6250 3.19964 19997.7500 0.0 0.200013\n", "TMSN.IS 19998.5200 1901 10.52000 19998.5200 0.0 0.200020\n", "99982.3716\n", " \n", "2016-02-29 00:00:00\n", "--------------------\n", "TMSN.IS 3.55\n", "BJKAS.IS 2.69\n", "FROTO.IS 2.5783\n", "DOAS.IS 0.9924\n", "AKBNK.IS 0.80449\n", "AFYON.IS 0.8\n", "PETKM.IS 0.73861\n", "CIMSA.IS 0.47284\n", "SISE.IS 0.47201\n", "GARAN.IS 0.443\n", "ZOREN.IS 0.33625\n", "YKBNK.IS 0.29\n", "VAKBN.IS 0.2081\n", "TCELL.IS 0.19\n", "VAKFN.IS 0.1046\n", "KARSN.IS 0.05\n", "GOODY.IS 0.00748\n", "AKENR.IS -0.04\n", "AKSA.IS -0.04601\n", "TKFEN.IS -0.05\n", "TRKCM.IS -0.05492\n", "ALARK.IS -0.07457\n", "HALKB.IS -0.12\n", "EREGL.IS -0.32613\n", "ULKER.IS -0.34\n", "THYAO.IS -0.8\n", "MGROS.IS -1.32\n", "AEFES.IS -4.3\n", "KOZAL.IS -6.08\n", "{'AFYON.IS': 0.2, 'BJKAS.IS': 0.2, 'TMSN.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "112051.4147\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 19999.4400 3384 5.98000 20236.3200 236.8800 \n", "BJKAS.IS 19999.9800 6734 4.68000 31515.1200 11515.1400 \n", "FROTO.IS 19986.6816 636 33.95520 21595.5072 1608.8256 \n", "PETKM.IS 19997.7500 6250 3.21803 20112.6875 114.9375 \n", "TMSN.IS 19998.5200 1901 9.78000 18591.7800 -1406.7400 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.180599 \n", "BJKAS.IS 0.281256 \n", "FROTO.IS 0.192729 \n", "PETKM.IS 0.179495 \n", "TMSN.IS 0.165922 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 363 AFYON.IS 2016-02-29\n", "1 sell 1945 BJKAS.IS 2016-02-29\n", "2 buy 390 TMSN.IS 2016-02-29\n", "3 buy 23 FROTO.IS 2016-02-29\n", "4 buy 713 PETKM.IS 2016-02-29\n", " \n", "9060.36499\n", "9102.6\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 22170.18000 3747 5.98000 22407.06000 236.8800 \n", "BJKAS.IS 14223.33000 4789 4.68000 22412.52000 8189.1900 \n", "FROTO.IS 20767.65120 659 33.95520 22376.47680 1608.8256 \n", "PETKM.IS 22292.20539 6963 3.21803 22407.14289 114.9375 \n", "TMSN.IS 23812.72000 2291 9.78000 22405.98000 -1406.7400 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.200047 \n", "BJKAS.IS 0.200095 \n", "FROTO.IS 0.199774 \n", "PETKM.IS 0.200047 \n", "TMSN.IS 0.200037 \n", "112009.17969\n", " \n", "2016-03-31 00:00:00\n", "--------------------\n", "FROTO.IS 2.8993\n", "BJKAS.IS 2.89\n", "TMSN.IS 1.89\n", "KOZAL.IS 1.75\n", "DOAS.IS 1.5914\n", "ULKER.IS 1.52\n", "TKFEN.IS 1.15\n", "CIMSA.IS 1.04194\n", "PETKM.IS 0.95009\n", "AKBNK.IS 0.65168\n", "YKBNK.IS 0.6\n", "GARAN.IS 0.531\n", "VAKBN.IS 0.50541\n", "MGROS.IS 0.43\n", "ZOREN.IS 0.33518\n", "VAKFN.IS 0.3138\n", "ALARK.IS 0.29827\n", "SISE.IS 0.29389\n", "AFYON.IS 0.2\n", "EREGL.IS 0.13045\n", "TRKCM.IS 0.10069\n", "KARSN.IS 0.05\n", "GOODY.IS 0.02904\n", "AKENR.IS 0.02\n", "TCELL.IS -0.03\n", "AKSA.IS -0.22085\n", "HALKB.IS -0.58\n", "THYAO.IS -0.84\n", "AEFES.IS -1.91\n", "{'AFYON.IS': 0.2, 'BJKAS.IS': 0.2, 'TMSN.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "117341.42468\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 22170.18000 3747 6.37000 23868.39000 1698.21000 \n", "BJKAS.IS 14223.33000 4789 5.05000 24184.45000 9961.12000 \n", "FROTO.IS 20767.65120 659 36.13460 23812.70140 3045.05020 \n", "PETKM.IS 22292.20539 6963 3.66856 25544.18328 3251.97789 \n", "TMSN.IS 23812.72000 2291 8.70000 19931.70000 -3881.02000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.203410 \n", "BJKAS.IS 0.206103 \n", "FROTO.IS 0.202935 \n", "PETKM.IS 0.217691 \n", "TMSN.IS 0.169861 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 sell 62 AFYON.IS 2016-03-31\n", "1 sell 141 BJKAS.IS 2016-03-31\n", "2 buy 406 TMSN.IS 2016-03-31\n", "3 sell 9 FROTO.IS 2016-03-31\n", "4 sell 565 PETKM.IS 2016-03-31\n", " \n", "3532.2\n", "3504.9378\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 21803.76000 3685 6.37000 23473.45000 1669.69000 \n", "BJKAS.IS 13804.56000 4648 5.05000 23472.40000 9667.84000 \n", "FROTO.IS 20484.82080 650 36.13460 23487.49000 3002.66920 \n", "PETKM.IS 20484.40879 6398 3.66856 23471.44688 2987.03809 \n", "TMSN.IS 27344.92000 2697 8.70000 23463.90000 -3881.02000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.199998 \n", "BJKAS.IS 0.199989 \n", "FROTO.IS 0.200117 \n", "PETKM.IS 0.199980 \n", "TMSN.IS 0.199916 \n", "117368.68688\n", " \n", "2016-04-29 00:00:00\n", "--------------------\n", "FROTO.IS 7.1323\n", "KOZAL.IS 6.37\n", "ULKER.IS 3.45\n", "BJKAS.IS 2.94\n", "AKBNK.IS 1.85052\n", "TKFEN.IS 1.85\n", "CIMSA.IS 1.7974\n", "DOAS.IS 1.7132\n", "MGROS.IS 1.49\n", "GARAN.IS 1.387\n", "PETKM.IS 1.15236\n", "AEFES.IS 1.06\n", "VAKBN.IS 0.93154\n", "EREGL.IS 0.91318\n", "YKBNK.IS 0.87\n", "SISE.IS 0.81044\n", "ALARK.IS 0.77365\n", "TCELL.IS 0.68\n", "TRKCM.IS 0.42106\n", "VAKFN.IS 0.38851\n", "AKENR.IS 0.34\n", "ZOREN.IS 0.34\n", "GOODY.IS 0.04098\n", "HALKB.IS -0.02\n", "KARSN.IS -0.11\n", "AKSA.IS -0.28606\n", "AFYON.IS -0.39\n", "TMSN.IS -0.45\n", "THYAO.IS -0.84\n", "AFYON.ISoutKOZAL.ISin\n", "TMSN.ISoutULKER.ISin\n", "{'KOZAL.IS': 0.2, 'ULKER.IS': 0.2, 'BJKAS.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "117236.85822\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 21803.76000 3685 6.15000 22662.75000 858.99000 \n", "BJKAS.IS 13804.56000 4648 5.17000 24030.16000 10225.60000 \n", "FROTO.IS 20484.82080 650 37.60000 24440.00000 3955.17920 \n", "PETKM.IS 20484.40879 6398 3.77889 24177.33822 3692.92943 \n", "TMSN.IS 27344.92000 2697 8.13000 21926.61000 -5418.31000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.193307 \n", "BJKAS.IS 0.204971 \n", "FROTO.IS 0.208467 \n", "PETKM.IS 0.206226 \n", "TMSN.IS 0.187028 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 sell 112 BJKAS.IS 2016-04-29\n", "1 buy 1281 KOZAL.IS 2016-04-29\n", "2 sell 26 FROTO.IS 2016-04-29\n", "3 buy 1052 ULKER.IS 2016-04-29\n", "4 sell 3685 AFYON.IS 2016-04-29\n", "5 sell 2697 TMSN.IS 2016-04-29\n", "6 sell 193 PETKM.IS 2016-04-29\n", " \n", "46880.86\n", "46875.32577\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 6.15000 0.00000 0.00000 \n", "BJKAS.IS 13471.92000 4536 5.17000 23451.12000 9979.20000 \n", "FROTO.IS 19667.75520 624 37.60000 23462.40000 3794.64480 \n", "KOZAL.IS 23442.30000 1281 18.30000 23442.30000 0.00000 \n", "PETKM.IS 19866.87827 6205 3.77889 23448.01245 3581.13418 \n", "TMSN.IS 0.00000 0 8.13000 0.00000 0.00000 \n", "ULKER.IS 23438.56000 1052 22.28000 23438.56000 0.00000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.200023 \n", "FROTO.IS 0.200119 \n", "KOZAL.IS 0.199947 \n", "PETKM.IS 0.199996 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.199915 \n", "117242.39245\n", " \n", "2016-05-31 00:00:00\n", "--------------------\n", "FROTO.IS 4.6484\n", "GOODY.IS 4.64283\n", "ULKER.IS 3.28\n", "TKFEN.IS 3.2\n", "CIMSA.IS 2.03478\n", "EREGL.IS 1.24341\n", "DOAS.IS 1.2062\n", "AKBNK.IS 1.20108\n", "KOZAL.IS 1.16\n", "PETKM.IS 1.10639\n", "BJKAS.IS 1.04\n", "YKBNK.IS 0.77\n", "ALARK.IS 0.60587\n", "VAKBN.IS 0.54504\n", "TCELL.IS 0.53\n", "GARAN.IS 0.446\n", "TRKCM.IS 0.44164\n", "SISE.IS 0.42748\n", "VAKFN.IS 0.38104\n", "AKENR.IS 0.14\n", "ZOREN.IS -0.07\n", "AEFES.IS -0.08\n", "AFYON.IS -0.23\n", "KARSN.IS -0.37\n", "MGROS.IS -0.48\n", "THYAO.IS -1.05\n", "TMSN.IS -1.17\n", "AKSA.IS -1.22878\n", "HALKB.IS -1.47\n", "{'KOZAL.IS': 0.2, 'BJKAS.IS': 0.2, 'ULKER.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "100730.78005\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 5.84000 0.00000 0.00000 \n", "BJKAS.IS 13471.92000 4536 3.22000 14605.92000 1134.00000 \n", "FROTO.IS 19667.75520 624 34.98000 21827.52000 2159.76480 \n", "KOZAL.IS 23442.30000 1281 13.74000 17600.94000 -5841.36000 \n", "PETKM.IS 19866.87827 6205 3.90761 24246.72005 4379.84178 \n", "TMSN.IS 0.00000 0 7.72000 0.00000 0.00000 \n", "ULKER.IS 23438.56000 1052 21.34000 22449.68000 -988.88000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.145000 \n", "FROTO.IS 0.216692 \n", "KOZAL.IS 0.174732 \n", "PETKM.IS 0.240708 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.222868 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 buy 1720 BJKAS.IS 2016-05-31\n", "1 buy 185 KOZAL.IS 2016-05-31\n", "2 sell 48 FROTO.IS 2016-05-31\n", "3 sell 107 ULKER.IS 2016-05-31\n", "4 sell 1049 PETKM.IS 2016-05-31\n", " \n", "8080.3\n", "8061.50289\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 5.84000 0.00000 0.00000 \n", "BJKAS.IS 19010.32000 6256 3.22000 20144.32000 1134.00000 \n", "FROTO.IS 18159.32640 576 34.98000 20148.48000 1989.15360 \n", "KOZAL.IS 25984.20000 1466 13.74000 20142.84000 -5841.36000 \n", "PETKM.IS 16510.45591 5156 3.90761 20147.63716 3637.18125 \n", "TMSN.IS 0.00000 0 7.72000 0.00000 0.00000 \n", "ULKER.IS 21054.60000 945 21.34000 20166.30000 -888.30000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.199944 \n", "FROTO.IS 0.199986 \n", "KOZAL.IS 0.199930 \n", "PETKM.IS 0.199977 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.200163 \n", "100749.57716\n", " \n", "2016-06-30 00:00:00\n", "--------------------\n", "TKFEN.IS 4.16\n", "GOODY.IS 3.30205\n", "CIMSA.IS 2.115\n", "ULKER.IS 2.08\n", "EREGL.IS 1.23068\n", "AKBNK.IS 1.086\n", "DOAS.IS 1.0207\n", "VAKBN.IS 0.80396\n", "PETKM.IS 0.62036\n", "SISE.IS 0.5996\n", "AEFES.IS 0.59\n", "TRKCM.IS 0.58905\n", "KOZAL.IS 0.45\n", "BJKAS.IS 0.43\n", "MGROS.IS 0.37\n", "VAKFN.IS 0.33839\n", "GARAN.IS 0.289\n", "TCELL.IS 0.24\n", "FROTO.IS 0.2344\n", "YKBNK.IS 0.22\n", "ZOREN.IS 0.15\n", "AKENR.IS 0.04\n", "ALARK.IS -0.06358\n", "KARSN.IS -0.36\n", "AFYON.IS -0.43\n", "HALKB.IS -1.4\n", "THYAO.IS -1.5\n", "AKSA.IS -1.70033\n", "TMSN.IS -3.14\n", "{'KOZAL.IS': 0.2, 'BJKAS.IS': 0.2, 'ULKER.IS': 0.2, 'FROTO.IS': 0.2, 'PETKM.IS': 0.2}\n", "Before Orders\n", "--------------------\n", "97640.14\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 5.46 0.00 0.00000 \n", "BJKAS.IS 19010.32000 6256 3.47 21708.32 2698.00000 \n", "FROTO.IS 18159.32640 576 30.60 17625.60 -533.72640 \n", "KOZAL.IS 25984.20000 1466 12.73 18662.18 -7322.02000 \n", "PETKM.IS 16510.45591 5156 3.84 19799.04 3288.58409 \n", "TMSN.IS 0.00000 0 7.40 0.00 0.00000 \n", "ULKER.IS 21054.60000 945 21.00 19845.00 -1209.60000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.222330 \n", "FROTO.IS 0.180516 \n", "KOZAL.IS 0.191132 \n", "PETKM.IS 0.202776 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.203246 \n", " \n", "Orders\n", "--------------------\n", " action shares symbol time\n", "0 sell 628 BJKAS.IS 2016-06-30\n", "1 buy 68 KOZAL.IS 2016-06-30\n", "2 buy 62 FROTO.IS 2016-06-30\n", "3 sell 15 ULKER.IS 2016-06-30\n", "4 sell 70 PETKM.IS 2016-06-30\n", " \n", "2762.84\n", "2762.96\n", "After Orders\n", "--------------------\n", " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 5.46 0.00 0.00000 \n", "BJKAS.IS 17145.16000 5628 3.47 19529.16 2384.00000 \n", "FROTO.IS 20056.52640 638 30.60 19522.80 -533.72640 \n", "KOZAL.IS 26849.84000 1534 12.73 19527.82 -7322.02000 \n", "PETKM.IS 16286.48111 5086 3.84 19530.24 3243.75889 \n", "TMSN.IS 0.00000 0 7.40 0.00 0.00000 \n", "ULKER.IS 20720.40000 930 21.00 19530.00 -1190.40000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.200012 \n", "FROTO.IS 0.199947 \n", "KOZAL.IS 0.199998 \n", "PETKM.IS 0.200023 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.200020 \n", "97640.02\n", " \n" ] } ], "source": [ "portfolio, transactions, positions, trades = [], [], [], []\n", "\n", "for t in running_points:\n", " time = t.strftime(\"%Y-%m-%d\")\n", " \n", " if t in pd.date_range(start=running_points[0], periods=12, freq='BM'):\n", " print t\n", " print '-'*20\n", " momentum_values = momentum(prices, t - pd.DateOffset(months=5) - 1*BDay(), t - 1*BDay())\n", " for s in sorted(momentum_values, key=momentum_values.get, reverse=True):\n", " print s, momentum_values[s]\n", " \n", " n = 5 \n", " \n", " if len(portfolio) == 0:\n", " new_weights = {s: 1./n for s in sorted(momentum_values, key=momentum_values.get, reverse=True)[:n]}\n", " print new_weights\n", " target_value = capital_base\n", " rebalance_orders = rebalance(portfolio, new_weights, target_value, time)\n", " else:\n", " potentials = {key:value for key, value in momentum_values.iteritems() if key not in portfolio.index }\n", " new_weights = {}\n", " \n", " for symbol in portfolio.index:\n", " if portfolio[\"market_value\"].loc[symbol]:\n", " if momentum_values[symbol] < 0:\n", " s = sorted(potentials, key=potentials.get, reverse=True)[0]\n", " print symbol + \"out\" + s + \"in\"\n", " new_weights[s] = 1./n\n", " del potentials[s]\n", " else:\n", " new_weights[symbol] = 1./n\n", " \n", " current_performance(portfolio, time)\n", " \n", " print new_weights\n", " rebalance_orders = rebalance(portfolio, new_weights, None, time) \n", " \n", " print \"Before Orders\"\n", " print \"-\"*20\n", " print portfolio[\"market_value\"].sum() if len(portfolio) else 0\n", " print portfolio\n", " print \" \"\n", " \n", " print \"Orders\"\n", " print \"-\"*20\n", " print pd.DataFrame(rebalance_orders)\n", " print \" \"\n", " \n", " print sum([order[\"shares\"]*get_price(order[\"symbol\"], time) for order in rebalance_orders if order[\"action\"]==\"buy\"])\n", " print sum([order[\"shares\"]*get_price(order[\"symbol\"], time) for order in rebalance_orders if order[\"action\"]==\"sell\"])\n", " \n", " execute_orders(rebalance_orders, transactions, positions, trades)\n", " portfolio = calculate_portfolio(positions)\n", " current_performance(portfolio, time)\n", " \n", " print \"After Orders\"\n", " print \"-\"*20 \n", " print portfolio\n", " print portfolio[\"market_value\"].sum()\n", " print \" \"\n", " \n", "portfolio = calculate_portfolio(positions)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": { "collapsed": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ***Transactions*** \n", "----------------------------------------------------------------------\n", " action commision price shares status symbol time\n", "0 buy 1.999944 5.91000 3384 accepted AFYON.IS 2016-01-29\n", "1 buy 1.999852 10.52000 1901 accepted TMSN.IS 2016-01-29\n", "2 buy 1.999998 2.97000 6734 accepted BJKAS.IS 2016-01-29\n", "3 buy 1.998668 31.42560 636 accepted FROTO.IS 2016-01-29\n", "4 buy 1.999775 3.19964 6250 accepted PETKM.IS 2016-01-29\n", "5 buy 0.217074 5.98000 363 accepted AFYON.IS 2016-02-29\n", "6 sell 0.910260 4.68000 1945 accepted BJKAS.IS 2016-02-29\n", "7 buy 0.381420 9.78000 390 accepted TMSN.IS 2016-02-29\n", "8 buy 0.078097 33.95520 23 accepted FROTO.IS 2016-02-29\n", "9 buy 0.229446 3.21803 713 accepted PETKM.IS 2016-02-29\n", "10 sell 0.039494 6.37000 62 accepted AFYON.IS 2016-03-31\n", "11 sell 0.071205 5.05000 141 accepted BJKAS.IS 2016-03-31\n", "12 buy 0.353220 8.70000 406 accepted TMSN.IS 2016-03-31\n", "13 sell 0.032521 36.13460 9 accepted FROTO.IS 2016-03-31\n", "14 sell 0.207274 3.66856 565 accepted PETKM.IS 2016-03-31\n", "15 sell 0.057904 5.17000 112 accepted BJKAS.IS 2016-04-29\n", "16 buy 2.344230 18.30000 1281 accepted KOZAL.IS 2016-04-29\n", "17 sell 0.097760 37.60000 26 accepted FROTO.IS 2016-04-29\n", "18 buy 2.343856 22.28000 1052 accepted ULKER.IS 2016-04-29\n", "19 sell 2.266275 6.15000 3685 accepted AFYON.IS 2016-04-29\n", "20 sell 2.192661 8.13000 2697 accepted TMSN.IS 2016-04-29\n", "21 sell 0.072933 3.77889 193 accepted PETKM.IS 2016-04-29\n", "22 buy 0.553840 3.22000 1720 accepted BJKAS.IS 2016-05-31\n", "23 buy 0.254190 13.74000 185 accepted KOZAL.IS 2016-05-31\n", "24 sell 0.167904 34.98000 48 accepted FROTO.IS 2016-05-31\n", "25 sell 0.228338 21.34000 107 accepted ULKER.IS 2016-05-31\n", "26 sell 0.409908 3.90761 1049 accepted PETKM.IS 2016-05-31\n", "27 sell 0.217916 3.47000 628 accepted BJKAS.IS 2016-06-30\n", "28 buy 0.086564 12.73000 68 accepted KOZAL.IS 2016-06-30\n", "29 buy 0.189720 30.60000 62 accepted FROTO.IS 2016-06-30\n", "30 sell 0.031500 21.00000 15 accepted ULKER.IS 2016-06-30\n", "31 sell 0.026880 3.84000 70 accepted PETKM.IS 2016-06-30\n", "\n", " ***Positions*** \n", "----------------------------------------------------------------------\n", " cost initial_shares price shares symbol time type\n", "0 0.00000 3384 5.91000 0 AFYON.IS 2016-01-29 long\n", "1 0.00000 1901 10.52000 0 TMSN.IS 2016-01-29 long\n", "2 11606.76000 6734 2.97000 3908 BJKAS.IS 2016-01-29 long\n", "3 17378.35680 636 31.42560 553 FROTO.IS 2016-01-29 long\n", "4 13992.02572 6250 3.19964 4373 PETKM.IS 2016-01-29 long\n", "5 0.00000 363 5.98000 0 AFYON.IS 2016-02-29 long\n", "6 0.00000 390 9.78000 0 TMSN.IS 2016-02-29 long\n", "7 780.96960 23 33.95520 23 FROTO.IS 2016-02-29 long\n", "8 2294.45539 713 3.21803 713 PETKM.IS 2016-02-29 long\n", "9 0.00000 406 8.70000 0 TMSN.IS 2016-03-31 long\n", "10 23442.30000 1281 18.30000 1281 KOZAL.IS 2016-04-29 long\n", "11 20720.40000 1052 22.28000 930 ULKER.IS 2016-04-29 long\n", "12 5538.40000 1720 3.22000 1720 BJKAS.IS 2016-05-31 long\n", "13 2541.90000 185 13.74000 185 KOZAL.IS 2016-05-31 long\n", "14 865.64000 68 12.73000 68 KOZAL.IS 2016-06-30 long\n", "15 1897.20000 62 30.60000 62 FROTO.IS 2016-06-30 long\n", "\n", " ***Trades*** \n", "----------------------------------------------------------------------\n", " buy_price profit sell_price shares symbol time\n", "0 2.97000 3325.95000 4.68000 1945 BJKAS.IS 2016-02-29\n", "1 5.91000 28.52000 6.37000 62 AFYON.IS 2016-03-31\n", "2 2.97000 293.28000 5.05000 141 BJKAS.IS 2016-03-31\n", "3 31.42560 42.38100 36.13460 9 FROTO.IS 2016-03-31\n", "4 3.19964 264.93980 3.66856 565 PETKM.IS 2016-03-31\n", "5 2.97000 246.40000 5.17000 112 BJKAS.IS 2016-04-29\n", "6 31.42560 160.53440 37.60000 26 FROTO.IS 2016-04-29\n", "7 5.91000 797.28000 6.15000 3322 AFYON.IS 2016-04-29\n", "8 5.98000 61.71000 6.15000 363 AFYON.IS 2016-04-29\n", "9 10.52000 -4543.39000 8.13000 1901 TMSN.IS 2016-04-29\n", "10 9.78000 -643.50000 8.13000 390 TMSN.IS 2016-04-29\n", "11 8.70000 -231.42000 8.13000 406 TMSN.IS 2016-04-29\n", "12 3.19964 111.79525 3.77889 193 PETKM.IS 2016-04-29\n", "13 31.42560 170.61120 34.98000 48 FROTO.IS 2016-05-31\n", "14 22.28000 -100.58000 21.34000 107 ULKER.IS 2016-05-31\n", "15 3.19964 742.66053 3.90761 1049 PETKM.IS 2016-05-31\n", "16 2.97000 314.00000 3.47000 628 BJKAS.IS 2016-06-30\n", "17 22.28000 -19.20000 21.00000 15 ULKER.IS 2016-06-30\n", "18 3.19964 44.82520 3.84000 70 PETKM.IS 2016-06-30\n" ] } ], "source": [ "summary(transactions, positions, trades)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
costsharescurrent_pricemarket_valueprofitweight
symbol
AFYON.IS0.0000005.140.000.000000.000000
BJKAS.IS17145.1600056283.9021949.204804.040000.222960
FROTO.IS20056.5264063832.3220620.16563.633600.209459
KOZAL.IS26849.84000153410.6316306.42-10543.420000.165641
PETKM.IS16286.4811150863.9420038.843752.358890.203554
TMSN.IS0.0000007.100.000.000000.000000
ULKER.IS20720.4000093021.0019530.00-1190.400000.198386
\n", "
" ], "text/plain": [ " cost shares current_price market_value profit \\\n", "symbol \n", "AFYON.IS 0.00000 0 5.14 0.00 0.00000 \n", "BJKAS.IS 17145.16000 5628 3.90 21949.20 4804.04000 \n", "FROTO.IS 20056.52640 638 32.32 20620.16 563.63360 \n", "KOZAL.IS 26849.84000 1534 10.63 16306.42 -10543.42000 \n", "PETKM.IS 16286.48111 5086 3.94 20038.84 3752.35889 \n", "TMSN.IS 0.00000 0 7.10 0.00 0.00000 \n", "ULKER.IS 20720.40000 930 21.00 19530.00 -1190.40000 \n", "\n", " weight \n", "symbol \n", "AFYON.IS 0.000000 \n", "BJKAS.IS 0.222960 \n", "FROTO.IS 0.209459 \n", "KOZAL.IS 0.165641 \n", "PETKM.IS 0.203554 \n", "TMSN.IS 0.000000 \n", "ULKER.IS 0.198386 " ] }, "execution_count": 57, "metadata": {}, "output_type": "execute_result" } ], "source": [ "current_performance(portfolio, time = '2016-07-18')\n", "portfolio " ] }, { "cell_type": "code", "execution_count": 58, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "98444.62" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "portfolio[\"market_value\"].sum()" ] }, { "cell_type": "code", "execution_count": 59, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
timesymbolpaid_dividend
5642016-04-04FROTO.IS650.00
11462016-06-27PETKM.IS1624.14
\n", "
" ], "text/plain": [ " time symbol paid_dividend\n", "564 2016-04-04 FROTO.IS 650.00\n", "1146 2016-06-27 PETKM.IS 1624.14" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" } ], "source": [ "paid_dividends(transactions, Dividends)" ] }, { "cell_type": "code", "execution_count": 60, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Algorithm performance: 13.1896335214\n", "Benchmark performance: 5.60699416203\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA2wAAAJqCAYAAABXQsP4AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd4VVXa/vHvSiAhkNAhhd57xzYioqJiRWTAAjqOBZ2x\no/50xtEBnRnfcXztvpZRQRB7RbFhQdGBUVoo0kNNQgIklARISLJ/f2xOSDk5JWefltyf6+KCnL3P\nOotEYu7zrPUsY1kWIiIiIiIiEnliwj0BERERERERcU+BTUREREREJEIpsImIiIiIiEQoBTYRERER\nEZEIpcAmIiIiIiISoRTYREREREREIpTXwGaMedUYk2OMWVXD9bHGmHRjzHJjzC/GmFMrXBtjjFln\njNlojLnXyYmLiIiIiIjUdcbbOWzGmNOAAmCWZVkD3FxvYllW4bE/DwDesSyrjzEmFlgPjAYygV+A\nKyzLWuvw30FERERERKRO8lphsyxrIZDv4XphhQ8TgbJjfz4R2GRZ1lbLso4CbwFjA5iriIiIiIhI\nveLIHjZjzCXGmLXAp8C1xx5uB+yocNvOY4+JiIiIiIiIDxwJbJZlfWRZVh/gEuBvTowpIiIiIiJS\n3zVwcjDLshYaY7oaY1piV9Q6VLjc4dhjlRhjPG+iExERERERqeMsyzLuHg+4wmaM6WaMMcf+PBSI\nsywrD1gC9DDGdDbGxAGXAXNrmFylX3/961+rPebkL43v3/hOv14w51/XPvdOjxVN89f4Gj8c49d2\nDpEw9/oyvr63afxoGj+S5x7M74l14fMT6vE98VphM8a8CZwOtDbG7AD+CjQ8FrReBMYDVxtjjgKH\njwUzLMsqMcbcAnwJxAKvWBHSIXLUqFEav46OH81z1/h1f/xgi/bPTzSPH81z1/gaP9JF8+cnmueu\n8cM/vovXtv5Bn4AxVtU5TJs2jWnTpoVnQlKNvh7RSV+3yKOvSeTT1yjy6WsUefQ1iU76ukUWYwxW\nsJZEBkO0vxNU1+jrEZ30dYs8+ppEPn2NIp++RpFHX5PopK9b9IjICpuIiIiIiEh94anC5miXSBER\nERERCb5jPf8kCvlbrFJgExERERGJQlqlFn1qE7Qjcg+biIiIiIiIKLCJiIiIiIhELAU2ERERERGR\nCKXAJiIiIiIiIXHNNdfwwAMPBGXsOXPmcO6559Z4fcGCBXTo0CEorx1MCmwiIiIiIuK4UaNG0bJl\nS4qLi8sfM8YErcPlpEmT+PLLL8s/jomJISMjIyivFUoKbCIiIiIi4qitW7eycOFCYmJimDt3bqVr\nwehuWVpa6vbxutBJU4FNREREREQcNWvWLE455RR+97vf8dprr9V436OPPkpaWhrt27fn5ZdfrlQV\n279/P1dffTVt27alc+fO/P3vfy8PYDNnzuTUU09l6tSptG7dmmnTpjFz5kxOO+00AEaOHAnAoEGD\nSEpK4t133y1/zccff5zk5GTS0tKYOXNm+ePXXHMNf/zjHzn//PNJSkpixIgR5OTkcMcdd9CyZUv6\n9OnDihUrnP5UeaXAJiIiIiIijpo1axaTJ08uX6a4e/fu8muuJZFffPEFTzzxBN988w0bN25kwYIF\nlca49dZbOXjwIFu2bOH7779n1qxZzJgxo/z6zz//TLdu3cjNzeX++++v9NwffvgBgJUrV3Lw4EEm\nTJgAwK5duzhw4ABZWVm88sor3Hzzzezfv7/8ee+++y5///vf2bNnD/Hx8ZxyyikMHz6cvXv38tvf\n/papU6c6+nnyhQKbiIiIiIg45scff2T79u1MnDiRoUOH0q1bN+bMmVPtvnfeeYdrr72WPn36kJCQ\nwPTp08uvlZaW8vbbb/PII4/QpEkTOnXqxF133cXs2bPL70lLS+Pmm28mJiaGRo0a+TS3hg0b8uCD\nDxIbG8t5551HYmIi69evB+wgeemllzJkyBDi4+MZN24cCQkJTJ48GWMMEydOZPny5QF+dvynwCYi\nIiIiUscY48yv2njttdc455xzaNmyJQBXXHFF+bLIinvKsrOzK3VtbN++ffmf9+zZw9GjR+nUqVP5\nYx07diQzM7P849p0fGzVqhUxMccjUOPGjSkoKCj/uG3btuV/btSoUaWPExISKt0bKg1C/ooiIiIi\nIhJU4eq1cfjwYd555x3KyspITU0FoKioiP3797Ny5cpKHSJTU1PZsWNH+ccV/9y6dWsaNmzI1q1b\n6dOnDwDbt2+vFOqC1W0y0qjCJiIiIiIijvjoo49o0KABa9euJT09nfT0dNauXcuIESOYNWsWcLzK\nNnHiRGbMmMG6des4dOgQDz/8cPk4sbGxTJw4kfvvv5+CggK2bdvGE088weTJk32eS3JyMps3b/b5\n/kjtKKnAJiIiIiIijpg1axbXXnst7du3p23btrRt25bk5GRuueUW5syZQ2lpaXllbMyYMdx2222c\nccYZ9OzZk1NOOQWA+Ph4AJ555hmaNGlC165dOe2005g0aRK///3vAffnuVV9bNq0afzud7+jRYsW\nvPfee17PgKt6vabXCDUT7iRpjLHCPQcRERERkWhijInYilBtrV27lgEDBlBcXFxpn1ldUtPX7djj\nbtNg3fxMiIiIiIhIxPvwww8pKioiPz+fe++9l4svvrjOhrXa0mdDRERERETC4qWXXiI5OZnu3bvT\nsGFDnn/++XBPKeJoSaSIiIiISJSpi0si6wMtiRQREREREalDFNhEREREREQilAKbiIiIiIhIhFJg\nExERERERiVAKbCIiIiIiIhFKgU1ERERERKLS1q1biYmJoaysLCyvv2DBAjp06BDU11BgExERERER\nR3Tu3JnGjRuTlJREy5YtufDCC9m5c2e4pxXVFNhERERERMQRxhg+/fRTDh48SHZ2NsnJydx6663h\nnlZQlJSUhOR1FNhERERERMRx8fHxjB8/nl9//RWAoqIi7r77bjp16kRKSgp/+MMfOHLkCGAvLWzf\nvj2PP/44ycnJpKWlMXPmzPKxDh8+zF133UXnzp1p3rw5p512GkVFReXXX3/9dTp16kSbNm34xz/+\nUf74tGnTmDBhAldddRVNmzZl4MCBbNy4kUceeYTk5GQ6duzI/Pnzy++fMWMGffv2pWnTpnTr1o2X\nXnqp/Jprjo8++iipqalcd911GFP5rOunn36afv36kZWV5djnUYFNREREREQcY1kWAIcOHeLtt9/m\nlFNOAeC+++5j06ZNpKens2nTJjIzM3nooYfKn5eTk8OBAwfIysrilVde4eabb2b//v0A3H333Sxf\nvpxFixaRl5fHv/71r0ph6aeffmLDhg188803PPTQQ6xfv7782qeffsrVV19Nfn4+Q4YM4dxzzwUg\nKyuLBx98kBtvvLH83uTkZObNm8eBAweYMWMGd955J8uXL680x/z8fLZv386LL75Y/ncFeOihh5g1\naxY//PADaWlpjn0+TcUXCQdjjBXuOYiIiIiIRBNjDJH4M3Tnzp3Zu3cvDRo0oLCwkLZt2/LFF1/Q\nr18/kpKSWLlyJV27dgVg0aJFTJo0iYyMDBYsWMD5559PQUEBMTF2TSk5OZlPPvmE4cOHk5iYyH//\n+18GDBhQ6fW2bt1K165d2blzZ3lIOumkk7jrrruYOHEi06ZNY9GiRXz55ZcAfPLJJ1x55ZUcOHAA\nYwwHDx6kWbNm7Nu3j6ZNm1b7+4wbN44zzjiD2267jQULFnDuuedy8OBB4uLiALvqNnnyZCZOnMiS\nJUuYN28eSUlJNX5+avq6HXvcuHkKDbx+1kVEREREJKqY6W5/9veb9Vf/QqExho8//pgzzzwTy7L4\n6KOPOP3001mxYgWHDh1i2LBhx8e2rErdHVu1alUe1gAaN25MQUEBe/bs4ciRI3Tr1q3G101JSan2\nPJe2bduW/zkhIYHWrVuXV+cSEhIAKCgooGnTpnz++edMnz6djRs3UlZWxqFDhxg4cGD589u0aVMe\n1lz27dvHyy+/zFtvveUxrNWWApuIiIiISB3jb9AKBmMM48aN48Ybb2Tx4sUkJCTw66+/kpqa6tc4\nrVu3plGjRmzatKlSeHJaUVER48eP5/XXX2fs2LHExsYybty4ShWxqnvWAFq0aMGcOXOYMGECH374\nIb/5zW8cnZf2sImIiIiIiGNcAceyLD7++GP27dtH//79ueGGG7jjjjvYvXs3AJmZmXz11Vdex4uJ\nieHaa69l6tSpZGdnU1payqJFiyguLnZ03sXFxRQXF9O6dWtiYmL4/PPPfZofwMiRI5kzZw6XXnop\nv/zyi6PzUmATERERERHHXHTRRSQlJdGsWTMeeOABXnvtNfr06cM///lPunfvzsknn0yzZs04++yz\n2bBhQ/nz3FWvXB577DEGDBjACSecQKtWrfjTn/5UHgw9Pc8YU+16TR8nJSXx9NNPM3HiRFq2bMmb\nb77J2LFjPT634mOjR4/m1Vdf5aKLLmLFihU1zslfajoiIiIiIhJlIrXpiHhWm6YjqrCJiIiIiIhE\nKAU2ERERERGRCKXAJiIiIiIiEqEU2ERERERERCKUApuIiIiIiEiEUmATERERERGJUApsIiIiIiIi\nEapBuCcgIiIiIiL+83RgtNQdCmwiIiIiIlFGh2bXH1oSKSIiIiIiEqEU2ERERERERCKUApuIiIiI\niEiEUmATERERERGJUApsIiIiIiIiEUqBTUREREREJEIpsImII/buhXXrwj0LERERkbrFa2Azxrxq\njMkxxqyq4fokY0y6MWalMeYnY8zACte2Hnt8uTHmZycnLiKR5d134c9/DvcsREREROoWXypsM4Ax\nHq5nACMtyxoIPAy8VOGaBYyyLGuIZVkn1n6aIhLp8vJgy5Zwz0JERESkbvEa2CzLWgjke7i+yLKs\n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\ngg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "temp = historical_performance(transactions, prices)\n", "compare_with_benchmark(temp)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## IndexCalculation\n", "[TOC](#TableOfContents)\n", "\n", "We can withdraw / deposit money into the portfolio or while rebalancing some amount of free cash can left. In this kind of situations it is hard to calculate the performance of a portfolio. To overcome this situation one way is to calculate an index value and to calculate performance over this index value instead of market value." ] }, { "cell_type": "code", "execution_count": 61, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Date\n", "2016-02-25 113231.4596\n", "2016-02-26 111634.3921\n", "2016-02-29 112051.4147\n", "2016-03-01 113060.0381\n", "2016-03-02 113371.5324\n", "dtype: float64" ] }, "execution_count": 61, "metadata": {}, "output_type": "execute_result" } ], "source": [ "historical_performance(pd.DataFrame(transactions)[0:5].to_dict(\"records\"), prices)[\"2016-02-25\":\"2016-03-02\"]" ] }, { "cell_type": "code", "execution_count": 62, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "Date\n", "2016-02-25 113231.45960\n", "2016-02-26 111634.39210\n", "2016-02-29 112009.17969\n", "2016-03-01 112774.81843\n", "2016-03-02 112975.15510\n", "dtype: float64" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "historical_performance(transactions, prices)[\"2016-02-25\":\"2016-03-02\"]" ] }, { "cell_type": "code", "execution_count": 63, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
symbolAFYON.ISBJKAS.ISFROTO.ISKOZAL.ISPETKM.ISTMSN.ISULKER.IS
time
2016-01-293384.06734.0636.0NaN6250.01901.0NaN
2016-02-29363.01945.023.0NaN713.0390.0NaN
2016-03-3162.0141.09.0NaN565.0406.0NaN
2016-04-293685.0112.026.01281.0193.02697.01052.0
2016-05-31NaN1720.048.0185.01049.0NaN107.0
2016-06-30NaN628.062.068.070.0NaN15.0
\n", "
" ], "text/plain": [ "symbol AFYON.IS BJKAS.IS FROTO.IS KOZAL.IS PETKM.IS TMSN.IS \\\n", "time \n", "2016-01-29 3384.0 6734.0 636.0 NaN 6250.0 1901.0 \n", "2016-02-29 363.0 1945.0 23.0 NaN 713.0 390.0 \n", "2016-03-31 62.0 141.0 9.0 NaN 565.0 406.0 \n", "2016-04-29 3685.0 112.0 26.0 1281.0 193.0 2697.0 \n", "2016-05-31 NaN 1720.0 48.0 185.0 1049.0 NaN \n", "2016-06-30 NaN 628.0 62.0 68.0 70.0 NaN \n", "\n", "symbol ULKER.IS \n", "time \n", "2016-01-29 NaN \n", "2016-02-29 NaN \n", "2016-03-31 NaN \n", "2016-04-29 1052.0 \n", "2016-05-31 107.0 \n", "2016-06-30 15.0 " ] }, "execution_count": 63, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pd.pivot_table(pd.DataFrame(transactions), values=\"shares\", index=\"time\", columns=\"symbol\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## RiskCalculation\n", "[TOC](#TableOfContents)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Value-at-Risk\n", "\n", "The value-at-risk is a measure of how much money can be lost for a period of time. Of course there is a (very small) probability that we can lost **all** our money. We can talk about the distrubition of the money that we can lost. For the value-at-risk we choose a probability say 99% and say that we will not loose money more then $ x $ with probability 99%. \n", "\n", "\n", "There can be different methods to *estimate* the *risk*:\n", "* Historical method:\n", "* The Variance-Covariance Method:\n", "* Simulation:\n", "\n", "\n", "One way of chosing a methods is to test against historical data which is called *backtesting*." ] }, { "cell_type": "code", "execution_count": 64, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from matplotlib.dates import AutoDateLocator\n", "from matplotlib.ticker import MultipleLocator" ] }, { "cell_type": "code", "execution_count": 65, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.072105940035707305" ] }, "execution_count": 65, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\ntfby3fXrknyktfbwDd+z9zAHAAAwgtba7DfEO8mgdi7Jf0vy55L8ryQ/k+TLW2vv2usvBAAAIMkJ\nVh9bax+CcThpAAAEk0lEQVSuqq9L8uNJ7knyXYY0AACAk9v7GTUAAACWcaI3vL5ZVd1bVY9V1eNV\n9WhVnb/F9zyvqn6iqn65qn6pqv72ad4Dd4cpWdl933dX1dWq+sW175FtVdXLq+rdVfWrVfXa23zP\nt+6+/vNV9cK175F+HJeXqvqsqvrpqvrdqvq7W9wj/ZiQl7++O1d+oar+c1V97hb3yfYmZOVLd1l5\nZ1X9bFV9wRb3yfam/N6y+74XV9WHq+qvHvd3nuqgluShJI+11l6Q5O2765s9leQbWmt/LMnnJ/la\nb5R9Jk3JSpK8KUdvqs4ZUlX3JPm2HP23/5wkX37zOVFVX5Lkj7bWPjPJ30zy7avfKF2YkpckH0jy\n9Un+6cq3R2cm5uXXkvyZ1trnJvnmJN+57l3Sg4lZ+fettT/ZWnthkr+R5F+ufJt0YGJWrn/fw0l+\nLMmxLy5y2oPag0ke2X38SJJX3PwNrbUnWmuHu49/K8m7knzqKd8H/Ts2K0nSWvupJB9a66boxkuS\nvKe1dqW19lSS70/ypTd9z0cz1Fp7R5LzVXXfurdJJ47NS2vt/a21n8vRPxZytk3Jy0+31n5zd/mO\nJM9d+R7pw5Ss/PYNl5+Y5CMr3h/9mPJ7S3L0D4Y/mOT9U/7S0x7U7mutXd19fDXJHX9pqqoLSV6Y\no0OQs2VWVjhznpPkvTdcv2/3ueO+xy9TZ9OUvMB1c/PyqiRvW/SO6NWkrFTVK6rqXUn+XY6eVePs\nOTYrVfWcHA1v1zeAjn2hkNmv+lhVjyW5/xZf+gc3XrTW2p3eR62qPjFHE+Wrd8+sMZjTygpn0tQ8\n3Lw2IEdnk//uzDE5L1X1Z3P0i7fe0dk0KSuttbcmeWtVfWGSf5Tkixe9K3o0JSvfkuSh3e+9lQmr\nj7MHtdbabcO3e9GH+1trT1TVA0mevM33fVySH0ryr3fhZkCnkRXOrP+Z5Hk3XD8vR/86dafvee7u\nc5w9U/IC103Ky+4FRN6Y5OWtNSv4Z9Oss6W19lNV9RlVdW9r7YOL3x09mZKVP5Xk+49mtHxKkr9Y\nVU+11n7kdn/paa8+/kiSr9p9/FVJPmYI202Q35XkV1pr33LKP5+7x7FZ4Uz7uSSfWVUXquqZSf5a\njjJzox9J8pVJUlWfn+TaDeu0nC1T8nLdsf+CyfCOzUtVfVqSf5PkK1pr79ngHunDlKz8kd3vtqmq\nFyV5piHtTDo2K621z2itPb+19vwcbRX+rTsNackJ3vD6Nl6f5C1V9aokV5K8Mkmq6lOTvLG19pdy\ntD7wFUl+oareuXvc61prP3bK90LfpmQlVfV9SV6a5JOr6r1JvrG19qZtbpm1tNY+XFVfl+THk9yT\n5Ltaa++qqq/Zff07Wmtvq6ovqar3JPntJF+94S2zoSl5qar7k/xskk9K8pGqenWSz7F6f/ZMyUuS\nb0zy7CTfvvsd/KnW2ku2ume2MTErX5bkK6vqqST/N0e/oHPGTMzKbN7wGgAAoDOnvfoIAADACRnU\nAAAAOmNQAwAA6IxBDQAAoDMGNQAAgM4Y1AAAADpjUAMAAOiMQQ0AAKAz/x95fySE4ch06QAAAABJ\nRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Historical method\n", "returns = historical_performance(transactions, prices).pct_change().dropna()\n", "returns.hist(bins=50, figsize=(15,10))\n", "var_historic = returns.quantile(q = 0.01)\n", "var_historic" ] }, { "cell_type": "code", "execution_count": 66, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.079391854933226536" ] }, "execution_count": 66, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# The Variance-Covariance Method\n", "mu = np.mean(returns)\n", "sigma = np.std(returns)\n", "var_parametric = st.norm.ppf(0.01) * sigma\n", "var_parametric" ] }, { "cell_type": "code", "execution_count": 67, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "-0.09693688460895461" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Monte Carlo Simulation\n", "\n", "samples = np.random.normal(mu, sigma, 100)\n", "var_montecarlo = np.percentile(samples, 0.01)\n", "var_montecarlo" ] }, { "cell_type": "code", "execution_count": 68, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\nfbR/t0WyHt+2Z/eyHs/tH+vz7fzzz09V5fzzz9/xtpb/WGxKtcS/2+b7vex14FizLnK/t79PR97O\nLD/rkbeJR5d15/Vu87RDv29ebhVeM471sV4017E+rsd6+ztnPf7tzKKPxbHe/tFl3crRZ10k/1a3\ntdV6vfh2YKscy1svtnuebvW83Om5u9W05a9jt5+26HN3q6xHe1tHWqdqVc7SU1UPSnJpa+2kDdNe\nnOSRrbUnb1r2fUl+qrX2O/Pf75HkmiR3b61dt2nZttV9nD0wszNA3f7sRbeftv31cni5Zd7Wblsk\n11bLLZp10ds/1qzLfFyP9fZ326Lr2Crk2nm5o1vHjj7H3q3Dy9w2bH/dme2y7va2Z5l/t2VmXdQq\nPBbH83c7ulw739Yi0xa9/UXu93bTFrHbWRf9P6dst9eLo8+xO4/rXu+XrMp+zzKzLvJ/Tn0fapl6\nrGO7c1uzaUnSWtuyGa7SEcIrk+yrqvtvmHZukg9ssewHkzxw03Kf2lwGj2yRd2C2u96xXhdYX8e2\nbWitHb4c722xipb5t7ReLMeoj+Go95vdYX06fquxTV+ZQthauynJ7yV5ZVWdWFUPT/KkJG/aYvE3\nJvn+qvr6mn1u8GVJfv0o/78tdsCO7nrr8O4HsBzbbxuOryDu3nZmNV6E1t0y/5bLXMdWyyLDwpZn\n1NfwUe/38emxnZzG89n6dPxWqVOsTCGce0GSEzIb/nlRkue31q6oqrOq6mBVnZkkrbU/TvKfk/xF\nko8k+R9JfqJP5CmaxsZmZkpZ4fZWZUO/2d4Ui1EKZ9/7uKrr2KK2yr/4fRplHVuEx2LZeuysT/35\nzHTt6x1go/mQz+/eYvo/ZtMJY1pr/yXJf9mjaGvj+DYye/tiY4MIe2eZz7dRnru7fz/t4G9nlHVs\nER4L4HitVCFcDcfzucL1tVovOLv9WK/33/L4eGxgOXZ+Lq3WNhdgUfYTpkgh3OBYX4C9cO+d3X6s\n/S23tzuPzZQ+m+FFjuVYne2MdRpIlrUtWJ1tG0dLIdxVXmxhO3v9wnE8/58XORY3je2+dZppMopr\n2WwLSBTCXeMJBrAK9m5HcPW3+4bbM12rPYrLus+qWmzdVAgBWEtTOonWblv8sTi2+736ZRh2h3Wf\nVbV53Zx9Uf3WFEKAL7FeZYCjM+oO3qj3G2B0CiHABnaKYRHeNAFYFwohu8COAkBfu7cd9qYJ2/P6\n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\nQlWdlOQpSc5prd2c5LKquiTJs5O8dPPyrbVf2vDr1VX1G0ketSdhAQAA1sSqHCE8O8ktrbUPb5h2\neZJzFrz+tyX5wNJTAQAArLHay0Og24aoekSS326tfeWGaT+Q5JmttR2P/FXV9yU5P8kDW2vXbjG/\n/x0EAADoqLW25Qci92TIaFUdSPLIbWZfmuSFSU7dNP2uSQ4e4Xa/K8mrkjxmqzKYbH/HAQAARrcn\nhbC1tn+n+fPPEO6rqvtvGDZ6bnYYBlpVj0vyK0ke31r74LKyAgAAjGIlhowmSVVdnKQleW6SByd5\ne5Jvaa1dscWyj07yliTf2Vq7dE+DAgAArIlVOalMkrwgs6+TuCbJRUmef6gMVtVZVXWwqs6cL/vj\nSU5J8ofz6Qer6h1dUgMAAEzUyhwhBAAAYG+txPcQLltV3THJozP72opTktyQ5INJ/ry1dkvPbIuY\ncv4pZ0/k703+vqacf8rZE/l7k7+fKWdP5O9N/iXlWLcjhFV1bpJLklRm32V4Q2ZnLP3GJLcm+a7W\n2uX9Eu5syvmnnD2Rvzf5+5py/ilnT+TvTf5+ppw9kb83+ZeotbZWlyTvTfIftpn3wiTv7Z1xXfNP\nObv8/S/yyz9idvn7X+SXXX75R8+/jkcIb0pyt9baF7eYd+ck17XWTtz7ZIuZcv4pZ0/k703+vqac\nf8rZE/l7k7+fKWdP5O9N/uVZpbOMLsuHMjtj6Vael+Tv9zDLsZhy/ilnT+TvTf6+ppx/ytkT+XuT\nv58pZ0/k703+JVnHI4QPzGw87pcleX+S65Ocmtl43H/JbDzu+/ol3NmU8085eyJ/b/L3NeX8U86e\nyN+b/P1MOXsif2/yLzHLuhXCJKmqOyXZn9kZe05OcmNmZ+w50Fr7QsdoC5ly/ilnT+TvTf6+ppx/\nytkT+XuTv58pZ0/k703+JeVYx0IIAADAka3r9xA+Nsm/y23f6XEwyQeSXNha+5OO0RYy5fxTzp7I\n35v8fU05/5SzJ/L3Jn8/U86eyN+b/EvKsW5HCKvqR5O8JMmvZDYe99B3epyb5LlJfqa19nP9Eu5s\nyvmnnD2Rvzf5+5py/ilnT+TvTf5+ppw9kb83+ZfoeL6zYhUvST6R5Ou2mff1ST7ZO+O65p9ydvn7\nX+SXf8Ts8ve/yC+7/PKPnn8dv3bixMwe4K18IskJe5jlWEw5/5SzJ/L3Jn9fU84/5eyJ/L3J38+U\nsyfy9yb/kqxjIfzdJG+rqm+vqi+vqjtV1T2q6tuT/H6S3+mc70imnH/K2RP5e5O/rynnn3L2RP7e\n5O9nytkT+XuTf1l6Hy7dhcOvd07yn5J8PMmtGy4fn0+/U++M65p/ytnl73+RX/4Rs8vf/yK/7PLL\nP3r+tTupzEZVdVrm3+nRWruud56jNeX8U86eyN+b/H1NOf+Usyfy9yZ/P1POnsjfm/zH+f+vcyEE\nAABge+v4GcLDquoPtpj2zh5ZjsWU8085eyJ/b/L3NeX8U86eyN+b/P1MOXsif2/yH5+1LoRJLtti\n2qV7nuLYTTn/lLMn8vcmf19Tzj/l7In8vcnfz5SzJ/L3Jv9xMGQUAABgUPt6B9gtVXVSkrOTnJLk\nYJIrW2s39U21uCnnn3L2RP7e5O9ryvmnnD2Rvzf5+5ly9kT+3uRfgt6nXN2FU7ieluTiJP+c5IYk\nH5s/uP+c5DeT3K13xnXNP+Xs8ve/yC//iNnl73+RX3b55R89/zp+hvC/ZvYdHl/fWju1tXZma+2U\nJA+Yz//1ftEWMuX8U86eyN+b/H1NOf+Usyfy9yZ/P1POnsjfm/xLsnafIayqG5Pcs21xqHV+SPZT\nrbWT9z7ZYqacf8rZE/l7k7+vKeefcvZE/t7k72fK2RP5e5N/edbxCOFnkzxom3kPms9fZVPOP+Xs\nify9yd/XlPNPOXsif2/y9zPl7In8vcm/JOt4UpmXJnlnVb0tyeVJrk9y1yTnJnlSkud3zLaIKeef\ncvZE/t7k72vK+aecPZG/N/n7mXL2RP7e5F+StRsymiRVdU6S85Kck+SkJDcm+WCS32it/X3PbIuY\ncv4pZ0/k703+vqacf8rZE/l7k7+fKWdP5O9N/iXlWMdCCAAAwJGt45DRVNU9kjw1s7Z9cmancP1g\nkt9tra36eOJJ559y9kT+3uTva8r5p5w9kb83+fuZcvZE/t7kX461O6lMVT0myX9P8sz5pE8k+bIk\nz07y4ap6dK9si5hy/ilnT+TvTf6+ppx/ytkT+XuTv58pZ0/k703+JWor8MWMy7wkuSLJU7aZ95Qk\nV/TOuK75p5xd/v4X+eUfMbv8/S/yyy6//KPnX7vPEFbVTUlOb6398xbz7pLk2tbaiXufbDFTzj/l\n7In8vcnf15TzTzl7In9v8vcz5eyJ/L3JvzxrN2Q0yd8k+en5FzoeVlUnJ/nJJH/dJdXippx/ytkT\n+XuTv68p559y9kT+3uTvZ8rZE/l7k39J1vEI4X2TXJzZFzr+z8y+0+PUJF+T5H1Jnt5au6pXviOZ\ncv4pZ0/k703+vqacf8rZE/l7k7+fKWdP5O9N/iVmWbdCeEhVnZ3bzthzY5IPttau7JtqcVPOP+Xs\nify9yd/XlPNPOXsif2/y9zPl7In8vcm/hAzrWggBAADY2Tp+hvCwqnrJFtN+rEeWYzHl/FPOnsjf\nm/x9TTn/lLMn8vcmfz9Tzp7I35v8x2etC2GSR2wx7ZF7nuLYTTn/lLMn8vcmf19Tzj/l7In8vcnf\nz5SzJ/L3Jv9xMGQUAABgUOt+hBAAAIBtrGUhrKrnVdW7q+qGqrp1/u+7quoHe2dbxJTzTzl7In9v\n8vc15fxTzp7I35v8/Uw5eyJ/b/Ivx769/M/2QlW9OsmTklyQ5P1Jbkhy1yTnJnlRVX1Na21lP2Q6\n5fxTzp7I35v8fU05/5SzJ/L3Jn8/U86eyN+b/EvMsm6fIayqzyT5xtba1VvMu3eS97fW7r73yRYz\n5fxTzp7I35v8fU05/5SzJ/L3Jn8/U86eyN+b/MuzlkNGdzD19jvl/FPOnsjfm/x9TTn/lLMn8vcm\nfz9Tzp7I35v8R2Hthowm+bUkf15VFyS5PMn1SU5N8sAkL0ry+o7ZFjHl/FPOnsjfm/x9TTn/lLMn\n8vcmfz9Tzp7I35v8y9JaW7tLkucleVeSf0pyy/zfy5I8r3e2dc8/5ezy97/IL/+I2eXvf5Ffdvnl\nHzn/2n2GEAAAgMWs45DRJElVnZ3knCSnJDmY5IOttSv7plrclPNPOXsif2/y9zXl/FPOnsjfm/z9\nTDl7In9v8i8hw7odIayqs5K8ObNTtn44t53C9X5J3pfk6a21f+yXcGdTzj/l7In8vcnf15TzTzl7\nIn9v8vcz5eyJ/L3JvzzreJbRC5P8VZJ7tNa+sbX28Nba/5rky5NcOp+/yi7MdPNfmOlmT+Tv7cLI\n39OFmW7+CzPd7In8vV0Y+Xu5MNPNnsjf24WRfynW8QjhTUlOa619YYt5d0lybWvtxL1Ptpgp559y\n9kT+3uTva8r5p5w9kb83+fuZcvZE/t7kX551PEL40SRP2mbe45NctYdZjsWU8085eyJ/b/L3NeX8\nU86eyN+b/P1MOXsif2/yL8k6HiF8TJLfTfKBzL7T44bMvtPj3CTfkOSprbU/65dwZ1POP+Xsify9\nyd/XlPNPOXsif2/y9zPl7In8vcm/xCzrVgiTpKrukeQpmZ2x56QkNyb5YJK3ttY+0zPbIqacf8rZ\nE/l7k7+vKeefcvZE/t7k72fK2RP5e5N/STnWsRACAABwZOv4GUIAAAAWoBACAAAMSiEEAAAYlELI\nrquq6p0BAID1Z7/z6K1lIayqb6mqF1XVd2wx78d6ZDoaVfXdVfXiqrpXVZ1cVa+pqt+vqv+9d7Zj\n9PGqOqN3iCPZvAGpqodV1QXzyyN75VpUVZ0yX1f+qKpeWFV3rKo3V9XBqrq0qu7XO+ORVNX+qnpj\nVf1tVV1RVX9aVT9dVXfvnW0RVfXYqrq4qt5fVf8w//c3t9oWTcl8XfqvvXPsZMrb/TXY9vybqvqa\n+c+nVdVFVXXt/PKGqrpr74w7qaq3VdWzquqE3lmOxdS3/Wuw3Z/stidZy33OxH7n0WdZt7OMVtWz\nk7w2yV8l+aYk70vytNbajfP5B1trp3SMuKOqemmS85LcmuTEJBcl+VySOyZ5QZL/u7X26n4Jt1dV\nf5WkJdn8zsxDk/y3JF9ora3szk1V3dBaO3X+81OSXJjkN+azz0vy3Nbab3eKd0RVdVGSeyb5/SRP\nTfLFJP8zyS8n+cEk922tPb5fwp1V1fOSvCrJ72T2ZtVTMlv/vzzJv07y2Nba3/ZLuLOq+tEkL0ny\nK0nen9n3Cd01s+8Tem6Sn2mt/Vy/hMeuqu6c5HOttZV8E3ENtvtT3/Z8NMk3ttauq6o3JTkhs+dy\nkvxYZuvOc7oFPIKq+mJmXxB9j8y2Pxe21v7fvqkWN+Vt/xps96e+7ZnsPmdiv3OpWdawEF6R5Dmt\ntb+Zv9v3S0kekOQ75i9Wq/7k/EiSh2W2cn80yYNba++bz3tokje11v6Xfgm3V1WfTvL3SX5906yf\nS/LyJNe31t6w58EWtHHdqKr3JnlZa+0P579/R2Y79A/qmXEn88f/fq21G6rqtCSfSXJqa+2m+XPh\nY621lX3Hdb5T+YTW2vvnvz84yetaa99SVc9K8oMrvmH/RJJHtdY+tMW8r0/yF621r9j7ZIupqr/Y\nYfYdkjxihQvh1Lf7U9/23JjZtubWqro6yde21m6azzsxyUdaayv7bv2hx7+qvi3JczIrVZ9N8sYk\nb2it/UPXgEcw5W3/Gmz3p77t+Ugmus+Z2O9capY1LISH2/aGaT+b5LGZvdv04RV/cl7fWrvr/Ofb\nbUjmh5ZvWNX8VXV6kp/J7Ms1/31r7b/Np38iybmttWt65juSTU/Mzyb58tbarfPf75DkukN/m1VU\nVZ/J7J3gG6vqbpnt0JzcWvtcVd0ls52Ce/RNub35Y35Ga+1f5r/fOclHW2tnVNWdklzbWju5a8gd\nVNX1Sc5qrV2/xby7Jblqxdefm5K8OsknNs1qmb1b/AsrXAinvt2f+rbnb5O8tLX2x1X1/iRPaa19\neD7vq5P89RQK4YbfT8zsSNVzkuxP8q7W2rd1indEU972r8F2f+rbnsnucyb2O5dp3178J3vsk1V1\ndmvtykMTWmv/Z1XdnNkh/VW/z9dX1cnz4QY/vWneXZN8oUOmhbTWrk3yA1X1sCSvr6r3JPnxzrGO\nxp2q6pW5bejBXZNcN//5xMx2jFfZnyX5nar6/SRPSvLnSX62qn45yQ8keVfPcAu4NLO8r8rsb/Cy\nJH89n3fnJDf3Crag303ytqr6ySSXJ7k+yalJHpjZ8+B3OmZbxOVJrmitfUnO+U7lL+x9pIVNfbs/\n9W3PS5L8RlX9UmbDFv+kqg69Y/+9We1150u01m7ObOjcRVV1ZpJnd450JFPe9k99uz/1bc9k9zkT\n+53LtJLv9h6ntyV55uaJrbWfyOyQ8p33PNHR+a0k906SLcZtf0+Sv9nzREeptfauzMZvfzjJ/5fk\nbn0TLeziJF+V5MzM1qP7bpj3uMw+F7bKfiizz408ObMdsOdkVkbeleQbkrywX7SFvCDJg5Jck+RT\n85///XzevfOlL1ar5ocye6zfkFn+z2d2X96Q5N3z+avs53LbC9FmX0jyfXuY5WhNfbs/6W1Pa+1P\nkzwqyddm9rmXM5P8H5kdIfnJ1tr5/dIt5B+3m9Fa+1hr7T/tZZhjMOVt/9S3+1Pf9kx+nzOx37kM\nazdkdJ3ND9+nTeiPVlX3yuxJ+s7W2kq/08RqqKqTM9s2Heyd5VjNP8dzcpIbW2vblSwAsh7b/XUz\n3+esQ0MYp8J+57FZ20JYVSclOTvJKUkOJrny0Ifcp2DK+aecPZG/t6nnBwCYkv+/vbsLse0sDzj+\nf5qTeDTJ0bQRpdicTZuIMWlTLwShta0Gi00bxQRBA4JtelGE3hQUCoVApaQXQhBactdMP2LqhbS2\nVqTV1o8IGijGjyhGiU2CtUntOWliEqNpnl7sPWaczDmzZ+818+xnrf8PFsze72T2n00gvHnftd7R\n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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = returns.plot(kind='bar', title =\"V comp\",figsize=(15,10),legend=True, fontsize=12)\n", "ax.set_xlabel(\"Hour\",fontsize=12)\n", "AutoDateLocator()\n", "loc = MultipleLocator(base=10.0)\n", "ax.xaxis.set_major_locator(loc)\n", "ax.set_ylabel(\"V\",fontsize=12)\n", "plt.axhline(y=var_historic, color='r', linestyle='-')\n", "plt.axhline(y=var_parametric, color='r', linestyle='-')\n", "plt.axhline(y=var_montecarlo, color='r', linestyle='-')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Stress Testing" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Risk Profile\n", "\n", "The risk profile is a way of categorizing portfolios according their risk. Risk profile of a portfolio depends on its *yearly volatility*. The yearly volatily is calculated by multiplying the standard deviation of weekly returns by square root of 52 (number of weeks in a year).\n", "\n", "Cutoff points for yearly volatility is: [0, 0.5, 2, 5, 10, 15, 25]" ] }, { "cell_type": "code", "execution_count": 69, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 69, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nrqp6xx2qF11k04GbNClsHfi226w2t2FD1ft//NH+UYPEdsMNdgqrqnr++fYPERaTJ1sNsWVL+xsc\ndpjq4MHW2Tx+vOqSJdUr6a9fr9qjR+rXeO1am2L/6qvZP/6KFart26v++9/Z37cf48ap9uvn7zk9\ne6pOm5abePLtiCOs4VJa6m37AQO8f0g1aaK6erX/mFautJJRjUjuK1eqNm2qOmqU/zditlVWql5y\niY0AiF2bZeRIG2URxMcfW8KZPdvecGvXBttfrqxcqfrRR6qPP2611L59VVu1shE/hx5qowqy4eWX\n7YM922vgbN1q76MhQ9J/IE2dah9obm02G7ZtU+3TR/Wmm7K3z0wtWmSd515VVtqggTVrchZSXk2a\nZH0IXg0ZovrYY+m3q6xUrV1btazMf0xlZaq1atWQ5K5qL2rz5ttbtoW0bZudyg0evD05nHmmlW2C\nKCuzDtTiYtW77gocZt6tWqX61FNW6ti8Odi+Vq60D7g+fVQPPlh1zpyshKgVFVZWOO007wtT3X23\ndS5n8o+ayFVXWQsw2wtjZaKiwoY1em1I/PyzfdjVVLffrnrjjem3Ky1V3WmnzI/TpEnq5F4tFw5L\n5s9/tk6GfHemJlK3ri1w9OWXtq56RYWtXx10MkadOraP2bNtfZ3qZtddbVnh7t3tYhNB3HTT9osb\nX3wxcOSRthBV0CUSrrvOpp6/8IL3hamuvdZmGg4fHuzYgK1JPmGCdTBme2GsTNSqZZ2jqQYKxPIy\nMzXKvE5kynR2qqt58zQbJMv6+f5CFlruqtYy3rgxK7vKimXLrIP1iitsbHQ2TJ0ajqFiQSxaZGdZ\nixZl9vzp062jK7Y1OW+eau/eqscd52/Z1Vj33qu6336Z1UGXL7eYPvggs2Orbp+8U6gBAcmcc473\ns84nnrAz1ppq4kTVY45Jv93ChcmXRPbioINqUMsdAC68MLcXMPCrdWtbPvTFF/0vOZDMIYeEY6hY\nEB062JnW1Vf7f25lJXDllXa1qSZNtt/fqZMNWTvqKJsePnast/2tXGmt5HPOsSWT333XVt3zq1Ur\nuwTkBRfY5Qz9WrbMhtKOGmXDD8Oka1fvwyHZcvfWcs90GKQr3Xs0csk9jDp3tnUyki02VFNdd50t\nyjZ+vL/njR5tZa/zz9/xsTp1bPG0ceOAW2+1BaDil0YtL7cFqf76V1vOeJ99gNdes/X1Z8yw1Qoz\n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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "historical_performance(transactions, prices).pct_change().resample(\"W-MON\", label=\"left\" ,closed=\"left\").sum().plot()" ] }, { "cell_type": "code", "execution_count": 70, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 70, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nAABJRU5ErkJggg==\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "historical_performance(transactions, prices).pct_change().resample(\"W-MON\", label=\"left\" ,closed=\"left\").sum().cumsum().plot()" ] }, { "cell_type": "code", "execution_count": 71, "metadata": { "collapsed": false }, "outputs": [], "source": [ "def calculate_risk_value(historical_prices):\n", " return np.std((historical_prices.pct_change() + 1).resample(\"W-MON\", label=\"left\" ,closed=\"left\").prod() - 1) * sqrt(52)\n", "\n", "risk_value = calculate_risk_value(historical_performance(transactions, prices)) * 100" ] }, { "cell_type": "code", "execution_count": 72, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "7" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from bisect import bisect\n", "RiskLevels = [0, 0.5, 2, 5, 10, 15, 25]\n", "bisect(RiskLevels, risk_value)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Visualization\n", "[TOC](#TableOfContents)" ] }, { "cell_type": "code", "execution_count": 73, "metadata": { "collapsed": false }, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#sparkline\n", "historical_prices = historical_performance(transactions, prices)\n", "weekly_returns = ((historical_prices.pct_change() + 1).resample(\"W-MON\", label=\"left\" ,closed=\"left\").prod() - 1)\n", "plt.plot(weekly_returns)\n", "plt.axis(\"off\");\n", "plt.savefig(\"trend.png\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## ToDo\n", "[TOC](#TableOfContents)\n", "\n", "###### Overview\n", "\n", "- Order lifecycle\n", "- Transaction and position\n", "- Strategies: Technical vs Fundemantal\n", "- Trading algorithms from interactive brokers\n", "\n", "###### Dividend and Split\n", "- Implied transactions\n", "\n", "###### Portfolio Calculation\n", "\n", "- plot stock prices annotated by dividend and splits\n", "- compute dividend and split automatically: \n", " + get close prices (not adjusted)\n", " + create split and dividend transactions?\n", " + calculate event-adjusted share count\n", " + calculate paid dividend\n", "\n", "###### Algorithm\n", "\n", "- blacklist for algorithms\n", "- parameter search\n", "\n", "###### Index Calculation\n", "- Overview\n", "- index normalization\n", "\n", "###### Risk Calculation\n", "- Value at Risk\n", "\n", "###### Misc\n", "- styling" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.10" } }, "nbformat": 4, "nbformat_minor": 0 }