{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Installing packages\n", "\n", "When installing the version of Pandas needed for this exercise, please ignore the **incompatibility ERROR** that may appear for the packages visions and pandas-profiling. These are not needed.\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Collecting pandas==0.24.1\n", " Using cached pandas-0.24.1-cp37-cp37m-manylinux1_x86_64.whl (10.1 MB)\n", "Requirement already satisfied: python-dateutil>=2.5.0 in /home/jupyter/.local/lib/python3.7/site-packages (from pandas==0.24.1) (2.8.1)\n", "Requirement already satisfied: numpy>=1.12.0 in /home/jupyter/.local/lib/python3.7/site-packages (from pandas==0.24.1) (1.18.4)\n", "Requirement already satisfied: pytz>=2011k in /home/jupyter/.local/lib/python3.7/site-packages (from pandas==0.24.1) (2020.1)\n", "Requirement already satisfied: six>=1.5 in /home/jupyter/.local/lib/python3.7/site-packages (from python-dateutil>=2.5.0->pandas==0.24.1) (1.15.0)\n", "\u001b[31mERROR: visions 0.4.4 has requirement pandas>=0.25.3, but you'll have pandas 0.24.1 which is incompatible.\u001b[0m\n", "\u001b[31mERROR: pandas-profiling 2.6.0 has requirement pandas>=0.25.3, but you'll have pandas 0.24.1 which is incompatible.\u001b[0m\n", "Installing collected packages: pandas\n", "Successfully installed pandas-0.24.1\n", "Note: you may need to restart the kernel to use updated packages.\n" ] } ], "source": [ "%pip install pandas==0.24.1 --user\n", "%pip install plotly\n", "%pip install tensorboardX --user\n", "%pip install bs4 --user\n", "%pip install -U auquan_toolbox --user" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "WsNIiolz3r9C" }, "source": [ "### This notebook shows how [Auquan Toolbox](https://github.com/Auquan/Tutorials/blob/master/momentum_backtest_losing_money.ipynb) can be used to trade on momentum and mean reversion\n", "\n", "Documentation on how to use the toolbox can be found [here](https://github.com/Auquan/auquan-toolbox-python#3-backtesting). " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Note**: When running the cell below, if you get a module not found error for the backtester library, please restart the Kernel for the package update to be detected." ] }, { "cell_type": "code", "execution_count": 10, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 381 }, "colab_type": "code", "id": "IjSoh14b3r9G", "outputId": "e8afb1bc-8564-47ff-a067-f5970d7fa3d3" }, "outputs": [], "source": [ "from backtester.trading_system_parameters import TradingSystemParameters\n", "from backtester.features.feature import Feature\n", "from backtester.dataSource.yahoo_data_source import YahooStockDataSource\n", "from backtester.timeRule.custom_time_rule import CustomTimeRule\n", "from backtester.executionSystem.simple_execution_system import SimpleExecutionSystem\n", "from backtester.orderPlacer.backtesting_order_placer import BacktestingOrderPlacer\n", "from backtester.trading_system import TradingSystem\n", "from backtester.constants import *\n", "\n", "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import datetime\n", "from datetime import timedelta" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "yaqazil43r9P" }, "source": [ "### This is the static part of an experiment\n", "\n", "It is similar to writing a data loader and trainer for a deep learning project. Once written for a particular experiment we hardly need to change it." ] }, { "cell_type": "code", "execution_count": 11, "metadata": { "colab": {}, "colab_type": "code", "id": "YBS5-alV3r9S" }, "outputs": [], "source": [ "class MyTradingParams(TradingSystemParameters):\n", "\n", " def __init__(self, tradingFunctions):\n", " self.__tradingFunctions = tradingFunctions\n", " super(MyTradingParams, self).__init__()\n", " self.__dataSetId = 'equity_data'\n", " self.__instrumentIds = self.__tradingFunctions.getSymbolsToTrade()\n", " self.__startDate = '2015/01/02'\n", " self.__endDate = '2017/08/31'\n", "\n", " def getDataParser(self):\n", " '''\n", " Returns an instance of class DataParser. Source of data for instruments\n", " '''\n", " instrumentIds = self.__tradingFunctions.getSymbolsToTrade()\n", " return YahooStockDataSource(\n", " cachedFolderName = 'historicalData/',\n", " dataSetId = self.__dataSetId,\n", " instrumentIds = instrumentIds,\n", " startDateStr = self.__startDate,\n", " endDateStr = self.__endDate,\n", " )\n", " \n", " def getTimeRuleForUpdates(self):\n", " return CustomTimeRule(\n", " startDate = self.__startDate, \n", " endDate = self.__endDate, \n", " frequency = 'D', \n", " sample = '30'\n", " )\n", "\n", " def getFrequencyOfFeatureUpdates(self):\n", " return timedelta(days = 1)\n", "\n", " def getStartingCapital(self):\n", " if len(self.__tradingFunctions.getSymbolsToTrade()) > 0:\n", " return 1000*len(self.__tradingFunctions.getSymbolsToTrade())\n", " else:\n", " return 30000\n", "\n", " def getCustomFeatures(self):\n", " '''\n", " This is a way to use any custom features you might have made.\n", " Returns a dictionary where:\n", " \n", " key: featureId to access this feature (Make sure this doesnt conflict with any of the pre defined feature Ids)\n", " value: Your custom Class which computes this feature. The class should be an instance of Feature\n", " \n", " Eg. if your custom class is MyCustomFeature, and you want to access this via featureId='my_custom_feature',\n", " you will import that class, and return this function as {'my_custom_feature': MyCustomFeature}\n", " '''\n", " return {\n", " 'my_custom_feature': MyCustomFeature,\n", " 'prediction': TrainingPredictionFeature,\n", " 'zero_fees': FeesCalculator,\n", " 'benchmark_PnL': BuyHoldPnL,\n", " 'score': ScoreFeature\n", " }\n", "\n", " def getInstrumentFeatureConfigDicts(self):\n", " '''\n", " Returns an array of instrument feature config dictionaries instrument feature config Dictionary has the \n", " following keys:\n", " \n", " featureId: a string representing the type of feature you want to use\n", " featureKey: a string representing the key you will use to access the value of this feature\n", " params: A dictionary with which contains other optional params if needed by the feature\n", " '''\n", "\n", " predictionDict = {\n", " 'featureKey': 'prediction',\n", " 'featureId': 'prediction',\n", " 'params': {}\n", " }\n", " feesConfigDict = {\n", " 'featureKey': 'fees',\n", " 'featureId': 'zero_fees',\n", " 'params': {}\n", " }\n", " profitlossConfigDict = {\n", " 'featureKey': 'pnl',\n", " 'featureId': 'pnl',\n", " 'params': {\n", " 'price': self.getPriceFeatureKey(),\n", " 'fees': 'fees'\n", " }\n", " }\n", " capitalConfigDict = {\n", " 'featureKey': 'capital',\n", " 'featureId': 'capital',\n", " 'params': {\n", " 'price': 'adjClose',\n", " 'fees': 'fees',\n", " 'capitalReqPercent': 0.95\n", " }\n", " }\n", " benchmarkDict = {\n", " 'featureKey': 'benchmark',\n", " 'featureId': 'benchmark_PnL',\n", " 'params': {'pnlKey': 'pnl'}\n", " }\n", " scoreDict = {\n", " 'featureKey': 'score',\n", " 'featureId': 'score',\n", " 'params': {\n", " 'featureName1': 'pnl',\n", " 'featureName2':'benchmark'\n", " }\n", " }\n", "\n", " stockFeatureConfigs = self.__tradingFunctions.getInstrumentFeatureConfigDicts()\n", "\n", " return {\n", " INSTRUMENT_TYPE_STOCK: stockFeatureConfigs + [\n", " predictionDict,\n", " feesConfigDict,\n", " profitlossConfigDict,\n", " capitalConfigDict,\n", " benchmarkDict, \n", " scoreDict\n", " ]\n", " }\n", "\n", " def getMarketFeatureConfigDicts(self):\n", " '''\n", " Returns an array of market feature config dictionaries having the following keys:\n", " \n", " featureId: a string representing the type of feature you want to use\n", " featureKey: a string representing the key you will use to access the value of this feature\n", " params: A dictionary with which contains other optional params if needed by the feature\n", " '''\n", " scoreDict = {\n", " 'featureKey': 'score',\n", " 'featureId': 'score_ll',\n", " 'params': {\n", " 'featureName': self.getPriceFeatureKey(),\n", " 'instrument_score_feature': 'score'\n", " }\n", " }\n", " \n", " return [scoreDict]\n", "\n", " def getPrediction(self, time, updateNum, instrumentManager):\n", " predictions = pd.Series(index = self.__instrumentIds)\n", " predictions = self.__tradingFunctions.getPrediction(time, updateNum, instrumentManager, predictions)\n", " \n", " return predictions\n", "\n", " def getExecutionSystem(self):\n", " '''\n", " Returns the type of execution system we want to use. Its an implementation of the class ExecutionSystem\n", " It converts prediction to intended positions for different instruments.\n", " '''\n", " \n", " return SimpleExecutionSystem(\n", " enter_threshold = 0.7,\n", " exit_threshold = 0.55,\n", " longLimit = 1,\n", " shortLimit = 1,\n", " capitalUsageLimit = 0.10*self.getStartingCapital(),\n", " enterlotSize = 1, \n", " exitlotSize = 1,\n", " limitType = 'L', \n", " price = 'adjClose'\n", " )\n", "\n", " def getOrderPlacer(self):\n", " '''\n", " Returns the type of order placer we want to use. It's an implementation of the class OrderPlacer.\n", " It helps place an order, and also read confirmations of orders being placed.\n", " For Backtesting, you can just use the BacktestingOrderPlacer, which places the order which you want, and \n", " automatically confirms it too.\n", " '''\n", " \n", " return BacktestingOrderPlacer()\n", "\n", " def getLookbackSize(self):\n", " '''\n", " Returns the amount of lookback data you want for your calculations. The historical market features and instrument features are only\n", " stored upto this amount.\n", " This number is the number of times we have updated our features.\n", " '''\n", " \n", " return 120\n", "\n", " def getPriceFeatureKey(self):\n", " '''\n", " The name of column containing the instrument price\n", " '''\n", " \n", " return 'adjClose'\n", "\n", " def getInstrumentsIds(self):\n", " '''\n", " Get all instrument ids\n", " '''\n", " \n", " return self.__instrumentIds" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Hkb02Y1i3r9b" }, "source": [ "### Let's define some of our own features" ] }, { "cell_type": "code", "execution_count": 12, "metadata": { "colab": {}, "colab_type": "code", "id": "8EmCAvit3r9e" }, "outputs": [], "source": [ "class TrainingPredictionFeature(Feature):\n", " \n", " @classmethod\n", " def computeForInstrument(cls, updateNum, time, featureParams, featureKey, instrumentManager):\n", " tf = MyTradingFunctions()\n", " t = MyTradingParams(tf)\n", " \n", " return t.getPrediction(time, updateNum, instrumentManager)\n", "\n", "class FeesCalculator(Feature):\n", " @classmethod\n", " def computeForInstrument(cls, updateNum, time, featureParams, featureKey, instrumentManager):\n", " \n", " return pd.Series(0, index = instrumentManager.getAllInstrumentsByInstrumentId())\n", "\n", "class BuyHoldPnL(Feature):\n", " \n", " @classmethod\n", " def computeForInstrument(cls, updateNum, time, featureParams, featureKey, instrumentManager):\n", " instrumentLookbackData = instrumentManager.getLookbackInstrumentFeatures()\n", "\n", " priceData = instrumentLookbackData.getFeatureDf('adjClose')\n", " \n", " if len(priceData) < 2:\n", " return pd.Series(0, index = instrumentManager.getAllInstrumentsByInstrumentId())\n", " else:\n", " bhpnl = instrumentLookbackData.getFeatureDf(featureKey).iloc[-1]\n", " bhpnl += priceData.iloc[-1] - priceData.iloc[-2]\n", "\n", " return bhpnl\n", "\n", "class ScoreFeature(Feature):\n", " \n", " @classmethod\n", " def computeForInstrument(cls, updateNum, time, featureParams, featureKey, instrumentManager):\n", " instrumentLookbackData = instrumentManager.getLookbackInstrumentFeatures()\n", " if len(instrumentLookbackData.getFeatureDf(featureParams['featureName1'])) > 0:\n", " feature1 = instrumentLookbackData.getFeatureDf(featureParams['featureName1']).iloc[-1]\n", " feature2 = instrumentLookbackData.getFeatureDf(featureParams['featureName2']).iloc[-1]\n", " \n", " for instrumentId in feature1.index:\n", " pnls = instrumentLookbackData.getFeatureDf('pnl')[instrumentId]\n", " positions = instrumentLookbackData.getFeatureDf('position')[instrumentId]\n", " \n", " print(instrumentId)\n", " print('pnl: %.2f'%pnls[-1])\n", " if len(positions) > 2 and np.abs(positions[-1] - positions[-2]) > 0:\n", " print('Position changed to: %.2f'%positions[-1])\n", " \n", " toRtn = (feature1 - feature2) / feature2.abs()\n", " toRtn[toRtn.isnull()] = 0\n", " toRtn[toRtn == np.Inf] = 0\n", " else:\n", " toRtn=0\n", "\n", " return toRtn" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "_YeUN2jV3r9m" }, "source": [ "### This is the part where the magic takes place, all the logic for prediction and carrying out trades goes here" ] }, { "cell_type": "code", "execution_count": 13, "metadata": { "colab": {}, "colab_type": "code", "id": "TmmI1xdA3r9o" }, "outputs": [], "source": [ "class MyTradingFunctions():\n", "\n", " def __init__(self):\n", " self.count = 0\n", " self.params = {}\n", "\n", " def getSymbolsToTrade(self):\n", " '''\n", " Specify the stock names that you want to trade.\n", " '''\n", " \n", " return ['AAPL']\n", "\n", " def getInstrumentFeatureConfigDicts(self):\n", " '''\n", " Specify all Features you want to use by creating config dictionaries.\n", " Create one dictionary per feature and return them in an array.\n", "\n", " Feature config Dictionary have the following keys:\n", "\n", " featureId: a str for the type of feature you want to use\n", " featureKey: {optional} a str for the key you will use to call this feature\n", " If not present, will just use featureId\n", " params: {optional} A dictionary with which contains other optional params if needed by the feature\n", "\n", " msDict = {\n", " 'featureKey': 'ms_5',\n", " 'featureId': 'moving_sum',\n", " 'params': {\n", " 'period': 5,\n", " 'featureName': 'basis'\n", " }\n", " }\n", "\n", " return [msDict]\n", "\n", " You can now use this feature by in getPRediction() calling it's featureKey, 'ms_5'\n", " '''\n", "\n", " ma1Dict = {\n", " 'featureKey': 'ma_90',\n", " 'featureId': 'moving_average',\n", " 'params': {\n", " 'period': 90,\n", " 'featureName': 'adjClose'\n", " }\n", " }\n", " mom30Dict = {\n", " 'featureKey': 'mom_30',\n", " 'featureId': 'momentum',\n", " 'params': {\n", " 'period': 30,\n", " 'featureName': 'adjClose'\n", " }\n", " }\n", " mom10Dict = {\n", " 'featureKey': 'mom_10',\n", " 'featureId': 'momentum',\n", " 'params': {\n", " 'period': 10,\n", " 'featureName': 'adjClose'\n", " }\n", " }\n", " \n", " return [ma1Dict, mom10Dict, mom30Dict]\n", "\n", " def getPrediction(self, time, updateNum, instrumentManager, predictions):\n", " '''\n", " Combine all the features to create the desired predictions for each stock.\n", " 'predictions' is Pandas Series with stock as index and predictions as values\n", " We first call the holder for all the instrument features for all stocks as\n", " lookbackInstrumentFeatures = instrumentManager.getLookbackInstrumentFeatures()\n", " Then call the dataframe for a feature using its feature_key as\n", " ms5Data = lookbackInstrumentFeatures.getFeatureDf('ms_5')\n", " This returns a dataFrame for that feature for ALL stocks for all times upto lookback time\n", " Now you can call just the last data point for ALL stocks as\n", " ms5 = ms5Data.iloc[-1]\n", " You can call last datapoint for one stock 'ABC' as\n", " value_for_abs = ms5['ABC']\n", "\n", " Output of the prediction function is used by the toolbox to make further trading decisions and evaluate your score.\n", " '''\n", "\n", " # self.updateCount() - uncomment if you want a counter\n", "\n", " # holder for all the instrument features for all instruments\n", " lookbackInstrumentFeatures = instrumentManager.getLookbackInstrumentFeatures()\n", "\n", " #############################################################################################\n", " ### TODO : FILL THIS FUNCTION TO RETURN A BUY (1) or SELL (0) prediction for each stock ###\n", " ### USE TEMPLATE BELOW AS EXAMPLE\n", " ###\n", " ### HINT: Use the Hurst Exponent \n", " ### http://analytics-magazine.org/the-hurst-exponent-predictability-of-time-series/\n", " #############################################################################################\n", " \n", " # Here's an example implementation of the hurst exponent\n", " def hurst_f(input_ts, lags_to_test=20): \n", " # interpretation of return value\n", " # hurst < 0.5 - input_ts is mean reverting\n", " # hurst = 0.5 - input_ts is effectively random/geometric brownian motion\n", " # hurst > 0.5 - input_ts is trending\n", " tau = []\n", " lagvec = [] \n", " # Step through the different lags \n", " for lag in range(2, lags_to_test): \n", " # produce price difference with lag \n", " pp = np.subtract(input_ts[lag:], input_ts[:-lag]) \n", " # Write the different lags into a vector \n", " lagvec.append(lag) \n", " # Calculate the variance of the differnce vector \n", " tau.append(np.sqrt(np.std(pp))) \n", " # linear fit to double-log graph (gives power) \n", " m = np.polyfit(np.log10(lagvec), np.log10(tau), 1) \n", " # calculate hurst \n", " hurst = m[0]*2\n", "\n", " return hurst \n", "\n", " # dataframe for a historical instrument feature (ma_90 in this case). The index is the timestamps\n", " # of upto lookback data points. The columns of this dataframe are the stock symbols/instrumentIds.\n", " mom30Data = lookbackInstrumentFeatures.getFeatureDf('mom_30')\n", " ma90Data = lookbackInstrumentFeatures.getFeatureDf('ma_90')\n", "\n", " if len(ma90Data.index) > 20:\n", " mom30 = mom30Data.iloc[-1]\n", " # Go long if momentum is positive\n", " predictions[mom30 > 0] = 1\n", " # Go short if momentum is negative\n", " predictions[mom30 <= 0] = 0 \n", " else:\n", " # If no sufficient data then don't take any positions\n", " predictions.values[:] = 0.5\n", " return predictions\n", "\n", " def updateCount(self):\n", " self.count = self.count + 1" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "Gp_ajtSC3r9t" }, "source": [ "#### Here's another example of a custom feature" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "colab": {}, "colab_type": "code", "id": "weJEUniK3r9v" }, "outputs": [], "source": [ "class MyCustomFeature(Feature):\n", " ''''\n", " Custom Feature to implement for instrument. This function would return the value of the feature you want to implement.\n", " 1. create a new class MyCustomFeatureClassName for the feature and implement your logic in the function computeForInstrument() -\n", "\n", " 2. modify function getCustomFeatures() to return a dictionary with Id for this class\n", " (follow formats like {'my_custom_feature_identifier': MyCustomFeatureClassName}.\n", " Make sure 'my_custom_feature_identifier' doesnt conflict with any of the pre defined feature Ids\n", "\n", " def getCustomFeatures(self):\n", " return {'my_custom_feature_identifier': MyCustomFeatureClassName}\n", "\n", " 3. create a dict for this feature in getInstrumentFeatureConfigDicts() above. Dict format is:\n", " customFeatureDict = {'featureKey': 'my_custom_feature_key',\n", " 'featureId': 'my_custom_feature_identifier',\n", " 'params': {'param1': 'value1'}}\n", " You can now use this feature by calling it's featureKey, 'my_custom_feature_key' in getPrediction()\n", " '''\n", " \n", " @classmethod\n", " def computeForInstrument(cls, updateNum, time, featureParams, featureKey, instrumentManager):\n", " # Custom parameter which can be used as input to computation of this feature\n", " param1Value = featureParams['param1']\n", "\n", " # A holder for the all the instrument features\n", " lookbackInstrumentFeatures = instrumentManager.getLookbackInstrumentFeatures()\n", "\n", " # dataframe for a historical instrument feature (basis in this case). The index is the timestamps\n", " # atmost upto lookback data points. The columns of this dataframe are the stocks/instrumentIds.\n", " lookbackInstrumentValue = lookbackInstrumentFeatures.getFeatureDf('adjClose')\n", "\n", " # The last row of the previous dataframe gives the last calculated value for that feature (basis in this case)\n", " # This returns a series with stocks/instrumentIds as the index.\n", " currentValue = lookbackInstrumentValue.iloc[-1]\n", "\n", " if param1Value == 'value1':\n", " return currentValue * 0.1\n", " else:\n", " return currentValue * 0.5" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "FAoigNUv3r93" }, "source": [ "### Time to run the backtester!" ] }, { "cell_type": "code", "execution_count": 15, "metadata": { "colab": {}, "colab_type": "code", "id": "LMW8EmrC3r95", "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing data for stock: AAPL\n", "20% done...\n", "40% done...\n", "60% done...\n", "80% done...\n", "Logging all the available market metrics in tensorboard\n", "Logging all the available instrument metrics in tensorboard\n", "2015-01-02 00:00:00\n", "2015-01-05 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-06 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-07 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-08 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-09 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-12 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-13 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-14 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-15 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-16 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-19 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-20 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-21 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-22 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-23 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-26 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-27 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-28 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-29 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-01-30 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-02-02 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "2015-02-03 00:00:00\n", "AAPL\n", "pnl: 0.00\n", "Position changed to: -1.00\n", "2015-02-04 00:00:00\n", "AAPL\n", "pnl: -0.02\n", "2015-02-05 00:00:00\n", "AAPL\n", "pnl: -0.85\n", "2015-02-06 00:00:00\n", "AAPL\n", "pnl: -1.63\n", "2015-02-09 00:00:00\n", "AAPL\n", "pnl: -0.70\n", "2015-02-10 00:00:00\n", "AAPL\n", "pnl: -1.43\n", "2015-02-11 00:00:00\n", "AAPL\n", "pnl: -3.54\n", "2015-02-12 00:00:00\n", "AAPL\n", "pnl: -6.16\n", "2015-02-13 00:00:00\n", "AAPL\n", "pnl: -7.61\n", "2015-02-16 00:00:00\n", "AAPL\n", "pnl: -8.18\n", "2015-02-17 00:00:00\n", "AAPL\n", "pnl: -8.18\n", "2015-02-18 00:00:00\n", "AAPL\n", "pnl: -8.87\n", "2015-02-19 00:00:00\n", "AAPL\n", "pnl: -9.69\n", "2015-02-20 00:00:00\n", "AAPL\n", "pnl: -9.44\n", "2015-02-23 00:00:00\n", "AAPL\n", "pnl: -10.40\n", "2015-02-24 00:00:00\n", "AAPL\n", "pnl: -13.62\n", "2015-02-25 00:00:00\n", "AAPL\n", "pnl: -12.85\n", "2015-02-26 00:00:00\n", "AAPL\n", "pnl: -9.75\n", "2015-02-27 00:00:00\n", "AAPL\n", "pnl: -11.25\n", "2015-03-02 00:00:00\n", "AAPL\n", "pnl: -9.45\n", "2015-03-03 00:00:00\n", "AAPL\n", "pnl: -10.03\n", "2015-03-04 00:00:00\n", "AAPL\n", "pnl: -10.28\n", "2015-03-05 00:00:00\n", "AAPL\n", "pnl: -9.52\n", "2015-03-06 00:00:00\n", "AAPL\n", "pnl: -7.57\n", "2015-03-09 00:00:00\n", "AAPL\n", "pnl: -7.74\n", "2015-03-10 00:00:00\n", "AAPL\n", "pnl: -8.24\n", "2015-03-11 00:00:00\n", "AAPL\n", "pnl: -5.82\n", "2015-03-12 00:00:00\n", "AAPL\n", "pnl: -3.74\n", "2015-03-13 00:00:00\n", "AAPL\n", "pnl: -5.77\n", "2015-03-16 00:00:00\n", "AAPL\n", "pnl: -4.98\n", "2015-03-17 00:00:00\n", "AAPL\n", "pnl: -6.23\n", "2015-03-18 00:00:00\n", "AAPL\n", "pnl: -8.15\n", "2015-03-19 00:00:00\n", "AAPL\n", "pnl: -9.46\n", "2015-03-20 00:00:00\n", "AAPL\n", "pnl: -8.57\n", "2015-03-23 00:00:00\n", "AAPL\n", "pnl: -7.10\n", "2015-03-24 00:00:00\n", "AAPL\n", "pnl: -8.30\n", "2015-03-25 00:00:00\n", "AAPL\n", "pnl: -7.83\n", "2015-03-26 00:00:00\n", "AAPL\n", "pnl: -4.79\n", "2015-03-27 00:00:00\n", "AAPL\n", "pnl: -5.58\n", "2015-03-30 00:00:00\n", "AAPL\n", "pnl: -4.67\n", "2015-03-31 00:00:00\n", "AAPL\n", "pnl: -7.53\n", "2015-04-01 00:00:00\n", "AAPL\n", "pnl: -5.75\n", "2015-04-02 00:00:00\n", "AAPL\n", "pnl: -5.59\n", "2015-04-03 00:00:00\n", "AAPL\n", "pnl: -6.57\n", "2015-04-06 00:00:00\n", "AAPL\n", "pnl: -6.57\n", "2015-04-07 00:00:00\n", "AAPL\n", "pnl: -8.43\n", "2015-04-08 00:00:00\n", "AAPL\n", "pnl: -7.20\n", "2015-04-09 00:00:00\n", "AAPL\n", "pnl: -6.82\n", "2015-04-10 00:00:00\n", "AAPL\n", "pnl: -7.71\n", "2015-04-13 00:00:00\n", "AAPL\n", "pnl: -8.20\n", "2015-04-14 00:00:00\n", "AAPL\n", "pnl: -7.97\n", "2015-04-15 00:00:00\n", "AAPL\n", "pnl: -7.47\n", "2015-04-16 00:00:00\n", "AAPL\n", "pnl: -7.91\n", "2015-04-17 00:00:00\n", "AAPL\n", "pnl: -7.35\n", "2015-04-20 00:00:00\n", "AAPL\n", "pnl: -6.04\n", "2015-04-21 00:00:00\n", "AAPL\n", "pnl: -8.66\n", "2015-04-22 00:00:00\n", "AAPL\n", "pnl: -8.03\n", "2015-04-23 00:00:00\n", "AAPL\n", "pnl: -9.60\n", "2015-04-24 00:00:00\n", "AAPL\n", "pnl: -10.56\n", "2015-04-27 00:00:00\n", "AAPL\n", "pnl: -11.12\n", "2015-04-28 00:00:00\n", "AAPL\n", "pnl: -13.30\n", "2015-04-29 00:00:00\n", "AAPL\n", "pnl: -11.38\n", "2015-04-30 00:00:00\n", "AAPL\n", "pnl: -9.61\n", "2015-05-01 00:00:00\n", "AAPL\n", "pnl: -6.41\n", "2015-05-04 00:00:00\n", "AAPL\n", "pnl: -9.90\n", "2015-05-05 00:00:00\n", "AAPL\n", "pnl: -9.67\n", "2015-05-06 00:00:00\n", "AAPL\n", "pnl: -7.01\n", "2015-05-07 00:00:00\n", "AAPL\n", "pnl: -6.28\n", "2015-05-08 00:00:00\n", "AAPL\n", "pnl: -6.99\n", "2015-05-11 00:00:00\n", "AAPL\n", "pnl: -9.17\n", "2015-05-12 00:00:00\n", "AAPL\n", "pnl: -7.97\n", "2015-05-13 00:00:00\n", "AAPL\n", "pnl: -7.56\n", "2015-05-14 00:00:00\n", "AAPL\n", "pnl: -7.68\n", "2015-05-15 00:00:00\n", "AAPL\n", "pnl: -10.39\n", "2015-05-18 00:00:00\n", "AAPL\n", "pnl: -10.23\n", "2015-05-19 00:00:00\n", "AAPL\n", "pnl: -11.54\n", "2015-05-20 00:00:00\n", "AAPL\n", "pnl: -11.43\n", "2015-05-21 00:00:00\n", "AAPL\n", "pnl: -11.42\n", "2015-05-22 00:00:00\n", "AAPL\n", "pnl: -12.64\n", "2015-05-25 00:00:00\n", "AAPL\n", "pnl: -13.70\n", "2015-05-26 00:00:00\n", "AAPL\n", "pnl: -13.70\n", "2015-05-27 00:00:00\n", "AAPL\n", "pnl: -11.01\n", "2015-05-28 00:00:00\n", "AAPL\n", "pnl: -13.24\n", "2015-05-29 00:00:00\n", "AAPL\n", "pnl: -13.00\n", "2015-06-01 00:00:00\n", "AAPL\n", "pnl: -11.62\n", "2015-06-02 00:00:00\n", "AAPL\n", "pnl: -11.86\n", "2015-06-03 00:00:00\n", "AAPL\n", "pnl: -11.32\n", "2015-06-04 00:00:00\n", "AAPL\n", "pnl: -11.47\n", "2015-06-05 00:00:00\n", "AAPL\n", "pnl: -10.77\n", "2015-06-08 00:00:00\n", "AAPL\n", "pnl: -10.12\n", "2015-06-09 00:00:00\n", "AAPL\n", "pnl: -9.33\n", "2015-06-10 00:00:00\n", "AAPL\n", "pnl: -8.98\n", "2015-06-11 00:00:00\n", "AAPL\n", "pnl: -10.33\n", "2015-06-12 00:00:00\n", "AAPL\n", "pnl: -10.06\n", "2015-06-15 00:00:00\n", "AAPL\n", "pnl: -8.75\n", "2015-06-16 00:00:00\n", "AAPL\n", "pnl: -8.52\n", "2015-06-17 00:00:00\n", "AAPL\n", "pnl: -9.15\n", "2015-06-18 00:00:00\n", "AAPL\n", "pnl: -8.87\n", "2015-06-19 00:00:00\n", "AAPL\n", "pnl: -9.41\n", "2015-06-22 00:00:00\n", "AAPL\n", "pnl: -8.23\n", "2015-06-23 00:00:00\n", "AAPL\n", "pnl: -9.16\n", "2015-06-24 00:00:00\n", "AAPL\n", "pnl: -8.62\n", "2015-06-25 00:00:00\n", "AAPL\n", "pnl: -9.62\n", "2015-06-26 00:00:00\n", "AAPL\n", "pnl: -9.06\n", "2015-06-29 00:00:00\n", "AAPL\n", "pnl: -8.37\n", "2015-06-30 00:00:00\n", "AAPL\n", "pnl: -6.32\n", "2015-07-01 00:00:00\n", "AAPL\n", "pnl: -7.15\n", "2015-07-02 00:00:00\n", "AAPL\n", "pnl: -8.23\n", "2015-07-03 00:00:00\n", "AAPL\n", "pnl: -8.08\n", "2015-07-06 00:00:00\n", "AAPL\n", "pnl: -8.08\n", "2015-07-07 00:00:00\n", "AAPL\n", "pnl: -7.68\n", "2015-07-08 00:00:00\n", "AAPL\n", "pnl: -7.39\n", "2015-07-09 00:00:00\n", "AAPL\n", "pnl: -4.51\n", "2015-07-10 00:00:00\n", "AAPL\n", "pnl: -2.21\n", "2015-07-13 00:00:00\n", "AAPL\n", "pnl: -5.17\n", "2015-07-14 00:00:00\n", "AAPL\n", "pnl: -7.36\n", "2015-07-15 00:00:00\n", "AAPL\n", "pnl: -7.32\n", "2015-07-16 00:00:00\n", "AAPL\n", "pnl: -8.43\n", "2015-07-17 00:00:00\n", "AAPL\n", "pnl: -9.99\n", "2015-07-20 00:00:00\n", "AAPL\n", "pnl: -11.01\n", "2015-07-21 00:00:00\n", "AAPL\n", "pnl: -13.27\n", "2015-07-22 00:00:00\n", "AAPL\n", "pnl: -12.05\n", "2015-07-23 00:00:00\n", "AAPL\n", "pnl: -6.96\n", "2015-07-24 00:00:00\n", "AAPL\n", "pnl: -6.90\n", "2015-07-27 00:00:00\n", "AAPL\n", "pnl: -6.29\n", "2015-07-28 00:00:00\n", "AAPL\n", "pnl: -4.70\n", "2015-07-29 00:00:00\n", "AAPL\n", "pnl: -5.26\n", "2015-07-30 00:00:00\n", "AAPL\n", "pnl: -4.90\n", "2015-07-31 00:00:00\n", "AAPL\n", "pnl: -4.33\n", "2015-08-03 00:00:00\n", "AAPL\n", "pnl: -3.34\n", "2015-08-04 00:00:00\n", "AAPL\n", "pnl: -0.71\n", "2015-08-05 00:00:00\n", "AAPL\n", "pnl: 2.79\n", "2015-08-06 00:00:00\n", "AAPL\n", "pnl: 2.09\n", "2015-08-07 00:00:00\n", "AAPL\n", "pnl: 1.86\n", "2015-08-10 00:00:00\n", "AAPL\n", "pnl: 1.50\n", "2015-08-11 00:00:00\n", "AAPL\n", "pnl: -2.39\n", "2015-08-12 00:00:00\n", "AAPL\n", "pnl: 3.38\n", "2015-08-13 00:00:00\n", "AAPL\n", "pnl: 1.76\n", "2015-08-14 00:00:00\n", "AAPL\n", "pnl: 1.84\n", "2015-08-17 00:00:00\n", "AAPL\n", "pnl: 1.09\n", "2015-08-18 00:00:00\n", "AAPL\n", "pnl: -0.02\n", "2015-08-19 00:00:00\n", "AAPL\n", "pnl: 0.59\n", "2015-08-20 00:00:00\n", "AAPL\n", "pnl: 1.97\n", "2015-08-21 00:00:00\n", "AAPL\n", "pnl: 4.16\n", "2015-08-24 00:00:00\n", "AAPL\n", "pnl: 10.54\n", "2015-08-25 00:00:00\n", "AAPL\n", "pnl: 12.98\n", "2015-08-26 00:00:00\n", "AAPL\n", "pnl: 12.41\n", "2015-08-27 00:00:00\n", "AAPL\n", "pnl: 6.90\n", "2015-08-28 00:00:00\n", "AAPL\n", "pnl: 3.91\n", "2015-08-31 00:00:00\n", "AAPL\n", "pnl: 3.57\n", "2015-09-01 00:00:00\n", "AAPL\n", "pnl: 4.06\n", "2015-09-02 00:00:00\n", "AAPL\n", "pnl: 8.72\n", "2015-09-03 00:00:00\n", "AAPL\n", "pnl: 4.45\n", "2015-09-04 00:00:00\n", "AAPL\n", "pnl: 6.27\n", "2015-09-07 00:00:00\n", "AAPL\n", "pnl: 7.29\n", "2015-09-08 00:00:00\n", "AAPL\n", "pnl: 7.29\n", "2015-09-09 00:00:00\n", "AAPL\n", "pnl: 4.47\n", "2015-09-10 00:00:00\n", "AAPL\n", "pnl: 6.47\n", "2015-09-11 00:00:00\n", "AAPL\n", "pnl: 4.23\n", "2015-09-14 00:00:00\n", "AAPL\n", "pnl: 2.71\n", "2015-09-15 00:00:00\n", "AAPL\n", "pnl: 1.70\n", "2015-09-16 00:00:00\n", "AAPL\n", "pnl: 0.80\n", "2015-09-17 00:00:00\n", "AAPL\n", "pnl: 0.68\n", "2015-09-18 00:00:00\n", "AAPL\n", "pnl: 2.98\n", "2015-09-21 00:00:00\n", "AAPL\n", "pnl: 3.42\n", "2015-09-22 00:00:00\n", "AAPL\n", "pnl: 1.79\n", "2015-09-23 00:00:00\n", "AAPL\n", "pnl: 3.46\n", "2015-09-24 00:00:00\n", "AAPL\n", "pnl: 2.61\n", "2015-09-25 00:00:00\n", "AAPL\n", "pnl: 1.98\n", "2015-09-28 00:00:00\n", "AAPL\n", "pnl: 2.25\n", "2015-09-29 00:00:00\n", "AAPL\n", "pnl: 4.35\n", "2015-09-30 00:00:00\n", "AAPL\n", "pnl: 7.48\n", "2015-10-01 00:00:00\n", "AAPL\n", "pnl: 6.33\n", "2015-10-02 00:00:00\n", "AAPL\n", "pnl: 7.00\n", "2015-10-05 00:00:00\n", "AAPL\n", "pnl: 6.26\n", "2015-10-06 00:00:00\n", "AAPL\n", "pnl: 5.89\n", "2015-10-07 00:00:00\n", "AAPL\n", "pnl: 5.40\n", "2015-10-08 00:00:00\n", "AAPL\n", "pnl: 5.89\n", "2015-10-09 00:00:00\n", "AAPL\n", "pnl: 7.07\n", "2015-10-12 00:00:00\n", "AAPL\n", "pnl: 4.65\n", "2015-10-13 00:00:00\n", "AAPL\n", "pnl: 5.13\n", "2015-10-14 00:00:00\n", "AAPL\n", "pnl: 4.95\n", "2015-10-15 00:00:00\n", "AAPL\n", "pnl: 6.42\n", "2015-10-16 00:00:00\n", "AAPL\n", "pnl: 4.89\n", "2015-10-19 00:00:00\n", "AAPL\n", "pnl: 5.65\n", "2015-10-20 00:00:00\n", "AAPL\n", "pnl: 5.01\n", "2015-10-21 00:00:00\n", "AAPL\n", "pnl: 3.12\n", "2015-10-22 00:00:00\n", "AAPL\n", "pnl: 3.13\n", "2015-10-23 00:00:00\n", "AAPL\n", "pnl: 1.52\n", "2015-10-26 00:00:00\n", "AAPL\n", "pnl: -1.79\n", "2015-10-27 00:00:00\n", "AAPL\n", "pnl: 1.72\n", "2015-10-28 00:00:00\n", "AAPL\n", "pnl: 2.40\n", "2015-10-29 00:00:00\n", "AAPL\n", "pnl: -1.97\n", "2015-10-30 00:00:00\n", "AAPL\n", "pnl: -3.14\n", "2015-11-02 00:00:00\n", "AAPL\n", "pnl: -2.18\n", "2015-11-03 00:00:00\n", "AAPL\n", "pnl: -3.74\n", "2015-11-04 00:00:00\n", "AAPL\n", "pnl: -5.03\n", "2015-11-05 00:00:00\n", "AAPL\n", "pnl: -4.50\n", "2015-11-06 00:00:00\n", "AAPL\n", "pnl: -3.98\n", "2015-11-09 00:00:00\n", "AAPL\n", "pnl: -4.11\n", "2015-11-10 00:00:00\n", "AAPL\n", "pnl: -3.65\n", "2015-11-11 00:00:00\n", "AAPL\n", "pnl: -0.12\n", "2015-11-12 00:00:00\n", "AAPL\n", "pnl: 0.50\n", "2015-11-13 00:00:00\n", "AAPL\n", "pnl: 0.86\n", "2015-11-16 00:00:00\n", "AAPL\n", "pnl: 4.00\n", "2015-11-17 00:00:00\n", "AAPL\n", "pnl: 2.29\n", "2015-11-18 00:00:00\n", "AAPL\n", "pnl: 2.75\n", "2015-11-19 00:00:00\n", "AAPL\n", "pnl: -0.60\n", "2015-11-20 00:00:00\n", "AAPL\n", "pnl: -1.99\n", "2015-11-23 00:00:00\n", "AAPL\n", "pnl: -2.47\n", "2015-11-24 00:00:00\n", "AAPL\n", "pnl: -1.03\n", "2015-11-25 00:00:00\n", "AAPL\n", "pnl: -2.08\n", "2015-11-26 00:00:00\n", "AAPL\n", "pnl: -1.29\n", "2015-11-27 00:00:00\n", "AAPL\n", "pnl: -1.29\n", "2015-11-30 00:00:00\n", "AAPL\n", "pnl: -1.09\n", "2015-12-01 00:00:00\n", "AAPL\n", "pnl: -1.54\n", "2015-12-02 00:00:00\n", "AAPL\n", "pnl: -0.65\n", "2015-12-03 00:00:00\n", "AAPL\n", "pnl: 0.34\n", "2015-12-04 00:00:00\n", "AAPL\n", "pnl: 1.34\n", "2015-12-07 00:00:00\n", "AAPL\n", "pnl: -2.22\n", "2015-12-08 00:00:00\n", "AAPL\n", "pnl: -1.52\n", "2015-12-09 00:00:00\n", "AAPL\n", "pnl: -1.48\n", "2015-12-10 00:00:00\n", "AAPL\n", "pnl: 0.95\n", "2015-12-11 00:00:00\n", "AAPL\n", "pnl: 0.44\n", "2015-12-14 00:00:00\n", "AAPL\n", "pnl: 3.22\n", "2015-12-15 00:00:00\n", "AAPL\n", "pnl: 3.87\n", "2015-12-16 00:00:00\n", "AAPL\n", "pnl: 5.72\n", "2015-12-17 00:00:00\n", "AAPL\n", "pnl: 4.93\n", "2015-12-18 00:00:00\n", "AAPL\n", "pnl: 7.12\n", "2015-12-21 00:00:00\n", "AAPL\n", "pnl: 9.87\n", "2015-12-22 00:00:00\n", "AAPL\n", "pnl: 8.66\n", "2015-12-23 00:00:00\n", "AAPL\n", "pnl: 8.75\n", "2015-12-24 00:00:00\n", "AAPL\n", "pnl: 7.47\n", "2015-12-25 00:00:00\n", "AAPL\n", "pnl: 8.01\n", "2015-12-28 00:00:00\n", "AAPL\n", "pnl: 8.01\n", "2015-12-29 00:00:00\n", "AAPL\n", "pnl: 9.13\n", "2015-12-30 00:00:00\n", "AAPL\n", "pnl: 7.35\n", "2015-12-31 00:00:00\n", "AAPL\n", "pnl: 8.67\n", "2016-01-01 00:00:00\n", "AAPL\n", "pnl: 10.58\n", "2016-01-04 00:00:00\n", "AAPL\n", "pnl: 10.58\n", "2016-01-05 00:00:00\n", "AAPL\n", "pnl: 10.50\n", "2016-01-06 00:00:00\n", "AAPL\n", "pnl: 12.95\n", "2016-01-07 00:00:00\n", "AAPL\n", "pnl: 14.82\n", "2016-01-08 00:00:00\n", "AAPL\n", "pnl: 18.77\n", "2016-01-11 00:00:00\n", "AAPL\n", "pnl: 18.30\n", "2016-01-12 00:00:00\n", "AAPL\n", "pnl: 16.84\n", "2016-01-13 00:00:00\n", "AAPL\n", "pnl: 15.51\n", "2016-01-14 00:00:00\n", "AAPL\n", "pnl: 17.90\n", "2016-01-15 00:00:00\n", "AAPL\n", "pnl: 15.92\n", "2016-01-18 00:00:00\n", "AAPL\n", "pnl: 18.14\n", "2016-01-19 00:00:00\n", "AAPL\n", "pnl: 18.14\n", "2016-01-20 00:00:00\n", "AAPL\n", "pnl: 18.58\n", "2016-01-21 00:00:00\n", "AAPL\n", "pnl: 18.46\n", "2016-01-22 00:00:00\n", "AAPL\n", "pnl: 18.91\n", "2016-01-25 00:00:00\n", "AAPL\n", "pnl: 14.15\n", "2016-01-26 00:00:00\n", "AAPL\n", "pnl: 15.99\n", "2016-01-27 00:00:00\n", "AAPL\n", "pnl: 15.48\n", "2016-01-28 00:00:00\n", "AAPL\n", "pnl: 21.59\n", "2016-01-29 00:00:00\n", "AAPL\n", "pnl: 20.97\n", "2016-02-01 00:00:00\n", "AAPL\n", "pnl: 17.95\n", "2016-02-02 00:00:00\n", "AAPL\n", "pnl: 18.79\n", "2016-02-03 00:00:00\n", "AAPL\n", "pnl: 20.61\n", "2016-02-04 00:00:00\n", "AAPL\n", "pnl: 18.87\n", "2016-02-05 00:00:00\n", "AAPL\n", "pnl: 18.15\n", "2016-02-08 00:00:00\n", "AAPL\n", "pnl: 20.56\n", "2016-02-09 00:00:00\n", "AAPL\n", "pnl: 19.63\n", "2016-02-10 00:00:00\n", "AAPL\n", "pnl: 19.65\n", "2016-02-11 00:00:00\n", "AAPL\n", "pnl: 20.33\n", "2016-02-12 00:00:00\n", "AAPL\n", "pnl: 20.86\n", "2016-02-15 00:00:00\n", "AAPL\n", "pnl: 20.59\n", "2016-02-16 00:00:00\n", "AAPL\n", "pnl: 20.59\n", "2016-02-17 00:00:00\n", "AAPL\n", "pnl: 18.11\n", "2016-02-18 00:00:00\n", "AAPL\n", "pnl: 16.73\n", "2016-02-19 00:00:00\n", "AAPL\n", "pnl: 18.46\n", "2016-02-22 00:00:00\n", "AAPL\n", "pnl: 18.67\n", "2016-02-23 00:00:00\n", "AAPL\n", "pnl: 17.89\n", "2016-02-24 00:00:00\n", "AAPL\n", "pnl: 19.93\n", "2016-02-25 00:00:00\n", "AAPL\n", "pnl: 18.61\n", "2016-02-26 00:00:00\n", "AAPL\n", "pnl: 18.00\n", "2016-02-29 00:00:00\n", "AAPL\n", "pnl: 17.86\n", "2016-03-01 00:00:00\n", "AAPL\n", "pnl: 18.06\n", "2016-03-02 00:00:00\n", "AAPL\n", "pnl: 14.47\n", "2016-03-03 00:00:00\n", "AAPL\n", "pnl: 14.27\n", "2016-03-04 00:00:00\n", "AAPL\n", "pnl: 13.57\n", "2016-03-07 00:00:00\n", "AAPL\n", "pnl: 12.16\n", "2016-03-08 00:00:00\n", "AAPL\n", "pnl: 13.22\n", "2016-03-09 00:00:00\n", "AAPL\n", "pnl: 14.01\n", "2016-03-10 00:00:00\n", "AAPL\n", "pnl: 13.92\n", "2016-03-11 00:00:00\n", "AAPL\n", "pnl: 13.88\n", "2016-03-14 00:00:00\n", "AAPL\n", "pnl: 12.86\n", "2016-03-15 00:00:00\n", "AAPL\n", "pnl: 12.61\n", "2016-03-16 00:00:00\n", "AAPL\n", "pnl: 10.69\n", "2016-03-17 00:00:00\n", "AAPL\n", "pnl: 9.39\n", "2016-03-18 00:00:00\n", "AAPL\n", "pnl: 9.55\n", "2016-03-21 00:00:00\n", "AAPL\n", "pnl: 9.43\n", "2016-03-22 00:00:00\n", "AAPL\n", "pnl: 9.44\n", "2016-03-23 00:00:00\n", "AAPL\n", "pnl: 8.69\n", "2016-03-24 00:00:00\n", "AAPL\n", "pnl: 9.24\n", "2016-03-25 00:00:00\n", "AAPL\n", "pnl: 9.67\n", "2016-03-28 00:00:00\n", "AAPL\n", "pnl: 9.67\n", "2016-03-29 00:00:00\n", "AAPL\n", "pnl: 10.12\n", "2016-03-30 00:00:00\n", "AAPL\n", "pnl: 7.79\n", "2016-03-31 00:00:00\n", "AAPL\n", "pnl: 6.03\n", "2016-04-01 00:00:00\n", "AAPL\n", "pnl: 6.57\n", "2016-04-04 00:00:00\n", "AAPL\n", "pnl: 5.63\n", "2016-04-05 00:00:00\n", "AAPL\n", "pnl: 4.57\n", "2016-04-06 00:00:00\n", "AAPL\n", "pnl: 5.80\n", "2016-04-07 00:00:00\n", "AAPL\n", "pnl: 4.72\n", "2016-04-08 00:00:00\n", "AAPL\n", "pnl: 6.99\n", "2016-04-11 00:00:00\n", "AAPL\n", "pnl: 6.87\n", "2016-04-12 00:00:00\n", "AAPL\n", "pnl: 6.54\n", "2016-04-13 00:00:00\n", "AAPL\n", "pnl: 5.21\n", "2016-04-14 00:00:00\n", "AAPL\n", "pnl: 3.71\n", "2016-04-15 00:00:00\n", "AAPL\n", "pnl: 3.66\n", "2016-04-18 00:00:00\n", "AAPL\n", "pnl: 5.76\n", "2016-04-19 00:00:00\n", "AAPL\n", "pnl: 7.98\n", "2016-04-20 00:00:00\n", "AAPL\n", "pnl: 8.51\n", "2016-04-21 00:00:00\n", "AAPL\n", "pnl: 8.30\n", "2016-04-22 00:00:00\n", "AAPL\n", "pnl: 9.39\n", "2016-04-25 00:00:00\n", "AAPL\n", "pnl: 9.66\n", "2016-04-26 00:00:00\n", "AAPL\n", "pnl: 10.22\n", "2016-04-27 00:00:00\n", "AAPL\n", "pnl: 10.90\n", "2016-04-28 00:00:00\n", "AAPL\n", "pnl: 17.01\n", "2016-04-29 00:00:00\n", "AAPL\n", "pnl: 19.80\n", "2016-05-02 00:00:00\n", "AAPL\n", "pnl: 20.82\n", "2016-05-03 00:00:00\n", "AAPL\n", "pnl: 20.91\n", "2016-05-04 00:00:00\n", "AAPL\n", "pnl: 19.47\n", "2016-05-05 00:00:00\n", "AAPL\n", "pnl: 20.40\n", "2016-05-06 00:00:00\n", "AAPL\n", "pnl: 20.76\n", "2016-05-09 00:00:00\n", "AAPL\n", "pnl: 21.25\n", "2016-05-10 00:00:00\n", "AAPL\n", "pnl: 21.18\n", "2016-05-11 00:00:00\n", "AAPL\n", "pnl: 20.59\n", "2016-05-12 00:00:00\n", "AAPL\n", "pnl: 21.44\n", "2016-05-13 00:00:00\n", "AAPL\n", "pnl: 23.48\n", "2016-05-16 00:00:00\n", "AAPL\n", "pnl: 23.32\n", "2016-05-17 00:00:00\n", "AAPL\n", "pnl: 20.16\n", "2016-05-18 00:00:00\n", "AAPL\n", "pnl: 20.52\n", "2016-05-19 00:00:00\n", "AAPL\n", "pnl: 19.52\n", "2016-05-20 00:00:00\n", "AAPL\n", "pnl: 19.85\n", "2016-05-23 00:00:00\n", "AAPL\n", "pnl: 18.90\n", "2016-05-24 00:00:00\n", "AAPL\n", "pnl: 17.76\n", "2016-05-25 00:00:00\n", "AAPL\n", "pnl: 16.37\n", "2016-05-26 00:00:00\n", "AAPL\n", "pnl: 14.76\n", "2016-05-27 00:00:00\n", "AAPL\n", "pnl: 14.01\n", "2016-05-30 00:00:00\n", "AAPL\n", "pnl: 14.07\n", "2016-05-31 00:00:00\n", "AAPL\n", "pnl: 14.07\n", "2016-06-01 00:00:00\n", "AAPL\n", "pnl: 14.53\n", "2016-06-02 00:00:00\n", "AAPL\n", "pnl: 15.85\n", "2016-06-03 00:00:00\n", "AAPL\n", "pnl: 16.54\n", "2016-06-06 00:00:00\n", "AAPL\n", "pnl: 16.36\n", "2016-06-07 00:00:00\n", "AAPL\n", "pnl: 15.69\n", "2016-06-08 00:00:00\n", "AAPL\n", "pnl: 15.31\n", "2016-06-09 00:00:00\n", "AAPL\n", "pnl: 15.40\n", "2016-06-10 00:00:00\n", "AAPL\n", "pnl: 14.73\n", "2016-06-13 00:00:00\n", "AAPL\n", "pnl: 15.50\n", "2016-06-14 00:00:00\n", "AAPL\n", "pnl: 16.90\n", "2016-06-15 00:00:00\n", "AAPL\n", "pnl: 16.79\n", "2016-06-16 00:00:00\n", "AAPL\n", "pnl: 17.09\n", "2016-06-17 00:00:00\n", "AAPL\n", "pnl: 16.70\n", "2016-06-20 00:00:00\n", "AAPL\n", "pnl: 18.79\n", "2016-06-21 00:00:00\n", "AAPL\n", "pnl: 19.01\n", "2016-06-22 00:00:00\n", "AAPL\n", "pnl: 18.25\n", "2016-06-23 00:00:00\n", "AAPL\n", "pnl: 18.58\n", "2016-06-24 00:00:00\n", "AAPL\n", "pnl: 18.07\n", "2016-06-27 00:00:00\n", "AAPL\n", "pnl: 20.61\n", "2016-06-28 00:00:00\n", "AAPL\n", "pnl: 21.89\n", "2016-06-29 00:00:00\n", "AAPL\n", "pnl: 20.43\n", "2016-06-30 00:00:00\n", "AAPL\n", "pnl: 19.67\n", "2016-07-01 00:00:00\n", "AAPL\n", "pnl: 18.54\n", "2016-07-04 00:00:00\n", "AAPL\n", "pnl: 18.27\n", "2016-07-05 00:00:00\n", "AAPL\n", "pnl: 18.27\n", "2016-07-06 00:00:00\n", "AAPL\n", "pnl: 19.11\n", "2016-07-07 00:00:00\n", "AAPL\n", "pnl: 18.60\n", "2016-07-08 00:00:00\n", "AAPL\n", "pnl: 18.22\n", "2016-07-11 00:00:00\n", "AAPL\n", "pnl: 17.52\n", "2016-07-12 00:00:00\n", "AAPL\n", "pnl: 17.24\n", "2016-07-13 00:00:00\n", "AAPL\n", "pnl: 16.83\n", "2016-07-14 00:00:00\n", "AAPL\n", "pnl: 17.34\n", "2016-07-15 00:00:00\n", "AAPL\n", "pnl: 15.54\n", "2016-07-18 00:00:00\n", "AAPL\n", "pnl: 15.55\n", "2016-07-19 00:00:00\n", "AAPL\n", "pnl: 14.56\n", "2016-07-20 00:00:00\n", "AAPL\n", "pnl: 14.52\n", "2016-07-21 00:00:00\n", "AAPL\n", "pnl: 14.44\n", "2016-07-22 00:00:00\n", "AAPL\n", "pnl: 14.94\n", "2016-07-25 00:00:00\n", "AAPL\n", "pnl: 15.66\n", "2016-07-26 00:00:00\n", "AAPL\n", "pnl: 16.90\n", "2016-07-27 00:00:00\n", "AAPL\n", "pnl: 17.53\n", "2016-07-28 00:00:00\n", "AAPL\n", "pnl: 11.63\n", "2016-07-29 00:00:00\n", "AAPL\n", "pnl: 10.32\n", "2016-08-01 00:00:00\n", "AAPL\n", "pnl: 10.44\n", "2016-08-02 00:00:00\n", "AAPL\n", "pnl: 8.71\n", "2016-08-03 00:00:00\n", "AAPL\n", "pnl: 10.19\n", "2016-08-04 00:00:00\n", "AAPL\n", "pnl: 8.95\n", "2016-08-05 00:00:00\n", "AAPL\n", "pnl: 8.34\n", "2016-08-08 00:00:00\n", "AAPL\n", "pnl: 6.82\n", "2016-08-09 00:00:00\n", "AAPL\n", "pnl: 5.98\n", "2016-08-10 00:00:00\n", "AAPL\n", "pnl: 5.56\n", "2016-08-11 00:00:00\n", "AAPL\n", "pnl: 6.33\n", "2016-08-12 00:00:00\n", "AAPL\n", "pnl: 6.39\n", "2016-08-15 00:00:00\n", "AAPL\n", "pnl: 6.16\n", "2016-08-16 00:00:00\n", "AAPL\n", "pnl: 4.93\n", "2016-08-17 00:00:00\n", "AAPL\n", "pnl: 5.02\n", "2016-08-18 00:00:00\n", "AAPL\n", "pnl: 5.17\n", "2016-08-19 00:00:00\n", "AAPL\n", "pnl: 5.30\n", "2016-08-22 00:00:00\n", "AAPL\n", "pnl: 5.04\n", "2016-08-23 00:00:00\n", "AAPL\n", "pnl: 5.84\n", "2016-08-24 00:00:00\n", "AAPL\n", "pnl: 5.52\n", "2016-08-25 00:00:00\n", "AAPL\n", "pnl: 6.30\n", "2016-08-26 00:00:00\n", "AAPL\n", "pnl: 6.73\n", "2016-08-29 00:00:00\n", "AAPL\n", "pnl: 7.33\n", "2016-08-30 00:00:00\n", "AAPL\n", "pnl: 7.44\n", "2016-08-31 00:00:00\n", "AAPL\n", "pnl: 8.22\n", "2016-09-01 00:00:00\n", "AAPL\n", "pnl: 8.12\n", "2016-09-02 00:00:00\n", "AAPL\n", "pnl: 7.53\n", "2016-09-05 00:00:00\n", "AAPL\n", "pnl: 6.58\n", "2016-09-06 00:00:00\n", "AAPL\n", "pnl: 6.58\n", "2016-09-07 00:00:00\n", "AAPL\n", "pnl: 6.61\n", "2016-09-08 00:00:00\n", "AAPL\n", "pnl: 5.99\n", "2016-09-09 00:00:00\n", "AAPL\n", "pnl: 8.67\n", "2016-09-12 00:00:00\n", "AAPL\n", "pnl: 10.93\n", "2016-09-13 00:00:00\n", "AAPL\n", "pnl: 8.75\n", "2016-09-14 00:00:00\n", "AAPL\n", "pnl: 6.37\n", "2016-09-15 00:00:00\n", "AAPL\n", "pnl: 2.76\n", "2016-09-16 00:00:00\n", "AAPL\n", "pnl: -0.83\n", "2016-09-19 00:00:00\n", "AAPL\n", "pnl: -0.22\n", "2016-09-20 00:00:00\n", "AAPL\n", "pnl: 1.05\n", "2016-09-21 00:00:00\n", "AAPL\n", "pnl: 1.06\n", "2016-09-22 00:00:00\n", "AAPL\n", "pnl: 1.08\n", "2016-09-23 00:00:00\n", "AAPL\n", "pnl: 0.07\n", "2016-09-26 00:00:00\n", "AAPL\n", "pnl: 1.87\n", "2016-09-27 00:00:00\n", "AAPL\n", "pnl: 1.71\n", "2016-09-28 00:00:00\n", "AAPL\n", "pnl: 1.51\n", "2016-09-29 00:00:00\n", "AAPL\n", "pnl: 0.70\n", "2016-09-30 00:00:00\n", "AAPL\n", "pnl: 2.37\n", "2016-10-03 00:00:00\n", "AAPL\n", "pnl: 1.55\n", "2016-10-04 00:00:00\n", "AAPL\n", "pnl: 2.05\n", "2016-10-05 00:00:00\n", "AAPL\n", "pnl: 1.60\n", "2016-10-06 00:00:00\n", "AAPL\n", "pnl: 1.55\n", "2016-10-07 00:00:00\n", "AAPL\n", "pnl: 0.76\n", "2016-10-10 00:00:00\n", "AAPL\n", "pnl: 0.60\n", "2016-10-11 00:00:00\n", "AAPL\n", "pnl: -1.29\n", "2016-10-12 00:00:00\n", "AAPL\n", "pnl: -1.52\n", "2016-10-13 00:00:00\n", "AAPL\n", "pnl: -2.51\n", "2016-10-14 00:00:00\n", "AAPL\n", "pnl: -2.17\n", "2016-10-17 00:00:00\n", "AAPL\n", "pnl: -2.78\n", "2016-10-18 00:00:00\n", "AAPL\n", "pnl: -2.70\n", "2016-10-19 00:00:00\n", "AAPL\n", "pnl: -2.63\n", "2016-10-20 00:00:00\n", "AAPL\n", "pnl: -2.30\n", "2016-10-21 00:00:00\n", "AAPL\n", "pnl: -2.24\n", "2016-10-24 00:00:00\n", "AAPL\n", "pnl: -1.81\n", "2016-10-25 00:00:00\n", "AAPL\n", "pnl: -2.80\n", "2016-10-26 00:00:00\n", "AAPL\n", "pnl: -3.37\n", "2016-10-27 00:00:00\n", "AAPL\n", "pnl: -0.85\n", "2016-10-28 00:00:00\n", "AAPL\n", "pnl: 0.20\n", "2016-10-31 00:00:00\n", "AAPL\n", "pnl: 0.92\n", "2016-11-01 00:00:00\n", "AAPL\n", "pnl: 1.09\n", "2016-11-02 00:00:00\n", "AAPL\n", "pnl: 3.03\n", "2016-11-03 00:00:00\n", "AAPL\n", "pnl: 2.93\n", "2016-11-04 00:00:00\n", "AAPL\n", "pnl: 4.06\n", "2016-11-07 00:00:00\n", "AAPL\n", "pnl: 5.00\n", "2016-11-08 00:00:00\n", "AAPL\n", "pnl: 3.51\n", "2016-11-09 00:00:00\n", "AAPL\n", "pnl: 2.89\n", "2016-11-10 00:00:00\n", "AAPL\n", "pnl: 3.06\n", "2016-11-11 00:00:00\n", "AAPL\n", "pnl: 6.00\n", "2016-11-14 00:00:00\n", "AAPL\n", "pnl: 5.39\n", "2016-11-15 00:00:00\n", "AAPL\n", "pnl: 7.98\n", "2016-11-16 00:00:00\n", "AAPL\n", "pnl: 6.65\n", "2016-11-17 00:00:00\n", "AAPL\n", "pnl: 3.91\n", "2016-11-18 00:00:00\n", "AAPL\n", "pnl: 3.95\n", "2016-11-21 00:00:00\n", "AAPL\n", "pnl: 3.84\n", "2016-11-22 00:00:00\n", "AAPL\n", "pnl: 2.26\n", "2016-11-23 00:00:00\n", "AAPL\n", "pnl: 2.19\n", "2016-11-24 00:00:00\n", "AAPL\n", "pnl: 2.73\n", "2016-11-25 00:00:00\n", "AAPL\n", "pnl: 2.73\n", "2016-11-28 00:00:00\n", "AAPL\n", "pnl: 2.20\n", "2016-11-29 00:00:00\n", "AAPL\n", "pnl: 2.41\n", "2016-11-30 00:00:00\n", "AAPL\n", "pnl: 2.51\n", "2016-12-01 00:00:00\n", "AAPL\n", "pnl: 3.41\n", "2016-12-02 00:00:00\n", "AAPL\n", "pnl: 4.39\n", "2016-12-05 00:00:00\n", "AAPL\n", "pnl: 4.00\n", "2016-12-06 00:00:00\n", "AAPL\n", "pnl: 4.75\n", "2016-12-07 00:00:00\n", "AAPL\n", "pnl: 3.95\n", "2016-12-08 00:00:00\n", "AAPL\n", "pnl: 2.92\n", "2016-12-09 00:00:00\n", "AAPL\n", "pnl: 1.89\n", "2016-12-12 00:00:00\n", "AAPL\n", "pnl: 0.15\n", "2016-12-13 00:00:00\n", "AAPL\n", "pnl: 0.76\n", "2016-12-14 00:00:00\n", "AAPL\n", "pnl: -1.03\n", "2016-12-15 00:00:00\n", "AAPL\n", "pnl: -1.03\n", "2016-12-16 00:00:00\n", "AAPL\n", "pnl: -1.63\n", "2016-12-19 00:00:00\n", "AAPL\n", "pnl: -1.77\n", "2016-12-20 00:00:00\n", "AAPL\n", "pnl: -2.41\n", "2016-12-21 00:00:00\n", "AAPL\n", "pnl: -2.71\n", "2016-12-22 00:00:00\n", "AAPL\n", "pnl: -2.81\n", "2016-12-23 00:00:00\n", "AAPL\n", "pnl: -2.08\n", "2016-12-26 00:00:00\n", "AAPL\n", "pnl: -2.30\n", "2016-12-27 00:00:00\n", "AAPL\n", "pnl: -2.30\n", "2016-12-28 00:00:00\n", "AAPL\n", "pnl: -3.00\n", "2016-12-29 00:00:00\n", "AAPL\n", "pnl: -2.52\n", "2016-12-30 00:00:00\n", "AAPL\n", "pnl: -2.50\n", "2017-01-02 00:00:00\n", "AAPL\n", "pnl: -1.63\n", "2017-01-03 00:00:00\n", "AAPL\n", "pnl: -1.63\n", "2017-01-04 00:00:00\n", "AAPL\n", "pnl: -1.94\n", "2017-01-05 00:00:00\n", "AAPL\n", "pnl: -1.82\n", "2017-01-06 00:00:00\n", "AAPL\n", "pnl: -2.38\n", "2017-01-09 00:00:00\n", "AAPL\n", "pnl: -3.62\n", "2017-01-10 00:00:00\n", "AAPL\n", "pnl: -4.64\n", "2017-01-11 00:00:00\n", "AAPL\n", "pnl: -4.76\n", "2017-01-12 00:00:00\n", "AAPL\n", "pnl: -5.37\n", "2017-01-13 00:00:00\n", "AAPL\n", "pnl: -4.89\n", "2017-01-16 00:00:00\n", "AAPL\n", "pnl: -4.69\n", "2017-01-17 00:00:00\n", "AAPL\n", "pnl: -4.69\n", "2017-01-18 00:00:00\n", "AAPL\n", "pnl: -5.60\n", "2017-01-19 00:00:00\n", "AAPL\n", "pnl: -5.59\n", "2017-01-20 00:00:00\n", "AAPL\n", "pnl: -5.39\n", "2017-01-23 00:00:00\n", "AAPL\n", "pnl: -5.60\n", "2017-01-24 00:00:00\n", "AAPL\n", "pnl: -5.68\n", "2017-01-25 00:00:00\n", "AAPL\n", "pnl: -5.58\n", "2017-01-26 00:00:00\n", "AAPL\n", "pnl: -7.39\n", "2017-01-27 00:00:00\n", "AAPL\n", "pnl: -7.45\n", "2017-01-30 00:00:00\n", "AAPL\n", "pnl: -7.46\n", "2017-01-31 00:00:00\n", "AAPL\n", "pnl: -7.15\n", "2017-02-01 00:00:00\n", "AAPL\n", "pnl: -6.89\n", "2017-02-02 00:00:00\n", "AAPL\n", "pnl: -13.92\n", "2017-02-03 00:00:00\n", "AAPL\n", "pnl: -13.71\n", "2017-02-06 00:00:00\n", "AAPL\n", "pnl: -14.23\n", "2017-02-07 00:00:00\n", "AAPL\n", "pnl: -15.38\n", "2017-02-08 00:00:00\n", "AAPL\n", "pnl: -16.56\n", "2017-02-09 00:00:00\n", "AAPL\n", "pnl: -17.05\n", "2017-02-10 00:00:00\n", "AAPL\n", "pnl: -17.95\n", "2017-02-13 00:00:00\n", "AAPL\n", "pnl: -17.67\n", "2017-02-14 00:00:00\n", "AAPL\n", "pnl: -18.78\n", "2017-02-15 00:00:00\n", "AAPL\n", "pnl: -20.44\n", "2017-02-16 00:00:00\n", "AAPL\n", "pnl: -20.90\n", "2017-02-17 00:00:00\n", "AAPL\n", "pnl: -20.75\n", "2017-02-20 00:00:00\n", "AAPL\n", "pnl: -21.10\n", "2017-02-21 00:00:00\n", "AAPL\n", "pnl: -21.10\n", "2017-02-22 00:00:00\n", "AAPL\n", "pnl: -22.04\n", "2017-02-23 00:00:00\n", "AAPL\n", "pnl: -22.43\n", "2017-02-24 00:00:00\n", "AAPL\n", "pnl: -21.88\n", "2017-02-27 00:00:00\n", "AAPL\n", "pnl: -22.00\n", "2017-02-28 00:00:00\n", "AAPL\n", "pnl: -22.26\n", "2017-03-01 00:00:00\n", "AAPL\n", "pnl: -22.32\n", "2017-03-02 00:00:00\n", "AAPL\n", "pnl: -24.99\n", "2017-03-03 00:00:00\n", "AAPL\n", "pnl: -24.20\n", "2017-03-06 00:00:00\n", "AAPL\n", "pnl: -24.98\n", "2017-03-07 00:00:00\n", "AAPL\n", "pnl: -24.56\n", "2017-03-08 00:00:00\n", "AAPL\n", "pnl: -24.73\n", "2017-03-09 00:00:00\n", "AAPL\n", "pnl: -24.23\n", "2017-03-10 00:00:00\n", "AAPL\n", "pnl: -23.93\n", "2017-03-13 00:00:00\n", "AAPL\n", "pnl: -24.37\n", "2017-03-14 00:00:00\n", "AAPL\n", "pnl: -24.43\n", "2017-03-15 00:00:00\n", "AAPL\n", "pnl: -24.23\n", "2017-03-16 00:00:00\n", "AAPL\n", "pnl: -25.63\n", "2017-03-17 00:00:00\n", "AAPL\n", "pnl: -25.85\n", "2017-03-20 00:00:00\n", "AAPL\n", "pnl: -25.18\n", "2017-03-21 00:00:00\n", "AAPL\n", "pnl: -26.58\n", "2017-03-22 00:00:00\n", "AAPL\n", "pnl: -25.04\n", "2017-03-23 00:00:00\n", "AAPL\n", "pnl: -26.54\n", "2017-03-24 00:00:00\n", "AAPL\n", "pnl: -26.07\n", "2017-03-27 00:00:00\n", "AAPL\n", "pnl: -25.80\n", "2017-03-28 00:00:00\n", "AAPL\n", "pnl: -26.03\n", "2017-03-29 00:00:00\n", "AAPL\n", "pnl: -28.82\n", "2017-03-30 00:00:00\n", "AAPL\n", "pnl: -29.12\n", "2017-03-31 00:00:00\n", "AAPL\n", "pnl: -28.94\n", "2017-04-03 00:00:00\n", "AAPL\n", "pnl: -28.68\n", "2017-04-04 00:00:00\n", "AAPL\n", "pnl: -28.72\n", "2017-04-05 00:00:00\n", "AAPL\n", "pnl: -29.74\n", "2017-04-06 00:00:00\n", "AAPL\n", "pnl: -29.03\n", "2017-04-07 00:00:00\n", "AAPL\n", "pnl: -28.68\n", "2017-04-10 00:00:00\n", "AAPL\n", "pnl: -28.38\n", "2017-04-11 00:00:00\n", "AAPL\n", "pnl: -28.22\n", "2017-04-12 00:00:00\n", "AAPL\n", "pnl: -26.75\n", "2017-04-13 00:00:00\n", "AAPL\n", "pnl: -26.91\n", "2017-04-14 00:00:00\n", "AAPL\n", "pnl: -26.19\n", "2017-04-17 00:00:00\n", "AAPL\n", "pnl: -26.19\n", "2017-04-18 00:00:00\n", "AAPL\n", "pnl: -26.94\n", "2017-04-19 00:00:00\n", "AAPL\n", "pnl: -26.33\n", "2017-04-20 00:00:00\n", "AAPL\n", "pnl: -25.84\n", "2017-04-21 00:00:00\n", "AAPL\n", "pnl: -27.52\n", "2017-04-24 00:00:00\n", "AAPL\n", "pnl: -27.36\n", "2017-04-25 00:00:00\n", "AAPL\n", "pnl: -28.66\n", "2017-04-26 00:00:00\n", "AAPL\n", "pnl: -29.51\n", "2017-04-27 00:00:00\n", "AAPL\n", "pnl: -28.70\n", "2017-04-28 00:00:00\n", "AAPL\n", "pnl: -28.81\n", "2017-05-01 00:00:00\n", "AAPL\n", "pnl: -28.67\n", "2017-05-02 00:00:00\n", "AAPL\n", "pnl: -31.47\n", "2017-05-03 00:00:00\n", "AAPL\n", "pnl: -32.36\n", "2017-05-04 00:00:00\n", "AAPL\n", "pnl: -31.93\n", "2017-05-05 00:00:00\n", "AAPL\n", "pnl: -31.42\n", "2017-05-08 00:00:00\n", "AAPL\n", "pnl: -33.74\n", "2017-05-09 00:00:00\n", "AAPL\n", "pnl: -37.61\n", "2017-05-10 00:00:00\n", "AAPL\n", "pnl: -38.54\n", "2017-05-11 00:00:00\n", "AAPL\n", "pnl: -37.85\n", "2017-05-12 00:00:00\n", "AAPL\n", "pnl: -39.11\n", "2017-05-15 00:00:00\n", "AAPL\n", "pnl: -41.17\n", "2017-05-16 00:00:00\n", "AAPL\n", "pnl: -40.79\n", "2017-05-17 00:00:00\n", "AAPL\n", "pnl: -40.57\n", "2017-05-18 00:00:00\n", "AAPL\n", "pnl: -35.57\n", "2017-05-19 00:00:00\n", "AAPL\n", "pnl: -37.76\n", "2017-05-22 00:00:00\n", "AAPL\n", "pnl: -38.26\n", "2017-05-23 00:00:00\n", "AAPL\n", "pnl: -39.15\n", "2017-05-24 00:00:00\n", "AAPL\n", "pnl: -38.97\n", "2017-05-25 00:00:00\n", "AAPL\n", "pnl: -38.53\n", "2017-05-26 00:00:00\n", "AAPL\n", "pnl: -39.04\n", "2017-05-29 00:00:00\n", "AAPL\n", "pnl: -38.79\n", "2017-05-30 00:00:00\n", "AAPL\n", "pnl: -38.79\n", "2017-05-31 00:00:00\n", "AAPL\n", "pnl: -38.84\n", "2017-06-01 00:00:00\n", "AAPL\n", "pnl: -37.97\n", "2017-06-02 00:00:00\n", "AAPL\n", "pnl: -38.37\n", "2017-06-05 00:00:00\n", "AAPL\n", "pnl: -40.55\n", "2017-06-06 00:00:00\n", "AAPL\n", "pnl: -39.09\n", "2017-06-07 00:00:00\n", "AAPL\n", "pnl: -39.59\n", "2017-06-08 00:00:00\n", "AAPL\n", "pnl: -40.47\n", "2017-06-09 00:00:00\n", "AAPL\n", "pnl: -40.11\n", "2017-06-12 00:00:00\n", "AAPL\n", "pnl: -34.35\n", "2017-06-13 00:00:00\n", "AAPL\n", "pnl: -30.94\n", "2017-06-14 00:00:00\n", "AAPL\n", "pnl: -32.06\n", "2017-06-15 00:00:00\n", "AAPL\n", "pnl: -30.69\n", "2017-06-16 00:00:00\n", "AAPL\n", "pnl: -29.85\n", "2017-06-19 00:00:00\n", "AAPL\n", "pnl: -27.92\n", "2017-06-20 00:00:00\n", "AAPL\n", "pnl: -31.82\n", "2017-06-21 00:00:00\n", "AAPL\n", "pnl: -30.54\n", "2017-06-22 00:00:00\n", "AAPL\n", "pnl: -31.37\n", "2017-06-23 00:00:00\n", "AAPL\n", "pnl: -31.14\n", "2017-06-26 00:00:00\n", "AAPL\n", "pnl: -31.76\n", "2017-06-27 00:00:00\n", "AAPL\n", "pnl: -31.32\n", "2017-06-28 00:00:00\n", "AAPL\n", "pnl: -29.32\n", "2017-06-29 00:00:00\n", "AAPL\n", "pnl: -31.33\n", "2017-06-30 00:00:00\n", "AAPL\n", "pnl: -29.27\n", "2017-07-03 00:00:00\n", "AAPL\n", "pnl: -29.59\n", "2017-07-04 00:00:00\n", "AAPL\n", "pnl: -29.10\n", "2017-07-05 00:00:00\n", "AAPL\n", "pnl: -29.10\n", "2017-07-06 00:00:00\n", "AAPL\n", "pnl: -29.66\n", "2017-07-07 00:00:00\n", "AAPL\n", "pnl: -28.36\n", "2017-07-10 00:00:00\n", "AAPL\n", "pnl: -29.75\n", "2017-07-11 00:00:00\n", "AAPL\n", "pnl: -30.59\n", "2017-07-12 00:00:00\n", "AAPL\n", "pnl: -31.04\n", "2017-07-13 00:00:00\n", "AAPL\n", "pnl: -31.24\n", "2017-07-14 00:00:00\n", "AAPL\n", "pnl: -33.19\n", "2017-07-17 00:00:00\n", "AAPL\n", "pnl: -34.41\n", "2017-07-18 00:00:00\n", "AAPL\n", "pnl: -34.90\n", "2017-07-19 00:00:00\n", "AAPL\n", "pnl: -35.40\n", "2017-07-20 00:00:00\n", "AAPL\n", "pnl: -36.30\n", "2017-07-21 00:00:00\n", "AAPL\n", "pnl: -35.65\n", "2017-07-24 00:00:00\n", "AAPL\n", "pnl: -35.58\n", "2017-07-25 00:00:00\n", "AAPL\n", "pnl: -37.33\n", "2017-07-26 00:00:00\n", "AAPL\n", "pnl: -37.95\n", "2017-07-27 00:00:00\n", "AAPL\n", "pnl: -38.64\n", "2017-07-28 00:00:00\n", "AAPL\n", "pnl: -35.86\n", "2017-07-31 00:00:00\n", "AAPL\n", "pnl: -34.85\n", "2017-08-01 00:00:00\n", "AAPL\n", "pnl: -34.11\n", "2017-08-02 00:00:00\n", "AAPL\n", "pnl: -35.37\n", "2017-08-03 00:00:00\n", "AAPL\n", "pnl: -42.17\n", "2017-08-04 00:00:00\n", "AAPL\n", "pnl: -40.66\n", "2017-08-07 00:00:00\n", "AAPL\n", "pnl: -41.45\n", "2017-08-08 00:00:00\n", "AAPL\n", "pnl: -43.77\n", "2017-08-09 00:00:00\n", "AAPL\n", "pnl: -44.99\n", "2017-08-10 00:00:00\n", "AAPL\n", "pnl: -45.93\n", "2017-08-11 00:00:00\n", "AAPL\n", "pnl: -41.01\n", "2017-08-14 00:00:00\n", "AAPL\n", "pnl: -43.09\n", "2017-08-15 00:00:00\n", "AAPL\n", "pnl: -45.37\n", "2017-08-16 00:00:00\n", "AAPL\n", "pnl: -47.05\n", "2017-08-17 00:00:00\n", "AAPL\n", "pnl: -46.43\n", "2017-08-18 00:00:00\n", "AAPL\n", "pnl: -43.45\n", "2017-08-21 00:00:00\n", "AAPL\n", "pnl: -43.11\n", "2017-08-22 00:00:00\n", "AAPL\n", "pnl: -42.83\n", "2017-08-23 00:00:00\n", "AAPL\n", "pnl: -45.30\n", "2017-08-24 00:00:00\n", "AAPL\n", "pnl: -45.49\n", "2017-08-25 00:00:00\n", "AAPL\n", "pnl: -44.81\n", "2017-08-28 00:00:00\n", "AAPL\n", "pnl: -45.38\n", "2017-08-29 00:00:00\n", "AAPL\n", "pnl: -46.93\n", "2017-08-30 00:00:00\n", "AAPL\n", "pnl: -48.31\n", "[Timestamp('2015-01-02 00:00:00', freq='C'), datetime.datetime(2017, 8, 30, 0, 0)]\n" ] } ], "source": [ "tf = MyTradingFunctions()\n", "tsParams = MyTradingParams(tf)\n", "tradingSystem = TradingSystem(tsParams)\n", "results = tradingSystem.startTrading()" ] }, { "cell_type": "markdown", "metadata": { "colab_type": "text", "id": "yCjIlVz-3r99" }, "source": [ "Results for each timestamp are stored as csv file inside the folder `./runLogs`, we also create logs using tensorboardX inside `./tb_logs` so have a look at that as well using `tensorboard --logdir=tb_logs`" ] }, { "cell_type": "code", "execution_count": 16, "metadata": { "colab": {}, "colab_type": "code", "id": "l9gAWcy13r9-" }, "outputs": [ { "data": { "text/plain": [ "{'instrument_names': ['AAPL'],\n", " 'instrument_stats': [{'pnl': {'AAPL': -0.048736496000000004},\n", " 'score': {'AAPL': -1.8440700333498883}}],\n", " 'pnl': -0.048736496000000004,\n", " 'trading_days': 694,\n", " 'annual_return': -0.01797902430464371,\n", " 'annual_vol': 0.024353421654489144,\n", " 'sharpe_ratio': -0.7382545483636209,\n", " 'score': -1.8440700333498883,\n", " 'capitalUsage': 148.922734349998,\n", " 'total_profit': 340.53843999999987,\n", " 'maxDrawdown': 72.22124399999996,\n", " 'maxPortfolioValue': 1023.484748,\n", " 'total_loss': 389.2749359999995,\n", " 'variance': 2.3535283582592883,\n", " 'capital': 850.675049900002,\n", " 'count_profit': 311,\n", " 'portfolio_value': 951.263504,\n", " 'count_loss': 338}" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "colab": { "collapsed_sections": [], "name": "momentum_backtest_losing_money.ipynb", "provenance": [] }, "environment": { "name": "common-cpu.m46", "type": "gcloud", "uri": "gcr.io/deeplearning-platform-release/base-cpu:m46" }, "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }