Skip to content

Instantly share code, notes, and snippets.

@tsu-nera
Created July 12, 2017 13:43
Show Gist options
  • Star 3 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tsu-nera/d801fab3100c8c2f29b0ed6927c4355a to your computer and use it in GitHub Desktop.
Save tsu-nera/d801fab3100c8c2f29b0ed6927c4355a to your computer and use it in GitHub Desktop.
FX: USDJPYのヒストリカルデータを利用してDQNでバックテスト
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {},
"cell_type": "markdown",
"source": "# USDJPY with DQN"
},
{
"metadata": {},
"cell_type": "markdown",
"source": "* https://github.com/dogwood008/DeepFX\n* http://recruit.gmo.jp/engineer/jisedai/blog/deep-q-learning/\n* https://www.slideshare.net/JunichiroKatsuta/deep-qlearningfx"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import numpy as np\nfrom matplotlib import pyplot as plt",
"execution_count": 1,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "dukascopyからヒストリカルデータをダウンロードする。\n- https://www.dukascopy.com/swiss/english/marketwatch/historical"
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import pandas as pd\nclass HistData():\n def __init__(self, date_range=None):\n self.csv_path = 'data/USDJPY_Candlestick_5_m_BID_03.07.2017-08.07.2017.csv'\n f = '%d.%m.%Y %H:%M:%S.%f'\n my_parser = lambda date: pd.datetime.strptime(date, f)\n self.csv_data = pd.read_csv(self.csv_path, index_col=0, parse_dates=True, header=0,\n date_parser=my_parser)\n self.date_range = date_range\n self.TARGET = 'Close'\n\n def set_date_range(self, date_range):\n self.date_range = date_range\n\n def data(self):\n if self.date_range is None:\n return self.csv_data\n else:\n return self.csv_data[self.date_range]\n\n def max_value(self):\n return self.data()[[self.TARGET]].max()[self.TARGET]\n\n def min_value(self):\n return self.data()[[self.TARGET]].min()[self.TARGET]\n\n def dates(self):\n return self.data().index.values\n\n def plot(self):\n %matplotlib inline\n self.data()[[self.TARGET]].plot()\n\n def list(self):\n l = []\n for close in hist.data()[[self.TARGET]].iterrows():\n l.append(close[1][0])\n return l",
"execution_count": 2,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "hist = HistData()\nhist.plot()\n",
"execution_count": 3,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7fc2b48b6eb8>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEhCAYAAABhpec9AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXl8FOX9+N+f3OTgDvcRUA65RAkgFa3ghUerYFXUVvH4\nqlVbq20ttrbVn6JWq62tVqVWrdSzKvVARVQUDwS57/sMhCscIXey+/z+mJnN7GY32YTd7Cb5vF+v\nvDLzzDMzz8zuzmc+z+cSYwyKoiiKEoqEWA9AURRFiW9UUCiKoii1ooJCURRFqRUVFIqiKEqtqKBQ\nFEVRakUFhaIoilIrdQoKEXleRPaJyCpX26UislpEvCKSG2SfXiJSJCK/CnHMR0VknYisEJGZItLW\nbs8RkVIRWWb/PXMsF6coiqIcO+FoFC8CEwLaVgGTgHkh9nkc+LCWY84BhhhjhgEbgLtd2zYbY4bb\nfzeHMT5FURQliiTV1cEYM09EcgLa1gKISI3+InIxsBUoruWYH7tWvwV+FNZoFUVRlEanTkFRH0Qk\nE/gNcDYQdNopCNcBr7vW+4jIMuAIcI8x5ssQ57oRuBEgIyNjxMCBAxs8bkVRlJbI4sWLDxhjsuvq\nF1FBAdwL/MUYUxRM2whERH4HVAEv2035QC9jTIGIjAD+JyKDjTGFgfsaY6YD0wFyc3PNokWLInQJ\niqIoLQMR2R5Ov0gLitHAj0TkEaAt4BWRMmPMk0EGOAW4EDjT2AmnjDHlQLm9vFhENgP9AZUCiqIo\nMSKigsIYc5qzLCL3AkUhhMQE4C7g+8aYEld7NnDQGOMRkb5AP2BLJMeoKIqi1I9w3GNfBeYDA0Qk\nT0SuF5GJIpIHjAFmicjsMI7znMuV9kkgC5gT4AZ7OrDCtlG8CdxsjDnYgOtSFEVRIoQ0hzTjwWwU\nlZWV5OXlUVZWFqNRxYa0tDR69OhBcnJyrIeiKEqcIyKLjTE1YuECibSNIm7Iy8sjKyuLnJycoG68\nzRFjDAUFBeTl5dGnT59YD0dRlGZCs03hUVZWRocOHVqMkAArrqVDhw4tTotSFCW6NFtBAcEDAps7\nLfGaFUWJLs1aUCiKojRn5q7bxysLdkT9PCooosyePXuYPHkyxx13HCNGjOD8889nw4YNDBkyJNZD\nUxSliXPti9/x25kro36eZmvMjgeMMUycOJFrrrmG1157DYDly5ezd+/eGI9MURQlfFSjiCJz584l\nOTmZm2+uToJ74okn0rNnT996WVkZ1157LUOHDuWkk05i7ty5AKxevZpRo0YxfPhwhg0bxsaNGwH4\nz3/+42u/6aab8Hg8jXtRiqLEHZUeb1SP3yI0ivveW82a3TXSRR0Tg7q15o8/GFxrn1WrVjFixIha\n+zz11FOICCtXrmTdunWcc845bNiwgWeeeYbbb7+dq666ioqKCjweD2vXruX111/n66+/Jjk5mVtu\nuYWXX36Zq6++OpKXpihKE2PrgWL6d86K2vFbhKCIZ7766it+9rOfATBw4EB69+7Nhg0bGDNmDNOm\nTSMvL49JkybRr18/Pv30UxYvXszIkSMBKC0tpVOnTrEcvqIoMeJISaVvedmOwyoojpW63vyjxeDB\ng3nzzTcbtO+VV17J6NGjmTVrFueffz7PPvssxhiuueYaHnrooQiPVFGUpsbTX2z2Lf/j801cMqIH\niQnRcY9XG0UUGT9+POXl5UyfPt3XtmLFCnbu3OlbP+2003j5ZSvL+oYNG9ixYwcDBgxgy5Yt9O3b\nl5///OdcdNFFrFixgjPPPJM333yTffv2AXDw4EG2bw8rS7CiKM2M9hnVaXq2FZTw2Mfro3YuFRRR\nRESYOXMmn3zyCccddxyDBw/m7rvvpkuXLr4+t9xyC16vl6FDh3L55Zfz4osvkpqayhtvvMGQIUMY\nPnw4q1at4uqrr2bQoEE88MADnHPOOQwbNoyzzz6b/Pz8GF6hoiixYsa31ktiRkoiAP/4fDP/W7or\nKudqtkkB165dywknnBCjEcWWlnztitIS2HOkjFMe+hSAeb8ex+mPzvVte+fWUzmxZ9uwjhNuUkDV\nKBRFUZoYxRVVvuVeHdL9tq3Jtzw8SyqqKCqvIhKooFAURWlilJRb8VNjj+8IwD0XVM8glFda2y5+\n6muG/HE2hWWVNQ9QT5q1oGgO02r1pSVes6K0NByN4pYzjgPgJ2N6+7YVllVxuKSCDXuLALj82W+P\n+XzhVLh7XkT2icgqV9ulIrJaRLyuqnXufXqJSJGI/CrEMduLyBwR2Wj/b+fadreIbBKR9SJybkMv\nLC0tjYKCghb14HTqUaSlpcV6KIqiRJESW1Ckp1oRDqlJidz7g0EA7Dtabb8AWJt/7MHG4cRRvIhV\nuvQlV9sqYBLwbIh9Hgc+rOWYU4FPjTEPi8hUe/03IjIImAwMBroBn4hIf2NMvfNU9OjRg7y8PPbv\n31/fXZs0ToU7RVGaLyUV1iPR8XgCmHJqH2Yu3cWa3YWUVVopPVKSEqio8rJ0xyFO6tUu6LHCoU5B\nYYyZJyI5AW1rIXjtAxG5GNgKFNdy2IuAM+zlfwOfA7+x218zxpQDW0VkEzAKq2Z3vUhOTtYqb4qi\nNEscG4WjUTgM79mWt5dUu8heNboXL3y9jYn/+IZtD1/Q4PNF1EYhIplYD/z76uja2RjjBADsATrb\ny92Bna5+eXaboiiKYuPYKNwaBUC7jBSO2p5O9188hCHd2vi2Hcs0fKSN2fcCfzHGFIW7g7FGX+8r\nEJEbRWSRiCxqadNLiqK0bO57bw0A6Sn+GkXbVtXR2sO6t2HSyd2Z8r0cAA6VNNz7KdKCYjTwiIhs\nA34B/FZEbgvSb6+IdAWw/++z23cBPV39ethtNTDGTDfG5BpjcrOzsyM1fkVRlCZDSpL/I7xLm2pH\nlh7tWiEijMxpD8D+o+UNPk9EBYUx5jRjTI4xJgf4K/CgMebJIF3fBa6xl68B3nG1TxaRVBHpA/QD\nFkZyjIqiKM2VEb0tofDrcwfQITMVgKw0S+s4egzxFOG4x76KZUweICJ5InK9iEwUkTxgDDBLRGaH\ncZznXK60DwNni8hG4Cx7HWPMauANYA3wEXBrQzyeFEVRmjMdMlIY3ad9jfbsrFQ2TTuPW8cd72tr\nbU9HPTJ7PflHSht0vnC8nq4IsWlmHfvdG7B+g2u5ADgzxH7TgGl1jUtRFKWlkpyYQJ+OGUG3JSX6\nv/87GsXCrQcZ89BnrLj3HFqnJQfbNSTNOjJbURSlOVLp8ZKcGN7ju3vbVn7rX208UO/zqaBQFEWJ\nY3IfmMNVz/mn4aioh6BIS07kq9+M48GJQ4GGGbVVUCiKosQpM5fmcaCogq83Ffi1WxpF+NXserRL\nZ/JIy6F02qy1vLZwB8X1yCyrgkJRFCVO+fc3wStYVnpM2BqFQ4JdJrXC42Xq2ysZ/Mc6fZCq963X\nmRRFUZRGo1Wyf+R1WaUHj9fg8dZfUASSHhDVXRsqKBRFUeKUtunV3km7Dpcy8Pcf8cSnGwFITgp/\n6imQxfecxXlDuobdXwWFoihKnNLGlZLj602Wt9LfbEHRPj2lwcdtm57CL87qF3Z/FRSKoihxSqWn\nOg3eXW+u8Ns2fmCnBh83MUHo2T697o424dSjUBRFUWKAx+sNuc1J0VEfHpw4lNLK+ie7UEGhKIoS\np1R6QyfWTkyov43iytG9GjQOnXpSFEWJU6o8oTWKxkQFhaIoSpzi8Ro/zaFHOysdxyM/Gtao49Cp\nJ0VRlDjE6zV8snYfbdOTOWwXHTpzYCfuu2hIo49FNQpFUZRaqPR4mfLCQpbuONSo553xrRWVfdhV\nma42m0U0UUGhKIpSC9sLivl8/X5++cbyeu9bUeVtcK3qDXuP1mirrIqNzUIFhaIoSi2UVVoP5y0H\niuu1n8dr6H/Phzz84ToA/u+lRbyyYEfY+x8prdYk7r/Ymm6qUo1CURQl/nA/sOvDnz9eD8DLC3aw\nZX8Rc9bs5bczV4a9v1sRcSK0K2PkBRVOKdTnRWSfiKxytV0qIqtFxOsqb4qIjBKRZfbfchGZGOKY\nr7v6bRORZXZ7joiUurY9E4mLVBRFaShuQVFeFX6w2tOfbwagU+tUFm2vv33D7e2UbC/HraAAXgQm\nBLStAiYB84K05xpjhtv7PCsiNTyrjDGXG2OG2/3eAt52bd7sbDPG3BzmdSiKokQFtzH53ndX19l/\nwZYCtuwv8q1v2V/MjoIS3/orC3bU+sBfv+copz78GbsPV9e37tQ6DYCcDsHLn0abcGpmzxORnIC2\ntQAiEti3xLWaBtQ6oSbWAS4Dxoc1WkVRlEbGrVF8tanuMqKXT/+2RtuynYd9y7+duZKn5m7itRtP\nCZpv6acvL2bX4VJ2uQTFiN7tmHH9KEb36VDf4UeEiNsoRGS0iKwGVgI3G2NqK6N0GrDXGLPR1dbH\nnnb6QkROq+U8N4rIIhFZtH///giNXlEUxR+3oHBrF8EorQg+NbXvaJnf+q7DpZz2yFy8QYzTHTOC\n53A6rV82KUmxMStH/KzGmAXGmMHASOBuEUmrpfsVwKuu9Xyglz0ldSfwioi0DnGe6caYXGNMbnZ2\ndqSGryiK4seR0grf8tGy0O+9pRUefvnfZX5t14/tA8DewuB1qtftCeICG5AIsCE5nSJN1MSTPT1V\nBAQNI7RtF5OA1137lBtjCuzlxcBmoH+0xqgoilIX32wu8KXOAMg/Uhq032vf7eCDlXv82jplWdrB\nkdJK2mfUrB9x2CWEwIq7WLrjsF/bHfWoGxEtIiooRKSPY7wWkd7AQGBbiO5nAeuMMXmu/bNFJNFe\n7gv0A7ZEcoyKoijhUlxexfaCEvIOldK7g2VP2LwveDxFYNlSgHau4kIdM1MY2r2N3/Yil4by2bq9\n9L/nQwA/wXTb+CYgKETkVWA+MEBE8kTkehGZKCJ5wBhglog4VbrHAsttd9eZwC3GmAP2cZ5zu9IC\nk/GfdgI4HVhh7/8mlo3j4LFcoKIoSkPZW1htW3j31rEkJggLthb49an0ePF6Dat3F/raHFtC7w7p\npCVby9lZqbz3s7F8ePtp/PgUK933oZIK3l2+m399tZXrXlzk2/9PlzRu0r+6CMfr6YoQm2YG6TsD\nmBHiODcErE8J0uctLHdZRVGUmLPvqGVbeGHKSNqkJ9OldZqfNxJAv999yAXDujJrRb7V99qRjBvQ\nicMlFbRNTyErLZmyynI62oWGTujamjvPHsB/vt3Bb96qGYDXvW0rn/YSL2hktqIoSggcjcKZCtp1\nuJS3l+zyBd55bK8lR0gAnNHfcq5pa087ZaVZ7+MdXRXpMlODv6NfOKwr/75uFCmJ8fVojq/RKEoz\n4oOV+Tw+Z0Osh6EcA/ttjaJTlr/z5s6DVsjYoZKKGvsExpc5dgq3oAjl5vrYZSdyfKdMklVQKErL\n4JaXl/C3TzfW3VGJWw6XVJIg0LqVpQHcNWEAANNmrQWgoMhfUIzpWzMg7spRvUhLTmBUn/a1nisr\nLYnUJMsgnhyjeIlQxNdoFKWZcMQVmPXlxv0hXSqV+KbKa0hKSPBpCecN6QrA3PVWkG9BkX98xLSJ\nNaMBLhnRg+V/PIcRvdsFPcd7t40F4G9XnORrS4qD2Ak3WuFOUaJAQXH1A+Qn/1pIalIC6x84L4Yj\nUhqC1xgSXK/Tbe0srgDfbTvIgWJ/jaJvdmbQ4ziagpt3bzuV3YfLGNqjDesfmODXR6eeFKUFUFzu\nn8qhPKDgzOLth3yGUCV+8XgNiS6bQ2uXoLj0mfl8u6Ug2G5hMaxHWyYM6QLUFCTxEI3tRgWFokSB\novLQqR7mrNnLJU9/w2vfhV/ERokNHq8hwfXQTkwQXxEhgCWu9OH3/mBQo46tMVFBoSgRxus1/Oq/\nVtnMjpnVkblllZaWMX+z9Rb67BeadCDe8RpT4+3+J6f09i07uZ9+dU5/rvleTmMOrVFRQaEoEWbn\noRJfUNaHt5/OdadaieEKyywDt8dO+rbjYAlr8wu5++0VPiGixBdVAVNPDsv/cA5gxVW0aZXMbeP7\n1XCLbU6ooFCUCJN3qNrDKTsrlRN7Wvl9nLdPj6vG5XlPfMmrC3fWSASnxAdeb02NAqBNejLjBliB\ndcFyPDU3VFAoSgT4ZtMBcqbOYvxjn7Pdrmb2xOThQHVkbmGpo1HUNGKnJDXft9GmjCeEoAC4+KTu\nABRX1FZyp3mggkJRIsANL1kJ3bbsL2bHwRKSEoQLh3UDqiNzJ/7jGzbtO0pZZc0ymOVB2pTY4zGG\nhBBTSn07Wq6w2ZnBCw01J1RQKEoEcM0m8cwXm8lMS/K9iToPFIDr/73INwV1/tAuvvbyWmooK7Ej\n1NQTwMCuWfzklN78a8rIRh5V46OCQlGOgbnr97FmdyGlAcZod8nMNunVvvfbC0rYfbiU3N7teGhS\ndSpp1SjiE48JHdOQnJjA/RcPoU/HjEYeVeOjkdmK0kDKqzxc+8J3YfX94YndeHf5bgDW5BfSo10r\nWqdV//ycbKRK/OD1GorLq4iz2LeYoBqFojSQkvLwH+73XHCC33reoVJEhKnnDQSsEphKfPGnj9bx\n2bp9VGkEfVgV7p4XkX0issrVdqmIrBYRr7tqnYiMEpFl9t9yEZkY4pj3isguV9/zXdvuFpFNIrJe\nRM491gtUlGjhnm6qK4lbp9ZpfpG7J/dqC8Ckky3PmcAUH0rseWuJVaU5MB1LSyScqacXgSeBl1xt\nq4BJwLMBfVcBucaYKhHpilUW9T1jTDD/sb8YY/7sbhCRQVglUgcD3YBPRKS/MUY/KSXuKKmo/lq2\nTU8mKy2Zi4Z346X52/n1uQNq9HfyBKWnJDLj+tEApCZaPvgqKOIPJzGfEyDZ2HwzdXzc5AMLpxTq\nPBHJCWhbCzULdBhjSlyraUB9r/Ii4DVjTDmwVUQ2AaOwanYrSlzhjqY+UFTBonvOBuAXZ/UP2r9r\nG6tKWuu0ZDLsCmepdj1lnXqKP5ziQodcjgmNSbe2rWJy3mBE3EYhIqNFZDWwErg5hDYB8DMRWWFP\nbTmJ2rsDO1198uy2YOe5UUQWicii/fv3R2z8ihIubo3i52f2q7P/Sb3ackrf9vz9yuq6A07JSzVm\nxx9O4KQSBUFhjFlgjBkMjATuFpG0IN2eBvoCw4F84LEGnGe6MSbXGJObnZ19TGNWlIbgtlGc0rf2\n6mUAacmJvHbjGEbmVPdNSBBSEhNUo4gzVuYdifUQ4oqoeT3Z01NFQI2ST8aYvcYYjzHGC/wTa3oJ\nYBfQ09W1h92mKHFHqZ264dzBnf0e/vVFBA4W16y9XBdllR5f7WYlsrSEtBz1IaKCQkT6iEiSvdwb\nGAhsC9Kvq2t1IpYRHOBdYLKIpIpIH6AfsDCSY1SUSOFoFFPPO+GYKpKVV3l57buddXd08c2mAwz8\n/Uec9sjcBp9XCU16SnWiv//demoMRxIfhOMe+yqWMXmAiOSJyPUiMlFE8oAxwCwRmW13H4vl6bQM\nmAncYow5YB/nOZcr7SMislJEVgDjgDsAjDGrgTeANcBHwK3q8WTVX77s2fks3HqQ577covPZcUJp\nhTVdFKnsoZX1SONx11srfMveOPGMaU64b+nwnm1jN5A4IRyvpytCbJoZpO8MYEaI49zgWv5JLeeb\nBkyra1wticfmrGfh1oNc9qzl/OXxGm76/nExHpVSYk9PtEqJjKDYebAkZM3lQHI6ZPjSmVd4vKQl\nNP9U141JvLilxgsamR1nfLZuL+v2FPq1vTR/u9/6Qx+uY8mOQyixxXGPPVaNYvJIyyy3eHt4n2ml\nx8tXmw74rTcFXlu4g8/X74v1MMLCGBUUblRQNDJer2HJjkMhv4jXvbiICX/90rceqt/fP90YlfEp\n4VNS4SEpQXz+9g3ljrOtuItKT3gPp1kr8v3Ww90vlpRWeJj69kqmhJkbK9aoQuGPCopGZu76fUz6\nxzf8+5ttNba5A7hmr94DwNHy4N4Xc9fvV/U4xpRWeiJin3Cyk1aFGQEcmHso3l1r9xaWsTyvaVXw\n09+WPyooGpkdtjvj+r1HfW2Hiiuo9Hh9wgHgphmL2bTvKJv3FYU81rPzNrPvaJlfm8dr1LjZSJRW\neCJin0hOsH6GVWFqBoEOVvE+9XTry0uYPP3bkNs37j3K/M0FjTiiutGpJ39UUDQixhjue28NUB2R\na4zhpPvncOcbyyko8velP+vxefxupuU5/ObNY/h/Fw322/7IR+sZNe1TjpZVpxiYPH2+ukw2EqWV\nkREUiYn10ygSE/x/tvGeJ2pRgO0l8CF89l/mccU/QwuSWODUNX/6qpNjPJL4QAVFI+L+QTtTSk4a\niPeW7+ZwSc2gqzX5hQzr0YbcnPZcPSbH1/6786vTVu85Uq1VfLftELsOl/LOMo1TjDYlFZGZenIy\nz4ZrawjMVBtvGoXXa9i072jI7fEu2KDaRtGpdbDEEi0PFRSNSLHL3lBYai0XurSBvEOltE1P5pup\n4/32u8YlIDLsN9gzBlSnLZn2wVqqPF6KXMd/6IN1ER27UpOyCGkUzoM/3HnxwBrO8SYo/vXVVs56\nfB6rdllpMPpm+1eAK62I/zggZ/pWixZZaIW7RmTB1oO+ZUdAHDharUW8vXQX5wzqTLe2rXjmxycj\nIni8hvOHVgeyz77jdFbvLuT4TtX+9p+v389P/rWQ+Vuq53kPl9Y/JYRSP8qrvL4pxGPBZ8wO84Ef\n+PAqiZMHrzGGhVsPsmi79T3fcbCEId3b1BBkhWWVtMtIadDxi8qryEpLrrvzMeI1jqBQSQGqUTQq\nt7y8xLdcWGoJim+3+Bvx7r/YSo01YUhXzh3cxU9IAPRol865g7sgIqx/YAIX2NvnBxwnRin0WxQe\nryEp8dgfJCJCcqKEXUktsNu9764+5jFEgvdW5HP59G+ZvXovAAVF5UBNr6zvP/o5hWWVbNh7lNcW\n7gj7+P/6aitD7/3Yb6o1Wjj3OFS97JaGCooYsW7PUb7bdpBpH6z1tX2/fzad6zEnmpqUyB9dVdMc\n+mZnUOHxalBelKnyeElKiMxPKDEhfEHhTFFdNLwbYH2X4oH8w6V+679/xxJgFVVexg/s5KvmB5Zd\n7Vf/Xc7Ut1eGffz37PiR/COlGGPYEcU04M49VoXCQgVFI3LFqF6AJRAArgsIPhrcrXW9j9mpdRo/\nPcM/nccdduEczSwaXSo9huQIaBTOsQ7Yb+B14XhHTR7Zy9cWD7EUaUEM++VVHio9hj4dM3j8suG+\n9rJKDyvqmcrbqTSXIMLHa/Zy+qNz+WTN3mMbdAgczyzVKCxUUDQyHTNTeX7KSNJTEn2eTxcN70av\n9ulcMqJHg4554bDq6amfnnEcY4/vCFDD3bYl8KeP1nHn68sa5VxV3shpFB6v4e0l4XmqOfEWHTOr\n5/mLQwRmNibuabh26ZYd4cnPNlFR5a0Rvf7e8t019q8r/scxdeQdKmWFHcC3YGt04i88aqPwQwVF\nI1Je5SE1KYHEBOHkXlZRv/YZKTwx+STm3TWO48JMCBdIe5dh8DcTBtKmVTIJAoeCuNs2d57+fDNv\nL93VKNpUlScyNor64kyLtEpJ5M+Xngjg5/EWKxxvpjatkplz5/cBK09Zhaem0f/rTTUf8JW1GNY8\nXuPTKG59ZYlPG/nfst1RiaJ2DqmCwkIFRSNSXuklza6R3K+zJRRSjzFPEFhaSrv0ZB65ZBhgVU1r\nl57SoGI4TRn3w3LZzuinjKj0emvENDQGji0jOTGBTLv2ttvNOlYUl1uC4pup4+mYmcq1p+ZwxHba\nyEpL8m0DKz4okFCR6SUVVRz32w/YsLc6S8Fy+/Pdf7Sc4377QeQuwsYYdY91o4KiESmr9PjmcQd1\ntewR+RHw4EhOTGDpH87hspHVxQHbZaTw30V5fqkRSis8cTFFES3ciRKPNVFfbZRVeigqr8LjMSRF\nwD0WYFQ9KuQ5b9aJCeJ7ABeVxf5zLamoIi05gQxbeHVv28q3zRlnt7atyOmQ7mtfee85XHtqDhA6\nHsSJOfJrK6uKWB0QNwu2FPD055t9WopqFBYqKBqRbQXFdG1jeTVNPKl7Hb2PjXbpyVR4vH6pEcb9\n+XNOvn9OVM/b2BQUlbMi7zBz1+/j2XlbfO3h5k1qCD/4+1cM+eNsKr2RM2YP6d6GzNQkyio9vDR/\nG/e/vyZk3wr72pLcgqIBLwCHiisiOm1TXFFFRkp1aFabVtXxDpmp1cvbXN5KWWnJ9O1oBeT96aP1\nQXMsuQVIF5dX4Nh+HX3LkQriu3z6t/zpo3WUVVYLYyW8CnfPi8g+EVnlartURFaLiNdVtQ4RGSUi\ny+y/5SIyMcQxHxWRdSKyQkRmikhbuz1HREpdx3gmEhcZDxwtq2TLgWKG9bCqZTlvohMGd4nK+QI9\nUGYuzWNPYRnlVV4OHcOU1OGSCh78YG1ceNl8sDKfEQ98wg+f/JprbQ8yx3Ms3LxJ9eFQcQVPfraR\njXaixki6xyYnCZUeL2Me+pQ/vLOaf3211S+Hl5sSWyikpyT5pp6O1lOj8HgNI6d9wpQXIldpuKTc\nQ3pq9ffOEWIArVtVLz8xebjffk4Z2VcX7mD/0ZqeX+6syj+0XYIBTurVlhG9LVtfJOxxbmGzraAY\nUPdYh3C+5S8CEwLaVgGTgHlB2nONMcPtfZ51amgHMAcYYowZBmwA7nZt22yMGW7/3RzG+JoEW/YX\nYwwM7JLla9s07Tz+EaWkY+4f6awV+dzx+nLf+ryN+xt83L/M2cD0eVtinkvq600H/AIYHW4/sx8Q\nnRoNU178jj9/vMG3fqikMmLG7JTEBCo8Xg6VVAuH7QUlvL0kj5/+Z7GfR1BRRRUpiQmkJCWQaX/O\ngenoDxSVc997q9lbGHxq82hZJVVew5cbDwTd3hACNQpnCgqsinwOZ/Tv5Lefe/ruQBBPPeftHvw1\nir4dM7nx9L4Afva4N77byd31iM9wcGdi3mhnd1aNwqJOQWGMmQccDGhba4xZH6RviTHG+camAUF/\nrcaYj139vgUa5hfahHC+yB2zUn1tSYkJJETpi/i7C6oD8W59xf+But4O0KryeNl2oLhBx6/vG2yk\ncT8Ivvv1Dh6TAAAgAElEQVTdWfz0jONYd/8EhvZoA0Qn/5GTu8hNcoRsFEkJCQTOuhSXV3HnG8v5\ncNUefv7aUpbtPMymfUVsP1BChv3mnmVP6bhtFEdKK8l94BNe+Hobc0LEGbg/v0ilpd9zpIzWftNN\n1YKim8tekZHqr+26p++CxZKUujSK1q2SGT/QEjQjerfzefw5GoUxhrveWsGrC3cETbJZG+5zz11v\nvUypjcIi4jYKERktIquBlcDNLoEQiuuAD13rfexppy9E5LRIj6+xMcbw9083+rw82qfXP8dNQ+je\nthW/PndA0G3/+Hwz3207yJ1vLOeMP39eL1fSNDsJ3l8+2cCh4goueuprZny7PWjfwyUV5EydRc7U\nWVz34ncYY1i160hEpq2cOflROe3JzkrlNxMGkpac6JsKCjdvUn1wxy04RMJrDaypp0DcD8j3V+Rz\n8VNfc9bjX/DR6j2+t/W05ASSEsRvmupfX1bbahyvo0DcXlLvragZ09AQ1uQXcqItqMHyxnNwv5kn\nJSbw2/MHMuvnYwF/YXvNCwtr2CncU08dMlJ48sqTeO+2sWRnpdLO/j05L2Jub6q73lxRr/EfKq55\nr1RQWERcUBhjFhhjBgMjgbtFJGROChH5HVAFvGw35QO97KmrO4FXRCRouLKI3Cgii0Rk0f79DZ9K\niTbr9hzlsTkbeHS2pYB1CPKwiRYZAZlNT+zZ1pcb6tJn5vOuHfS0MsibciicH2ZJhYern1/I8p2H\n+f3/Vvn9mB1W7ar+0X62bh/vLt/NhX//ij9/XEMZrRcfrcrnYHEFPzyxG/+8Otdvm/N2Go2pJ2f6\nZJwrc2/XNq1Cda8XwZILOu6mwXDe1kWEzLQkP2P2G4vyfMvvLgsuBNwaRSSKBnm9hkqP8Ztuchw3\ngnHj6ccxuJslVNwuxsb4Czev1/B/Ly3yrbfPSCE9JcmnOToaxe2vLSNn6iwWbWt42priiprvtNH0\nnmtKRO0uGGPWAkXAkGDbRWQKcCFwlbFfIYwx5caYAnt5MbAZ6B/i+NONMbnGmNzs7OxgXeKCQO+b\nxsh86ZDu+tF+77gOvHXzGF/6EDehjKbBcLxkurZJ8xMwf3ynZmK6wOp77y23cvVMn7eF1buPsPVA\nMWuD+NPXxc3/sabSppyaQ5t0//vpzHdH2pj91uI8Fmw9yLgB2X4Pw25tI1OvINgU1jebQ9sP3Pmd\nMlOTKCyt5PXvdpAzdRZ7Css4pa/lbuuupOjGLSiONVivosrLt3aEtPvBGq7rcKAd4OPV1dNlWw4U\n+9WvyOnon7Lc7VkF8MWG/SQnCv06ZdaY965Lk3Wy8DrjmXrewBrHb6lEVFCISB/HeC0ivYGBwLYg\n/SYAdwE/NMaUuNqzRSTRXu4L9AO2BO7flDhaHrtAKPccsYj1w700twfv/2ysX7+1+Uf9yrDWhjOP\nm3fIPwFcMK3E+eE98+MRAL700wBvLs5j3J8/57wnvgzYp4qcqbNq2FX2HS3j/Ce+5MT7Pva1OdHt\nbqKlUfzyv5YzQGZasp8toUstb831wW0Uf3DiUABeXmBlVr3vh4P53nEd/Po/PGmobzkrLZnFOw7x\nm7eq7TaDurbhNNt9NJjLqfNy0KZVMu+vyD+m0p+vLNjOlf9cAFiJKutL4KnvemuFz1liuStw8q4J\nA2o8uAOFzGfr9tGzfTodM1NZsKWAhz5cy7vLd5MzdRb97/mQ/CP+31s3ToyRYzAPvOctmXDcY18F\n5gMDRCRPRK4XkYkikgeMAWaJyGy7+1hguYgsA2YCtxhjDtjHec7lSvskkAXMCXCDPR1YYe//JpaN\nw8+Q3tRwBws9eeVJjXpu95vvDadZ3iEiwpDubfjr5cN59f9OIUHgxW+2cdOMxcxdv6/OY77+3U6/\n9TvP7k/vDun0CXjTg2p3wxN7WtMEh10ePS98vc23bIzxPaicgkuzVuRTWuHh759uZNuBYu56cwVr\n8gt90xJO6opAnPrT0SrmkyDwxx8O8gV7uY20x4JbozipV9sa22ZcP5pJJ3fn3dtOZdvDFzB5VHVC\nwKzUpBqCOzM10Sco/v7ZphrnczQK535u3h+6NntdLN5R/TBviM3GG0RI3f6ala9rq8vZ4vLcnjX6\nAfRqn+633iEjhfYZKRSWVfHsF1v4+atLfdu215Jx1pnqc3KntW5E7T/eqbNwkTHmihCbZgbpOwOY\nEeI4N7iWjw/R5y3grbrG1JQor6qeZx7VJ/zo20iQ6fIuGTfA3yXxYjvgr3u7Vuw8aD1krn3hO7Y9\nfEGtx2yfkUJJRfVDqaLKS/uMFGatzOfhsko+XLWHDXuOcuu4431uuJ2yqt+6T+jamt7t0/nI1mCy\nUpMY+6e5ZGel8rfJJ/kZxk++fw6llR4em1PtktqldRoPXzKU0/oFn25MSBCSEiRicR5fbNjvNz3m\n8Ro6ZaWx6r5zOVpWGbGHidtG0a9TJmP6dvDVGElPSSQxQfyyr7rJTEvyeys/c2Anrjqlty8m4fE5\nG7jhtD6ku1xXF9pFtP74g0Hc994aPxfU+lLimrpqyJx+MEHh4LZXBMtOC/DxHadT6fEy9F5L29xT\nWMbZgzoza2V+jb6Tp3/LinvPCfq5OZHld00YyCUjetSY5mrJaIW7KOP+EXTISK2lZ+RxHgy1eeBe\nNbo3D39ovcW7p6pCkZacSMfMVN8U1IGicpbab5T/+HwzT3++GYDnvtrq2ycxQZh0cnfeXrKLv00e\nzub9RXy0eg/jBmQzd/1+jpZXsetwKac/OtfvXI7XT9v0ZA6XVPLUlSdzwTD/Qk7ByEhNiliqkmue\n9w9Ic7xgEhOEthH0YHNrFEmJCRy2H5AZKYl+2YGD4f7cOmam8vSPR5CSlEDn1mn0aNeKvEOlvLVk\nFz85pTdllR7eX5HPrJX59O+c6XsYVhyDBlbmehkK1Ci++PUZdU4DhvLOLav0+L04hBIUacmJpCVb\nGtSXGw9w/0VDao04X7u7kJfmb2faxCF+n6ETB5KYIPTvnBVy/5aICooo4zZmN3bwjhP8VJtB7qbT\n+zK6T3se+mAd4QQZV1R56dsxwycobjnjeJbnHWFtfiFf1RK89fhlw31vxMd3ymTd/ROYPm+Lz1/d\nISstiTMGdOK95btJTUpg/QPn4fUaPMaEHbOQmZpUIwAtUvz8zKDK8DETGLjnaDEzbz21TqNwO5dB\n/4Pbx/q91T/yo2Fc+c8FPPrROn50cg/ufnsF/7M9oe6/aIgvwWBlPTWwW19ZQkWVl39eneuXCTZQ\nUPTuUPdbeSiNYukO/8SOdf1+Zlw/2re82GUP65CRwo9P6c0Tdi6wu99eyZYDxZzevyOXu2p6BEaW\nK9WooIgyzo8gVExDNHHSJlxcS14pEeGkXu1ISUrw89sPRaXHS07HdH53wQkM7taapMQEXrpuFCOn\nfVLDoN2mVTKL7jkr6DnTkhPpm139EElOFCo9hicmD2f8wM48dumJvvQJCQlCAuEL2ay0pKgkyft6\n6ni/RHeRJNA9Nj0lkZIKT1ip57u4XHQ7BmitTsqYwrIq3luxm7X51V5QI3Pas9iuglhfjWKWXW1u\nS4BtIyMMrTSQMwZ0Ykj31n7u1FBthL/p9L61foeD4bgtpyUnsPj3Z7Nx71GfoNhi2z0CX6CKyv0j\ny5Vq9K5EGeeN7UcNLEp0LLRNT2H+3eP9bAShSE4UjpTW/bCo9HhJTkzgxJ7VBtfsrFQuObkHby3J\n8+s75Xs5tWoBTgZdgK9/M56X5m/32R6OxX89MzUpKpHj7rQokSbwPr1721i2HigOSwvt3q5aUARG\n+rtjaTJTk9h5yDLmjsxpR0KC+ARUQ43/m+y8VxcO68r7K/L9vhfhkpmaxNs/PZX+93zo1+647Z47\npAsndK1f9cdubVtx27jjOaWv5bkUbNqqpMJDlcfLXz/ZyJDubThaVkV6imoUwVBBEWW8MU5XHG5A\nWEpSQlgPi4oqb9CHvxNc5bwJA/zirH61Hsv99tmpdRq/ipDWlZWWFDRnUH1xz3PfMLZPVL1gHLde\nx4Pn+E6ZHN8pvEJW5w/pQsEPBgXNSCwiPHXlydz6yhJfbqx7fzCIn4zJsc9rfZYNNf7vsw3mf7hw\nEE9e2fC8ZcGy8DrCPq0BLreA3/epZ/t0pv9kBA9+sNaXvfbON5Zz5xvL/fY5c6C/04dioWGHUcZ5\n2MSiwE19SE5M4GhZVdAIazeVHhP0bf//TuvLWSd05t3bTiWnQzqJCYLUIRyj9faWkpTAyl1HjtlF\nttA2KP/xB4O458JBdfQ+NhxNwF2tMFySEhO49tQ+IY3rw1xpNQC6t0v3aSrOZ1nhsdKrPPjB2nrF\nVDi2qmM17DvflYFdsrjFrgHvxK6kJkfmMXXO4C4M7VG7xtOjXXSmFps6KiiijDP1FK3kf5EiJTGB\nXYdLueBvX9baz5p6qnktbdKTee6aXI7vlMXsO05n9X3n1nnO9CjNB8+2I3tf+HprHT1Dc6SkklMe\n+hQganYJN46XVjieZ/UlcNqltWsKLcWlUVzy9DdMn7clZH4oB7cA/usnG8lISYxIqotZPx/L6zeN\nqZH6I5S3U0PoUIcgTo1CMaTmgE49RRnHmB3v6Yodr5vN+4tZtesIQ7q3qdHH6zVUeev2Pgo3Ojcx\nQfjNhIG+wLBIIWJF++4trJmJNFw+XbfXlzpiXCNMRzgP7OOyI++73ypAc3MLaOcBX+nx+q73sY83\ncNP3+9KjnX8gm0Ogo0CkvttO7qfA71ekikMB3HmOlRFo7PEdeWXhDj5b5x9kOkajsYOiGkWUcV6+\n4n3qyZ3P/2+ukqJuHM+YSKXWBvjpGccFFUrHwmv/dwpgFRpqaO3sXXak87xfj4vo9YZizHEd+Mvl\nJ3L3+SdE/NjpyYlkpSZx0+l9mfK9HAZ2rY4RcB7CbhvFjG+388uAuXs3ju3g3MGdAbgkwo4age7A\nWamRsw21Tkvm3h8O5qxBnZk20UpDd+bATnx51zjevHlMjcBUxUI1iijj1DeO93TF4wd25pO11tvV\ngC7Bg42cKYm26fGd2mB03w5kpSXx9tJdvL10F+sfmFDvHES7j5TSMTOFXh2Cv1VHGhFh4knR8YxL\nSBBWhpgKdDSKwOmm2qZ7nBTlk07uwYMTh/oyCkcKd1zIGzeNqaERRYqubVrx8g2jGdG7HWnJifRs\n3zifdVNENYoo42gU8T71dMWonnz0C6v8RyiDqqN1NFZNjWOhletBt3h7/VNP7zpcFrE8TvGMoy05\nbq4Og7qFdkd14m3SUxLpkJkacfvbUJeGGa7nV0M59fiOEbWBNFdUUESZao0ixgOpAxHxuWaGcpX8\n1s491K4BnjmNjfst9J6Zq2rp6c+mfUe5acYiNuw5SrcI1ZqIZxzbyIaAdOS1ucs624LV0IgE7u9X\nW03zHReooIgyHmPCchWNB1Lq8Km/7701QO1vm/GCW6PYcqCYwrJKqjxebpqxiJcXBK/IB3DW4/OY\nvXovewrL/ALZmitOEkWnvsVnv/w+WalJVFR5eezj9VwdkOsKqhNdRstDyG0TindvwZaC2iiizIq8\nI7UmKIsnkhITSJDg6Rwcl8gLhnVtEumXdwSUd127u5BubVsxe/VeZq/ey5BubeqMIm5ITENTpMr1\n/eybnUl6aiKllR5mfGYJ1Ioqr5/7a7Q1CoBrxvQOK0+U0jioRhEFjDHc+foy3lycx5e1JMqLR1KS\nEoJqFE4g3ok9IuuhFC2c6HAndcreo+XsL6p2l73oqa+D7jfAlTX0ouHdojjC+MMJgExKSODNxdXp\nWA4U+bsZO2600SwTet9FQ7hubJ+oHV+pHyoojoETfv8ROVNn8dAHa/2K1W/eX8TbS3fxq/+GdjGM\nV1ISE3wPgrJKD68t3IExxtfW1Ax/l9nFbiqqvDWK+wTDyS80vGfbkHEEzZU7z7ZiDHYd9r9PgXmz\nHrfrgzSkSJHSNNFP+hhwvD+enbeFYfd+7DMIHiyOXfnTYyUtOdFXme7hD9cx9e2VfL5hv0+jaGje\nnVjhuFpWVHlZFaRcayBF5VVcPaY3/7v11GgPLe4YFiK9hfslaMGWAl+VOBUULYdwSqE+LyL7RGSV\nq+1SEVktIl5XeVNEZJRd2nSZiCwXkYkhjtleROaIyEb7fzvXtrtFZJOIrBeRuvNAxBH5R8oA/NJ1\n33h6X34f5TxBkaRr21bstusKO2/gFVXVUbuRyrvTWDg5iCqqPD4B6OCeXgFryrC4vCoqaTTimV+d\n05/7Lx7iq8C45v/5/+y+sGuGvL9iN9e++J2vPZpTT0p8Ec4n/SIwIaBtFTAJmBekPdcYM9ze51kR\nCfarmwp8aozpB3xqryMig4DJwGB7/3+ISFy+wnqDGKidt273A+mX5/Tn+iY01+pURINqo3ZKUoLv\n2uobuBZrnHn377YfYt/RMjq3TiU7y6rZEDg1WF7lpcprGlRToSlz2/h+/OSU3r719JQkhrsM/U/O\n3cTGvUe57ZWlPttP344ZLe4+tWTqFBTGmHnAwYC2tcaY9UH6lhhjnAnNNCCUu89FwL/t5X8DF7va\nXzPGlBtjtgKbgFF1XkUMCFbk5+tNB1i3p9D3UH3rp2Oa3IO1Y0YKBbbxstwnHBJ8NZWbikbx/JRc\nfnxKL99b76wV+cxevZfUpEQmDO4CUCP5XDQT8zU1MgIqvf3zyy2+5X6dMvnsV2c0SmoTJT6I+Cct\nIqNFZDWwErjZJTjcdDbGOJXP9wCd7eXuwE5Xvzy7Ldh5bhSRRSKyaP/+/cG6RJXP19c850vztzPh\nr1/6hEhTjOxtn5FKYVkVy3ceZsFW6/0gQcSXcru2sqrxxPiBnXng4qE1cmylJCXwq3OsOgW5Oe19\n7VUeL79/x5pd1TdlK6miG7cLrQqIlkfEP3FjzAJjzGBgJHC3iNRaXs1Yye/rHWhgjJlujMk1xuRm\nZ2c3cLQN55kvNofc5mgUrZqYhxBA+0xrTt/tPurxGg6XWuk7mlqkbGCg454jZbRJT6Z/50y/OtFf\nby7gg5V7ANUooDrr8YMThwKw2lWm9J4LI5+4UIlvovZqYIxZCxQBQ4Js3isiXQHs/06u311AT1e/\nHnZbXOH1GlbuOkJyopAV5KHizOM2NVdSsKaeAimr9PjSYBxrgZpY47i/Blb0c9uVGqP+RLxzwTAr\nhsSJwl/vSvERbtVEpfkQUUEhIn0c47WI9AYGAtuCdH0XuMZevgZ4x9U+WURSRaQP0A+omUMgxmy2\nC8pXeQ3f3D2e7353lt/2I6WViDRN98Fg0cgfrNxDsf0gbS5v28mJCX4R6O5gvL5RqAnR1Pjx6F6s\n/X8TatTHeGHKSPp01PvT0gjHPfZVYD4wQETyROR6EZkoInnAGGCWiMy2u48FlovIMmAmcIsx5oB9\nnOdcrrQPA2eLyEbgLHsdY8xq4A1gDfARcKsxpvbanDHg7L9Yzl4vXjuKrLRksrNS+cOFg3yZLg8U\nldMqObFJ5HcKJJhdZemO6uyrkSwiEwvSbGN8SqJ/BPqeI6UkJgibHzxfbRRYU3atUhL9pk/btEpu\nlCJOSvxR5y/CGHNFiE0zg/SdAcwIcZwbXMsFwJkh+k0DptU1rnjAnc7iurF9aN0qmV/9dzkFRRVN\n0j4Bwaddthwo9i03ReGXmlQdbb7onrMBa+rJmYaq8nh5au5mMlIS4z4dfGPjLiJUV4lUpfnS9OZG\n4ojA+foM22e/oLi8SdonwD9bZ3N5Zj5wsWUme3DiUN/UWUpitY3CyZw6vFftSQJbKk5qD6Xlojp2\nA8hMTfLlEHKTbj+EDhytqOGH3hRp0yqZQyVN/y3y0tyeXBrwebVulczafMuTx/l/3w8HN/rYmgKO\nB9S4AY3vXajEB6pR1BOv11BUXkVmEEHgaBR7CsuaTLxBbTiukc2Rfp0z2X2kjKNllSzZcZistCT6\ndoxuNbWmyrWn9uHHp/TiyStPjvVQlBihGkWY5B8pJSstmSp7uqJ1EEHgNoI21aknsNIz7C8qb9ZT\nMU5m2LcW57Fy12GG92yrRXJC0KZVMg9c3HxfGpS6UUFRC8YYnvh0Ix+v3sua/EK6tknjhWtHAtCl\nTc04woyU6tvp1Jduisy58/uA/zWc0LU1z0/JDbVLk6OTne/p3vfWkJqUwKW5PWI8IkWJX1RQ1MLR\n8ir++slG33r+kTIm/PVLADq3rikoWreqvp0XDusa/QFGCcfzJzsrlf6dM9mwt4hubdKaVaDV6D7V\n6TvKq7zN6toUJdKojaIWyoIk/nPonBVEULhKhN467viojKmxOfMEKw1Xc8vvE+jmO8olOBRF8ad5\n/fojSFmlh2mz1obc3ql1ao029xx3U4w3CIaTVC+5CUaZ18WPT+nlW+7vKoGqKIo/ze/XHyFeW7iD\nd5btDrk9lLH6rgkDmP6TEdEaVqOTYAu8A0fL6+jZ9Bjpyh7bHLzUFCVaqI0iBBv2FQVtv23c8Yw5\nrkPI/W45o3lMOTk49ZPnbymI8UgiT0GRZayf8r2c2A5EUeIcFRQheGXBDt/yCV1bsza/kNze7bj9\nrH7Nbr6+Npzo5d+ePzDGI4k8k07uzqLtB/nZ+OYl3BUl0qigCIPbz+zHqD7tg2ZWbe44gqJ72/QY\njyTytE1P4R9XNZ9pQkWJFioowuDcwZ2bjXG6vlRUWekbkpp41lhFURpOy5lDqScDXF4wLVVIQLVG\nkdKCptsURfFHf/0hKKuKuzIYMcEpvtSUU5IoinJs6NRTCMoqPXTMTOXRHw2L9VBiyoOThjK4Wxu/\nSGZFUVoW4VS4e15E9onIKlfbpSKyWkS8rqp1iMjZIrJYRFba/8eHOObrIrLM/ttmV8RDRHJEpNS1\n7ZlIXGRDKKv0csHQLi2+olfHzFRuP6ufJsxTlBZMOBrFi8CTwEuutlXAJODZgL4HgB8YY3aLyBBg\nNtA98IDGmMudZRF5DDji2rzZGDM8rNFHkbJKD6k63aIoihJWKdR5IpIT0LYWahp5jTFLXaurgVYi\nkmqMCRrWK9YBLgOCah6xwhhDeZWXtGaYtkJRFKW+RPNJeAmwJJSQsDkN2GuM2ehq62NPO30hIqeF\n2lFEbhSRRSKyaP/+/ZEaM4CvvnJaimoUiqIoUREUIjIY+BNwUx1drwBeda3nA73sqac7gVdEpHWw\nHY0x040xucaY3OzsyJZodLLGpiWpoFAURYm4oBCRHsBM4GpjzOZa+iVh2Tled9qMMeXGmAJ7eTGw\nGWj0yu5llbZGoTYKRVGUyAoKEWkLzAKmGmO+rqP7WcA6Y0yea/9sEUm0l/sC/YAtkRxjOPg0imS1\nUSiKooTjHvsqMB8YICJ5InK9iEwUkTxgDDBLRGbb3W8Djgf+4HJx7WQf5zm3Ky0wGf9pJ4DTgRW2\nu+ybwM3GmIPHdIUNwAm2U41CURQlPK+nK0Jsmhmk7wPAAyGOc0PA+pQgfd4C3qprTNGmeupJNQpF\nURR9EgZBjdmKoijVqKAIgiMoNOBOURRFBUVQ1JitKIpSjT4Jg7A8z8ooosZsRVEUFRRBefpzK/xD\nBYWiKIoKilpppYJCURRFBUUwTuzZFqBF1shWFEUJRAWFzdOfb2b9nqMACHBav46xHZCiKEqcoIIC\nqPJ4+dNH65jwxDzAyh6bqjEUiqIogAoKAKq8BgBj/aO80qOusYqiKDb6NAQqPV7fcnmVh91HStXj\nSVEUxUYFBVDlMb7lbzYXUFbppV16cgxHpCiKEj+ooAAqvdUaxYItVrLa84Z2jdVwFEVR4oo6s8c2\nN4wxrMkvxOuFtXsKuSy3Jx5vtUbxzBebSRDI6ZARw1EqiqLEDy1OUHywcg+3vrLEt35G/2y/qSeA\nfp2yNIZCURTFpkVNPZVWePyEBMAlz3zDoZIKvza3cVtRFKWlE06Fu+dFZJ+IrHK1XSoiq0XE665a\nJyJni8hiEVlp/x8f4pj3isguVxW8813b7haRTSKyXkTOPdYLdPPByvwabTsPlvLDJ/2rtm45UBzJ\n0yqKojRpwtEoXgQmBLStAiYB8wLaDwA/MMYMBa4BZtRy3L8YY4bbfx8AiMggrBKpg+1z/sOpoR0J\n3BNMfTuGtkGc1KttpE6pKIrS5KlTUBhj5gEHA9rWGmPWB+m71Biz215dDbQSkdR6jOci4DVjTLkx\nZiuwCRhVj/1r5WBxOQALf3sms+84neM7ZQbt9/w1IyN1SkVRlCZPNG0UlwBLjDHlIbb/TERW2FNb\n7ey27sBOV588u60GInKjiCwSkUX79+8Pa0D7j5aTlpxAdlYqyYkJvHPrqVw1updve3qKpby0U0O2\noiiKj6gIChEZDPwJuClEl6eBvsBwIB94rL7nMMZMN8bkGmNys7Ozw9qnoKiCDhmpiAgAGalJ9HNp\nFf+8Opd19wfOsimKorRsIu4eKyI9gJnA1caYzcH6GGP2uvr/E3jfXt0F9HR17WG3HTMHiyt4e+ku\nEsS/3UkpDjCmbwcSAjsoiqK0cCKqUYhIW2AWMNUY83Ut/dxhzxOxjOMA7wKTRSRVRPoA/YCFkRjb\nN5sPAOD1D5mgb8dqjUKFhKIoSk3CcY99FZgPDBCRPBG5XkQmikgeMAaYJSKz7e63AccDf3C5vnay\nj/Ocy5X2EduFdgUwDrgDwBizGngDWAN8BNxqjPFE4kI9gRLCpk16Mt3btuK35w+MxGkURVGaHWJM\n8AdoUyI3N9csWrSo1j7T523mwQ/W8d+bxzAyp30jjUxRFCV+EZHFxpjcuvq1iMjsxdsPsq2ghPSU\nRHJ7t6t7B0VRFMVHs8/1tK+wjEueng/A8Z0yfR5PiqIoSng0e43iaHmVbzlJjdWKoij1ptkLiqKy\nakHx/y4aEsORKIqiNE2avaAoLKv0LY/qo0ZsRVGU+tJsbRRVHi8FxRUUlloaxfs/GxvjESmKojRN\nmq1Gcd97axj94KfkHykFoEOm5m9SFEVpCM1WUMz4djsA322zEt+2TkuO5XAURVGaLM1SULiDCGev\ntunweLMAAAs5SURBVNJKOZlhFUVRlPrRLAVF/pGyGm0aP6EoitIwmqWgyDtk2SWy0ixb/ZNXnhTL\n4SiKojRpmqXX04Eiq1bSU1eezPsrdnN6//DqVSiKoig1aRaC4lBJBVUeL0mJloJUUFwBwMCuWZze\n/8RYDk1RFKXJ0yymnvIOlXK4tBJjDDsPlviisbNS1dNJURTlWGkWGgXAH95Zxcm92vHArLWcO7gz\nCQJpyc1CDiqKosSUZiMoPli5hy37iwFLw8hISVJPJ0VRlAgQToW750Vkn4iscrVdKiKrRcTrqlqH\niJwtIovt6nWLRWR8iGM+KiLrRGSFiMy0S6giIjkiUuqqjvdMfS6mwuMFYM+RMjJSm40MVBRFiSnh\nzM28CEwIaFsFTALmBbQfAH5gjBkKXAPMCHHMOcAQY8wwYANwt2vbZmPMcPvv5jDG52PnwRKg2pit\nKIqiHDt1CgpjzDzgYEDbWmPM+iB9lxpjdturq4FWIpIapN/Hxhgn//e3QI96jzwIlZ7qiOyDJSos\nFEVRIkE0rb2XAEuMMeV19LsO+NC13seedvpCRE4L50QdM2vIIu44q3/YA1UURVFCE5WJfBEZDPwJ\nOKeOfr8DqoCX7aZ8oJcxpkBERgD/E5HBxpjCIPveCNwI0LNXb79tWx86Xw3ZiqIoESLiGoWI9ABm\nAlcbYzbX0m8KcCFwlbGz+Bljyo0xBfbyYmAzEFQ1MMZMN8bkGmNyO2V39LVnpCSqkFAURYkgERUU\ntvfSLGCqMebrWvpNAO4CfmiMKXG1Z4tIor3cF+gHbAnn3O/ediqALzpbURRFiQzhuMe+CswHBohI\nnohcLyITRSQPGAPMEpHZdvfbgOOBP7hcXDvZx3nO5Ur7JJAFzAlwgz0dWCEiy4A3gZuNMX6G9FB0\nykqzxxtOb0VRFCVc6rRRGGOuCLFpZpC+DwAPhDjODa7l40P0eQt4q64xBaOVXW+if6eshuyuKIqi\nhKDZRKW1aZXMC1NGclKvtrEeiqIoSrOi2QgKgHEDO8V6CIqiKM0OtfwqiqIotaKCQlEURakVFRSK\noihKraigUBRFUWpFBYWiKIpSKyooFEVRlFpRQaEoiqLUigoKRVEUpVbETtzapBGRUqxCSUo1bYAj\nsR5EnKH3pCZ6T/xpafdjgDGmzrxHzSUyu8gYk1t3t5aDiEw3xtwY63HEE3pPaqL3xJ+Wdj9EZFE4\n/ZrL1NPhWA8gDnkv1gOIQ/Se1ETviT96P4LQXKaeFqlGoSiKUj/CfXY2F41ieqwHoCiK0gQJ69nZ\nLDQKRVEUJXo0F42iRSMiE0RkvYhsEpGpAdt+KSJGRDqG2r85EuyeiMi9IrLLVX3x/FiPszEJ9T0R\nkZ+JyDoRWS0ij8RyjI1JiO/I667vxza72maLp0l6Pdk1t58AEoHnjDEPi8j9wEWAF9gHTDHG7I7h\nMBsFu8b4U8DZQB7wnYi8a4xZIyI9gXOAHbEcY2MT6p7Ym/9ijPlzzAYXI2q5J52xfjcnGmPKndLF\nzZ1afjeXu/o8RstylQ1Jk9MoXB/wecAg4AoRGQQ8aowZZowZDrwP/CGGw2xMRgGbjDFbjDEVwGtY\nP3yAvwB3AS1tfrG2e9JSCXVPfgo8bIwpBzDG7IvhGBuTWr8jIiLAZcCrMRpfXNHkBAUhPmBjTKGr\nTwYt5+HYHdjpWs8DuovIRcAuY8zy2AwrpgS9J/byz0RkhYg8LyLtGn9oMSPUPekPnCYiC0TkCxEZ\nGZPRNT61fUcATgP2GmM2Nuqo4pSmKChCfsAiMk1EdgJX0XI0imCkA7+lZd+DYDwN9AWGA/nAY7Ed\nTlyQBLQHTgF+Dbxhv023dK5AtQkfTVFQhMQY8ztjTE/gZeC2WI+nkdgF9HSt9wC2An2A5SKyzW5b\nIiJdGn94MSHYPdlljNlrjPEYY7zAP7G005ZC0HuC9aL1trFYiGXjawmOD6HuByKSBEwCXo/BuOKS\npigoQn7ALl4GLmm0EcWW74B+ItJHRFKAyVg//E7GmBxjTA7Ww+BkY8yeWA60EQl2T94Vka6uPhOB\nVTEZXWwIek+A/wHjAESkP5ACHIjZKBuPUPcD4CxgnTEmL2ajizOaoteT7wPGEhCTgStFpJ9rPvEi\nYF2sBtiYGGOqROQ2YDaWF9jzxpgWnSAx1D0RkRkiMhzLfrUNuCmGw2xUarknG4HnRWQVUAFcY1pA\ncFUdv5vJ6LSTH00y4M72f/8r1R/wNBF5CxiApTpvB242xgRqGoqiKEo9aZKCQlEURWk8mqKNQlEU\nRWlEVFAoiqIotaKCQlEURamVJikoRKSoju2fi4jWp1AURYkATVJQKIqiKI1HkxUUInKGiLzvWn9S\nRKbEcEiKoijNkiYrKBRFUZTGQQWFoiiKUitNWVBU4T/+tFgNRFEUpTnTlAXFdmCQiKSKSFvgzFgP\nSFEUpTnS5JIC2imAy40xO0XkDawMoFuBpbEdmaIoSvOkyeV6EpETgX8aY1pSLQFFUZSY0aSmnkTk\nZqz0v/fEeiyKoigthSanUSiKoiiNS5PSKBRFUZTGJy4FhYj0FJG5IrJGRFaLyO12e3sRmSMiG+3/\n7ez2Dnb/IhF50nWcLBFZ5vo7ICJ/jdV1KYqiNEXicurJrm3c1RizRESygMXAxcAU4KAx5mERmQq0\nM8b8RkQygJOAIcAQY8xtIY67GLjDGDOvUS5EURSlGRCXGoUxJt8Ys8RePgqsBbpj1cL+t93t31jC\nA2NMsTHmK6As1DHtwvGdgC+jOHRFUZRmR1wKCjcikoOlLSwAOhtj8u1Ne4DO9TjUZOD1llA4XlEU\nJZLEtaAQkUzgLeAXxphC9zb7gV+fh/5kLNdaRVEUpR7EraAQkWQsIfGyMeZtu3mvbb9w7Bj7wjzW\niUCSMWZxVAarKIrSjIlLQSEiAvwLWGuMedy16V3gGnv5GuCdMA95BapNKIqiNIh49Xoai2V0Xgl4\n7ebfYtkp3gB6YSUFvMwYc9DeZxvQGkgBDgPnGGPW2Nu2AOcbY9Y14mUoiqI0C+JSUCiKoijxQ1xO\nPSmKoijxgwoKRVEUpVZUUCiKoii1ooJCURRFqRUVFIqiKEqtqKBQFEBEOovIKyKyRUQWi8h8EZlY\nz2NMEZFu4WwTkedEZNCxjltRGgMVFEqLxw7w/B8wzxjT1xgzAivlS496HmoKEFRQBG4zxtzgxPko\nSryjgkJRYDxQYYx5xmkwxmw3xvwdfNrA/+waKNtE5DYRuVNElorIt3adlB8BucDLdu2TVs6xgm0T\nkc9FJNfeXiQij9q1Vz4RkVH29i0i/7+9O1aNKojiMP790UIUsfEBtNAmEkyxhWCrpagpBRsRCWJr\netHaSrCw8AHsbEwTSwslRYK1D5AqLBpiYI/FzsrV4sbdJSrk+1V7Z+aemV24HGbuMpMbrc2x1uZj\nks0kD/7i76MjzkQhwQKwcUCbS8BtYAA8A75V1RLwAbhbVW+AT8CdqrpcVbuTG/vqmlPAelUtAEPg\nKXANuAU8aW3uATtVNWhjuJ/k/MzfWJrC8X89AOl/k+QFcJXxLGPQit+3s1GGSXaAt618C1ics8vv\nwLtOvL2q2k+yBZxr5deBxTY7ATgDXAC+zNm3dCAThQSfgeXJRVU9THKW8SxgYq/zedS5HjH/c7Tf\nOSflZ+yqGiWZxA7wqKrW5uxLmppLTxKsAyeSrHTKTs4QZwicnqHuT6wBK237fZJcbEcAS4fOGYWO\nvKqqJDeB50keA9vAV2B1ylCvgZdJdoErv72L+KVuhmG+YrwMtdH+pbVNOwpYOmzuHitJ6uXSkySp\nl4lCktTLRCFJ6mWikCT1MlFIknqZKCRJvUwUkqRePwBo1a0/M7Xe0gAAAABJRU5ErkJggg==\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "mean = np.mean(hist.list())\nhist_list = hist.list() - mean\nhist_list = hist_list[200:1200]\nlen(hist_list)\nplt.plot(np.linspace(0,1000, 1000), hist_list)",
"execution_count": 4,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 4,
"data": {
"text/plain": "[<matplotlib.lines.Line2D at 0x7fc2ae687e10>]"
},
"metadata": {}
},
{
"output_type": "display_data",
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7fc2b0a2a4a8>",
"image/png": "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\nkl972mS/VFwAAAAASUVORK5CYII=\n"
},
"metadata": {}
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import enum\nclass Action(enum.Enum):\n HOLD = 0\n BUY = 1\n SELL = 2\n\nclass Position():\n def __init__(self):\n self.NONE = 0\n self.HOLD = 1\n self.reset()\n\n def reset(self):\n self.holding = self.NONE\n self.change_action = None\n self.bid = None\n\n def is_hold(self):\n return self.holding == self.HOLD\n\n def change(self, action, bid):\n self.bid = bid\n self.holding = self.HOLD\n self.change_action = action\n\n def close(self, action, bid):\n if action == Action.BUY.value:\n reward = (bid - self.bid) * 10000\n else:\n reward = (self.bid - bid) * 10000\n self.reset()\n return reward",
"execution_count": 5,
"outputs": []
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "import gym\nimport gym.spaces\n\nclass FXTrade(gym.core.Env):\n def __init__(self, hist_list):\n self.action_space = gym.spaces.Discrete(3) \n high = np.array([1.0, 1])\n low = np.array([-1.0, 0])\n self.observation_space = gym.spaces.Box(low=low, high=high) \n\n self._position = Position()\n\n self._hist_list = hist_list\n self._hist_list_len = len(self._hist_list)\n\n self.cur_id = 0\n\n def _step(self, action):\n bid = self._hist_list[self.cur_id]\n self.cur_id +=1\n done = True if self.cur_id == self._hist_list_len else False\n\n if action != Action.HOLD.value and action == self._position.change_action:\n # invalid action ... hold\n action = Action.HOLD.value\n\n if action == Action.HOLD.value:\n reward = 0\n else:\n if not self._position.is_hold():\n self._position.change(action, bid)\n reward = 0\n else:\n reward = self._position.close(action, bid)\n observation = np.array([bid, self._position.holding])\n return observation, reward, done ,{}\n\n def _reset(self):\n self.cur_id = 0\n self._position.reset()\n return np.array([self._hist_list[self.cur_id], self._position.holding])",
"execution_count": 6,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "hist_list = hist.list() - np.mean(hist.list())\nhist_list = hist_list.tolist()\nhist_list = hist_list[200:1200]\n\n# hist_list = []\n# for t in np.linspace(0, 192, 1404):\n# hist_list.append(np.sin(t))\n\nenv = FXTrade(hist_list)\nenv.reset()",
"execution_count": 7,
"outputs": [
{
"output_type": "execute_result",
"execution_count": 7,
"data": {
"text/plain": "array([ 0.07676282, 0. ])"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "from keras.models import Sequential\nfrom keras.layers import Dense, Activation, Flatten\nfrom keras.optimizers import Adam\n\nfrom rl.agents.dqn import DQNAgent\nfrom rl.policy import BoltzmannQPolicy\nfrom rl.memory import SequentialMemory",
"execution_count": 8,
"outputs": [
{
"output_type": "stream",
"text": "Using TensorFlow backend.\n",
"name": "stderr"
}
]
},
{
"metadata": {
"scrolled": true,
"trusted": true
},
"cell_type": "code",
"source": "nb_actions = env.action_space.n\n\nmodel = Sequential()\nmodel.add(Flatten(input_shape=(1,) + env.observation_space.shape))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(16))\nmodel.add(Activation('relu'))\nmodel.add(Dense(nb_actions))\nmodel.add(Activation('linear'))\nmodel.summary()",
"execution_count": 9,
"outputs": [
{
"output_type": "stream",
"text": "_________________________________________________________________\nLayer (type) Output Shape Param # \n=================================================================\nflatten_1 (Flatten) (None, 2) 0 \n_________________________________________________________________\ndense_1 (Dense) (None, 16) 48 \n_________________________________________________________________\nactivation_1 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_2 (Dense) (None, 16) 272 \n_________________________________________________________________\nactivation_2 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_3 (Dense) (None, 16) 272 \n_________________________________________________________________\nactivation_3 (Activation) (None, 16) 0 \n_________________________________________________________________\ndense_4 (Dense) (None, 3) 51 \n_________________________________________________________________\nactivation_4 (Activation) (None, 3) 0 \n=================================================================\nTotal params: 643\nTrainable params: 643\nNon-trainable params: 0\n_________________________________________________________________\n",
"name": "stdout"
}
]
},
{
"metadata": {
"collapsed": true,
"trusted": true
},
"cell_type": "code",
"source": "memory = SequentialMemory(limit=50000, window_length=1)\npolicy = BoltzmannQPolicy()\ndqn = DQNAgent(model=model, nb_actions=nb_actions, memory=memory,\n target_model_update=1e-2, policy=policy)\ndqn.compile(Adam(lr=1e-3), metrics=['mae'])",
"execution_count": 10,
"outputs": []
},
{
"metadata": {
"trusted": true
},
"cell_type": "code",
"source": "dqn.fit(env, nb_steps=10000, visualize=False, verbose=1)",
"execution_count": 11,
"outputs": [
{
"output_type": "stream",
"text": "Training for 10000 steps ...\nInterval 1 (0 steps performed)\n10000/10000 [==============================] - 68s - reward: 8.4310 \ndone, took 68.029 seconds\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 11,
"data": {
"text/plain": "<keras.callbacks.History at 0x7fc298955f28>"
},
"metadata": {}
}
]
},
{
"metadata": {
"trusted": true,
"scrolled": true
},
"cell_type": "code",
"source": "dqn.test(env, nb_episodes=5, visualize=False)",
"execution_count": 12,
"outputs": [
{
"output_type": "stream",
"text": "Testing for 5 episodes ...\nEpisode 1: reward: 28360.000, steps: 1000\nEpisode 2: reward: 28360.000, steps: 1000\nEpisode 3: reward: 28360.000, steps: 1000\nEpisode 4: reward: 28360.000, steps: 1000\nEpisode 5: reward: 28360.000, steps: 1000\n",
"name": "stdout"
},
{
"output_type": "execute_result",
"execution_count": 12,
"data": {
"text/plain": "<keras.callbacks.History at 0x7fc298955438>"
},
"metadata": {}
}
]
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"name": "python",
"version": "3.6.1",
"mimetype": "text/x-python",
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"file_extension": ".py"
},
"toc": {
"threshold": 4,
"number_sections": false,
"toc_cell": false,
"toc_window_display": false,
"toc_section_display": "block",
"sideBar": true,
"navigate_menu": true,
"moveMenuLeft": true,
"widenNotebook": false,
"colors": {
"hover_highlight": "#DAA520",
"selected_highlight": "#FFD700",
"running_highlight": "#FF0000",
"wrapper_background": "#FFFFFF",
"sidebar_border": "#EEEEEE",
"navigate_text": "#333333",
"navigate_num": "#000000"
},
"nav_menu": {
"height": "4px",
"width": "254px"
}
},
"gist": {
"id": "",
"data": {
"description": "FX: USDJPYのヒストリカルデータを利用してDQNでバックテスト",
"public": true
}
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment