Skip to content

Instantly share code, notes, and snippets.

@poulter7
Forked from yhilpisch/01_bc_day_03.md
Created December 1, 2017 16:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save poulter7/b21bf8b461491ce436f05791fbc426f1 to your computer and use it in GitHub Desktop.
Save poulter7/b21bf8b461491ce436f05791fbc426f1 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src='http://hilpisch.com/tpq_logo.png' width=\"300px\" align=\"right\">"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# FPQ Bootcamp &mdash; Day 3"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Financial Data & Data API**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Financial Data"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"from pylab import plt\n",
"plt.style.use('seaborn')\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"raw = pd.read_csv('http://hilpisch.com/tr_eikon_eod_data.csv',\n",
" index_col=0, parse_dates=True)"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"DatetimeIndex: 1972 entries, 2010-01-04 to 2017-10-31\n",
"Data columns (total 12 columns):\n",
"AAPL.O 1972 non-null float64\n",
"MSFT.O 1972 non-null float64\n",
"INTC.O 1972 non-null float64\n",
"AMZN.O 1972 non-null float64\n",
"GS.N 1972 non-null float64\n",
"SPY 1972 non-null float64\n",
".SPX 1972 non-null float64\n",
".VIX 1972 non-null float64\n",
"EUR= 1972 non-null float64\n",
"XAU= 1972 non-null float64\n",
"GDX 1972 non-null float64\n",
"GLD 1972 non-null float64\n",
"dtypes: float64(12)\n",
"memory usage: 200.3 KB\n"
]
}
],
"source": [
"raw.info()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>AAPL.O</th>\n",
" <th>MSFT.O</th>\n",
" <th>INTC.O</th>\n",
" <th>AMZN.O</th>\n",
" <th>GS.N</th>\n",
" <th>SPY</th>\n",
" <th>.SPX</th>\n",
" <th>.VIX</th>\n",
" <th>EUR=</th>\n",
" <th>XAU=</th>\n",
" <th>GDX</th>\n",
" <th>GLD</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2010-01-04</th>\n",
" <td>30.572827</td>\n",
" <td>30.950</td>\n",
" <td>20.88</td>\n",
" <td>133.90</td>\n",
" <td>173.08</td>\n",
" <td>113.33</td>\n",
" <td>1132.99</td>\n",
" <td>20.04</td>\n",
" <td>1.4411</td>\n",
" <td>1120.00</td>\n",
" <td>47.71</td>\n",
" <td>109.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-05</th>\n",
" <td>30.625684</td>\n",
" <td>30.960</td>\n",
" <td>20.87</td>\n",
" <td>134.69</td>\n",
" <td>176.14</td>\n",
" <td>113.63</td>\n",
" <td>1136.52</td>\n",
" <td>19.35</td>\n",
" <td>1.4368</td>\n",
" <td>1118.65</td>\n",
" <td>48.17</td>\n",
" <td>109.70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-06</th>\n",
" <td>30.138541</td>\n",
" <td>30.770</td>\n",
" <td>20.80</td>\n",
" <td>132.25</td>\n",
" <td>174.26</td>\n",
" <td>113.71</td>\n",
" <td>1137.14</td>\n",
" <td>19.16</td>\n",
" <td>1.4412</td>\n",
" <td>1138.50</td>\n",
" <td>49.34</td>\n",
" <td>111.51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-07</th>\n",
" <td>30.082827</td>\n",
" <td>30.452</td>\n",
" <td>20.60</td>\n",
" <td>130.00</td>\n",
" <td>177.67</td>\n",
" <td>114.19</td>\n",
" <td>1141.69</td>\n",
" <td>19.06</td>\n",
" <td>1.4318</td>\n",
" <td>1131.90</td>\n",
" <td>49.10</td>\n",
" <td>110.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-08</th>\n",
" <td>30.282827</td>\n",
" <td>30.660</td>\n",
" <td>20.83</td>\n",
" <td>133.52</td>\n",
" <td>174.31</td>\n",
" <td>114.57</td>\n",
" <td>1144.98</td>\n",
" <td>18.13</td>\n",
" <td>1.4412</td>\n",
" <td>1136.10</td>\n",
" <td>49.84</td>\n",
" <td>111.37</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" AAPL.O MSFT.O INTC.O AMZN.O GS.N SPY .SPX .VIX \\\n",
"Date \n",
"2010-01-04 30.572827 30.950 20.88 133.90 173.08 113.33 1132.99 20.04 \n",
"2010-01-05 30.625684 30.960 20.87 134.69 176.14 113.63 1136.52 19.35 \n",
"2010-01-06 30.138541 30.770 20.80 132.25 174.26 113.71 1137.14 19.16 \n",
"2010-01-07 30.082827 30.452 20.60 130.00 177.67 114.19 1141.69 19.06 \n",
"2010-01-08 30.282827 30.660 20.83 133.52 174.31 114.57 1144.98 18.13 \n",
"\n",
" EUR= XAU= GDX GLD \n",
"Date \n",
"2010-01-04 1.4411 1120.00 47.71 109.80 \n",
"2010-01-05 1.4368 1118.65 48.17 109.70 \n",
"2010-01-06 1.4412 1138.50 49.34 111.51 \n",
"2010-01-07 1.4318 1131.90 49.10 110.82 \n",
"2010-01-08 1.4412 1136.10 49.84 111.37 "
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw.head()"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\nAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x1049e78d0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"raw[['AAPL.O', 'MSFT.O']].plot(figsize=(10, 6));"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Input-Output"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 69.7 ms, sys: 6.6 ms, total: 76.3 ms\n",
"Wall time: 88.6 ms\n"
]
}
],
"source": [
"%time raw.to_csv('data.csv')"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"01_bc_day_03.md \u001b[34m__pycache__\u001b[m\u001b[m/ fxcm_tick_reader.py\r\n",
"02_financial_data.ipynb data.csv\r\n",
"03_backstesting.ipynb fin_data_api.py\r\n"
]
}
],
"source": [
"ls"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 1.04 s, sys: 46.4 ms, total: 1.08 s\n",
"Wall time: 1.09 s\n"
]
}
],
"source": [
"%time raw.to_excel('data.xlsx')"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-rw-r--r--@ 1 501 20 191772 Nov 23 12:07 data.csv\r\n",
"-rw-r--r--@ 1 501 20 165033 Nov 23 12:07 data.xlsx\r\n"
]
}
],
"source": [
"ls -n data*"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 76 ms, sys: 31.2 ms, total: 107 ms\n",
"Wall time: 147 ms\n"
]
}
],
"source": [
"%time raw.to_hdf('data.h5', 'raw')"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"-rw-r--r--@ 1 501 20 191772 Nov 23 12:07 data.csv\r\n",
"-rw-r--r-- 1 501 20 212280 Nov 23 12:07 data.h5\r\n",
"-rw-r--r--@ 1 501 20 165033 Nov 23 12:07 data.xlsx\r\n"
]
}
],
"source": [
"ls -n data*"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [],
"source": [
"import sqlite3 as sq3"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [],
"source": [
"con = sq3.Connection('data.sql')"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [],
"source": [
"raw.to_sql('raw', con)"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('2010-01-04 00:00:00',\n",
" 30.57282657,\n",
" 30.95,\n",
" 20.88,\n",
" 133.9,\n",
" 173.08,\n",
" 113.33,\n",
" 1132.99,\n",
" 20.04,\n",
" 1.4411,\n",
" 1120.0,\n",
" 47.71,\n",
" 109.8),\n",
" ('2010-01-05 00:00:00',\n",
" 30.625683660000004,\n",
" 30.96,\n",
" 20.87,\n",
" 134.69,\n",
" 176.14,\n",
" 113.63,\n",
" 1136.52,\n",
" 19.35,\n",
" 1.4368,\n",
" 1118.65,\n",
" 48.17,\n",
" 109.7)]"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"con.execute('SELECT * FROM raw').fetchmany(2)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[('table',\n",
" 'raw',\n",
" 'raw',\n",
" 2,\n",
" 'CREATE TABLE \"raw\" (\\n\"Date\" TIMESTAMP,\\n \"AAPL.O\" REAL,\\n \"MSFT.O\" REAL,\\n \"INTC.O\" REAL,\\n \"AMZN.O\" REAL,\\n \"GS.N\" REAL,\\n \"SPY\" REAL,\\n \".SPX\" REAL,\\n \".VIX\" REAL,\\n \"EUR=\" REAL,\\n \"XAU=\" REAL,\\n \"GDX\" REAL,\\n \"GLD\" REAL\\n)'),\n",
" ('index',\n",
" 'ix_raw_Date',\n",
" 'raw',\n",
" 3,\n",
" 'CREATE INDEX \"ix_raw_Date\"ON \"raw\" (\"Date\")')]"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"con.execute('SELECT * FROM sqlite_master').fetchall()"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"rec.array([ (datetime.datetime(2010, 1, 4, 0, 0), 30.57282657, 30.95, 20.88, 133.9 , 173.08, 113.33, 1132.99, 20.04, 1.4411, 1120. , 47.71, 109.8 ),\n",
" (datetime.datetime(2010, 1, 5, 0, 0), 30.62568366, 30.96, 20.87, 134.69, 176.14, 113.63, 1136.52, 19.35, 1.4368, 1118.65, 48.17, 109.7 ),\n",
" (datetime.datetime(2010, 1, 6, 0, 0), 30.13854129, 30.77, 20.8 , 132.25, 174.26, 113.71, 1137.14, 19.16, 1.4412, 1138.5 , 49.34, 111.51)], \n",
" dtype=[('Date', 'O'), ('AAPL.O', '<f8'), ('MSFT.O', '<f8'), ('INTC.O', '<f8'), ('AMZN.O', '<f8'), ('GS.N', '<f8'), ('SPY', '<f8'), ('.SPX', '<f8'), ('.VIX', '<f8'), ('EUR=', '<f8'), ('XAU=', '<f8'), ('GDX', '<f8'), ('GLD', '<f8')])"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw.to_records()[:3]"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'{\"AAPL.O\":{\"1262563200000\":30.57282657,\"1262649600000\":30.62568366,\"1262736000000\":30.13854129,\"1262822400000\":30.08282706,\"1262908800000\":30.28282686},\"MSFT.O\":{\"1262563200000\":30.95,\"1262649600000\":30.96,\"1262736000000\":30.77,\"1262822400000\":30.452,\"1262908800000\":30.66},\"INTC.O\":{\"1262563200000\":20.88,\"1262649600000\":20.87,\"1262736000000\":20.8,\"1262822400000\":20.6,\"1262908800000\":20.83},\"AMZN.O\":{\"1262563200000\":133.9,\"1262649600000\":134.69,\"1262736000000\":132.25,\"1262822400000\":130.0,\"1262908800000\":133.52},\"GS.N\":{\"1262563200000\":173.08,\"1262649600000\":176.14,\"1262736000000\":174.26,\"1262822400000\":177.67,\"1262908800000\":174.31},\"SPY\":{\"1262563200000\":113.33,\"1262649600000\":113.63,\"1262736000000\":113.71,\"1262822400000\":114.19,\"1262908800000\":114.57},\".SPX\":{\"1262563200000\":1132.99,\"1262649600000\":1136.52,\"1262736000000\":1137.14,\"1262822400000\":1141.69,\"1262908800000\":1144.98},\".VIX\":{\"1262563200000\":20.04,\"1262649600000\":19.35,\"1262736000000\":19.16,\"1262822400000\":19.06,\"1262908800000\":18.13},\"EUR=\":{\"1262563200000\":1.4411,\"1262649600000\":1.4368,\"1262736000000\":1.4412,\"1262822400000\":1.4318,\"1262908800000\":1.4412},\"XAU=\":{\"1262563200000\":1120.0,\"1262649600000\":1118.65,\"1262736000000\":1138.5,\"1262822400000\":1131.9,\"1262908800000\":1136.1},\"GDX\":{\"1262563200000\":47.71,\"1262649600000\":48.17,\"1262736000000\":49.34,\"1262822400000\":49.1,\"1262908800000\":49.84},\"GLD\":{\"1262563200000\":109.8,\"1262649600000\":109.7,\"1262736000000\":111.51,\"1262822400000\":110.82,\"1262908800000\":111.37}}'"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw.iloc[:5].to_json()"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {},
"outputs": [],
"source": [
"from_excel = pd.read_excel('data.xlsx', index_col=0)"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>AAPL.O</th>\n",
" <th>MSFT.O</th>\n",
" <th>INTC.O</th>\n",
" <th>AMZN.O</th>\n",
" <th>GS.N</th>\n",
" <th>SPY</th>\n",
" <th>.SPX</th>\n",
" <th>.VIX</th>\n",
" <th>EUR=</th>\n",
" <th>XAU=</th>\n",
" <th>GDX</th>\n",
" <th>GLD</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2010-01-04</th>\n",
" <td>30.572827</td>\n",
" <td>30.950</td>\n",
" <td>20.88</td>\n",
" <td>133.90</td>\n",
" <td>173.08</td>\n",
" <td>113.33</td>\n",
" <td>1132.99</td>\n",
" <td>20.04</td>\n",
" <td>1.4411</td>\n",
" <td>1120.00</td>\n",
" <td>47.71</td>\n",
" <td>109.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-05</th>\n",
" <td>30.625684</td>\n",
" <td>30.960</td>\n",
" <td>20.87</td>\n",
" <td>134.69</td>\n",
" <td>176.14</td>\n",
" <td>113.63</td>\n",
" <td>1136.52</td>\n",
" <td>19.35</td>\n",
" <td>1.4368</td>\n",
" <td>1118.65</td>\n",
" <td>48.17</td>\n",
" <td>109.70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-06</th>\n",
" <td>30.138541</td>\n",
" <td>30.770</td>\n",
" <td>20.80</td>\n",
" <td>132.25</td>\n",
" <td>174.26</td>\n",
" <td>113.71</td>\n",
" <td>1137.14</td>\n",
" <td>19.16</td>\n",
" <td>1.4412</td>\n",
" <td>1138.50</td>\n",
" <td>49.34</td>\n",
" <td>111.51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-07</th>\n",
" <td>30.082827</td>\n",
" <td>30.452</td>\n",
" <td>20.60</td>\n",
" <td>130.00</td>\n",
" <td>177.67</td>\n",
" <td>114.19</td>\n",
" <td>1141.69</td>\n",
" <td>19.06</td>\n",
" <td>1.4318</td>\n",
" <td>1131.90</td>\n",
" <td>49.10</td>\n",
" <td>110.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-08</th>\n",
" <td>30.282827</td>\n",
" <td>30.660</td>\n",
" <td>20.83</td>\n",
" <td>133.52</td>\n",
" <td>174.31</td>\n",
" <td>114.57</td>\n",
" <td>1144.98</td>\n",
" <td>18.13</td>\n",
" <td>1.4412</td>\n",
" <td>1136.10</td>\n",
" <td>49.84</td>\n",
" <td>111.37</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" AAPL.O MSFT.O INTC.O AMZN.O GS.N SPY .SPX .VIX \\\n",
"Date \n",
"2010-01-04 30.572827 30.950 20.88 133.90 173.08 113.33 1132.99 20.04 \n",
"2010-01-05 30.625684 30.960 20.87 134.69 176.14 113.63 1136.52 19.35 \n",
"2010-01-06 30.138541 30.770 20.80 132.25 174.26 113.71 1137.14 19.16 \n",
"2010-01-07 30.082827 30.452 20.60 130.00 177.67 114.19 1141.69 19.06 \n",
"2010-01-08 30.282827 30.660 20.83 133.52 174.31 114.57 1144.98 18.13 \n",
"\n",
" EUR= XAU= GDX GLD \n",
"Date \n",
"2010-01-04 1.4411 1120.00 47.71 109.80 \n",
"2010-01-05 1.4368 1118.65 48.17 109.70 \n",
"2010-01-06 1.4412 1138.50 49.34 111.51 \n",
"2010-01-07 1.4318 1131.90 49.10 110.82 \n",
"2010-01-08 1.4412 1136.10 49.84 111.37 "
]
},
"execution_count": 20,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from_excel.head()"
]
},
{
"cell_type": "code",
"execution_count": 21,
"metadata": {},
"outputs": [],
"source": [
"con2 = sq3.Connection('data.sql')"
]
},
{
"cell_type": "code",
"execution_count": 22,
"metadata": {},
"outputs": [],
"source": [
"from_sql = pd.read_sql('SELECT * FROM raw', con2)"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>AAPL.O</th>\n",
" <th>MSFT.O</th>\n",
" <th>INTC.O</th>\n",
" <th>AMZN.O</th>\n",
" <th>GS.N</th>\n",
" <th>SPY</th>\n",
" <th>.SPX</th>\n",
" <th>.VIX</th>\n",
" <th>EUR=</th>\n",
" <th>XAU=</th>\n",
" <th>GDX</th>\n",
" <th>GLD</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2010-01-04 00:00:00</th>\n",
" <td>30.572827</td>\n",
" <td>30.950</td>\n",
" <td>20.88</td>\n",
" <td>133.90</td>\n",
" <td>173.08</td>\n",
" <td>113.33</td>\n",
" <td>1132.99</td>\n",
" <td>20.04</td>\n",
" <td>1.4411</td>\n",
" <td>1120.00</td>\n",
" <td>47.71</td>\n",
" <td>109.80</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-05 00:00:00</th>\n",
" <td>30.625684</td>\n",
" <td>30.960</td>\n",
" <td>20.87</td>\n",
" <td>134.69</td>\n",
" <td>176.14</td>\n",
" <td>113.63</td>\n",
" <td>1136.52</td>\n",
" <td>19.35</td>\n",
" <td>1.4368</td>\n",
" <td>1118.65</td>\n",
" <td>48.17</td>\n",
" <td>109.70</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-06 00:00:00</th>\n",
" <td>30.138541</td>\n",
" <td>30.770</td>\n",
" <td>20.80</td>\n",
" <td>132.25</td>\n",
" <td>174.26</td>\n",
" <td>113.71</td>\n",
" <td>1137.14</td>\n",
" <td>19.16</td>\n",
" <td>1.4412</td>\n",
" <td>1138.50</td>\n",
" <td>49.34</td>\n",
" <td>111.51</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-07 00:00:00</th>\n",
" <td>30.082827</td>\n",
" <td>30.452</td>\n",
" <td>20.60</td>\n",
" <td>130.00</td>\n",
" <td>177.67</td>\n",
" <td>114.19</td>\n",
" <td>1141.69</td>\n",
" <td>19.06</td>\n",
" <td>1.4318</td>\n",
" <td>1131.90</td>\n",
" <td>49.10</td>\n",
" <td>110.82</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2010-01-08 00:00:00</th>\n",
" <td>30.282827</td>\n",
" <td>30.660</td>\n",
" <td>20.83</td>\n",
" <td>133.52</td>\n",
" <td>174.31</td>\n",
" <td>114.57</td>\n",
" <td>1144.98</td>\n",
" <td>18.13</td>\n",
" <td>1.4412</td>\n",
" <td>1136.10</td>\n",
" <td>49.84</td>\n",
" <td>111.37</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" AAPL.O MSFT.O INTC.O AMZN.O GS.N SPY \\\n",
"Date \n",
"2010-01-04 00:00:00 30.572827 30.950 20.88 133.90 173.08 113.33 \n",
"2010-01-05 00:00:00 30.625684 30.960 20.87 134.69 176.14 113.63 \n",
"2010-01-06 00:00:00 30.138541 30.770 20.80 132.25 174.26 113.71 \n",
"2010-01-07 00:00:00 30.082827 30.452 20.60 130.00 177.67 114.19 \n",
"2010-01-08 00:00:00 30.282827 30.660 20.83 133.52 174.31 114.57 \n",
"\n",
" .SPX .VIX EUR= XAU= GDX GLD \n",
"Date \n",
"2010-01-04 00:00:00 1132.99 20.04 1.4411 1120.00 47.71 109.80 \n",
"2010-01-05 00:00:00 1136.52 19.35 1.4368 1118.65 48.17 109.70 \n",
"2010-01-06 00:00:00 1137.14 19.16 1.4412 1138.50 49.34 111.51 \n",
"2010-01-07 00:00:00 1141.69 19.06 1.4318 1131.90 49.10 110.82 \n",
"2010-01-08 00:00:00 1144.98 18.13 1.4412 1136.10 49.84 111.37 "
]
},
"execution_count": 23,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from_sql.set_index('Date').head()"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [],
"source": [
"rm data*"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data API"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [],
"source": [
"url_templ = \"http://0.0.0.0:7777/?symbols=%s&format=%s&no=%d\""
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'http://0.0.0.0:7777/?symbols=AAPL.O&format=csv&no=20'"
]
},
"execution_count": 26,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"url_templ % ('AAPL.O', 'csv', 20)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**CAUTION**: For what follows, the Flask data api (`fin_data_api.py`) needs to be started and running first. In a terminal window and in the \"right\" folder do:\n",
"\n",
" python fin_data_api.py"
]
},
{
"cell_type": "code",
"execution_count": 27,
"metadata": {},
"outputs": [],
"source": [
"import requests"
]
},
{
"cell_type": "code",
"execution_count": 28,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Date,AAPL.O,MSFT.O\n",
"2017-10-25,156.41,78.63\n",
"2017-10-26,157.41,78.76\n",
"2017-10-27,163.05,83.81\n",
"2017-10-30,166.72,83.89\n",
"2017-10-31,169.04,83.18\n",
"\n"
]
}
],
"source": [
"g = requests.get(url_templ % ('AAPL.O,MSFT.O', 'csv', 5)).text\n",
"print(g)"
]
},
{
"cell_type": "code",
"execution_count": 29,
"metadata": {},
"outputs": [],
"source": [
"r = pd.read_csv(url_templ % ('AAPL.O,MSFT.O', 'csv', 5),\n",
" index_col=0, parse_dates=True)"
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>AAPL.O</th>\n",
" <th>MSFT.O</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2017-10-25</th>\n",
" <td>156.41</td>\n",
" <td>78.63</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-26</th>\n",
" <td>157.41</td>\n",
" <td>78.76</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-27</th>\n",
" <td>163.05</td>\n",
" <td>83.81</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-30</th>\n",
" <td>166.72</td>\n",
" <td>83.89</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-31</th>\n",
" <td>169.04</td>\n",
" <td>83.18</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" AAPL.O MSFT.O\n",
"Date \n",
"2017-10-25 156.41 78.63\n",
"2017-10-26 157.41 78.76\n",
"2017-10-27 163.05 83.81\n",
"2017-10-30 166.72 83.89\n",
"2017-10-31 169.04 83.18"
]
},
"execution_count": 30,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"r"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [],
"source": [
"symbols = ['GLD', 'GDX', 'AAPL.O']"
]
},
{
"cell_type": "code",
"execution_count": 32,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"'GLD,GDX,AAPL.O'"
]
},
"execution_count": 32,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"','.join(symbols)"
]
},
{
"cell_type": "code",
"execution_count": 33,
"metadata": {},
"outputs": [],
"source": [
"def get_data(symbols, no):\n",
" symbols = ','.join(symbols)\n",
" url = url_templ % (symbols, 'csv', no)\n",
" print(url)\n",
" df = pd.read_csv(url, index_col=0, parse_dates=True)\n",
" return df "
]
},
{
"cell_type": "code",
"execution_count": 34,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"http://0.0.0.0:7777/?symbols=GLD,GDX,AAPL.O&format=csv&no=10\n"
]
},
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>GLD</th>\n",
" <th>GDX</th>\n",
" <th>AAPL.O</th>\n",
" </tr>\n",
" <tr>\n",
" <th>Date</th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2017-10-18</th>\n",
" <td>121.67</td>\n",
" <td>23.33</td>\n",
" <td>159.76</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-19</th>\n",
" <td>122.39</td>\n",
" <td>23.44</td>\n",
" <td>155.98</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-20</th>\n",
" <td>121.61</td>\n",
" <td>23.23</td>\n",
" <td>156.25</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-23</th>\n",
" <td>121.80</td>\n",
" <td>23.14</td>\n",
" <td>156.17</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-24</th>\n",
" <td>121.33</td>\n",
" <td>22.95</td>\n",
" <td>157.10</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-25</th>\n",
" <td>121.35</td>\n",
" <td>22.83</td>\n",
" <td>156.41</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-26</th>\n",
" <td>120.33</td>\n",
" <td>22.43</td>\n",
" <td>157.41</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-27</th>\n",
" <td>120.90</td>\n",
" <td>22.57</td>\n",
" <td>163.05</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-30</th>\n",
" <td>121.13</td>\n",
" <td>22.76</td>\n",
" <td>166.72</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-10-31</th>\n",
" <td>120.67</td>\n",
" <td>22.48</td>\n",
" <td>169.04</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" GLD GDX AAPL.O\n",
"Date \n",
"2017-10-18 121.67 23.33 159.76\n",
"2017-10-19 122.39 23.44 155.98\n",
"2017-10-20 121.61 23.23 156.25\n",
"2017-10-23 121.80 23.14 156.17\n",
"2017-10-24 121.33 22.95 157.10\n",
"2017-10-25 121.35 22.83 156.41\n",
"2017-10-26 120.33 22.43 157.41\n",
"2017-10-27 120.90 22.57 163.05\n",
"2017-10-30 121.13 22.76 166.72\n",
"2017-10-31 120.67 22.48 169.04"
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"get_data(symbols, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Data From Remote Server"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Only works when a respective app is running on a remote sever:"
]
},
{
"cell_type": "code",
"execution_count": 35,
"metadata": {},
"outputs": [],
"source": [
"# server IP = http://138.68.179.195/"
]
},
{
"cell_type": "code",
"execution_count": 36,
"metadata": {},
"outputs": [],
"source": [
"# url_server = \"http://138.68.179.195:7777/?symbols=%s&format=%s&no=%d\""
]
},
{
"cell_type": "code",
"execution_count": 37,
"metadata": {},
"outputs": [],
"source": [
"def get_data_server(symbols, no):\n",
" symbols = ','.join(symbols)\n",
" url = url_server % (symbols, 'csv', no)\n",
" print(url)\n",
" df = pd.read_csv(url, index_col=0, parse_dates=True)\n",
" return df "
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [],
"source": [
"# get_data_server(symbols, 10)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Working with Tick Data from FXCM"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [],
"source": [
"import fxcm_tick_reader as ftr"
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"('AUDCAD',\n",
" 'AUDCHF',\n",
" 'AUDJPY',\n",
" 'AUDNZD',\n",
" 'CADCHF',\n",
" 'EURAUD',\n",
" 'EURCHF',\n",
" 'EURGBP',\n",
" 'EURJPY',\n",
" 'EURUSD',\n",
" 'GBPCHF',\n",
" 'GBPJPY',\n",
" 'GBPNZD',\n",
" 'GBPUSD',\n",
" 'GBPCHF',\n",
" 'GBPJPY',\n",
" 'GBPNZD',\n",
" 'NZDCAD',\n",
" 'NZDCHF',\n",
" 'NZDJPY',\n",
" 'NZDUSD',\n",
" 'USDCAD',\n",
" 'USDCHF',\n",
" 'USDJPY')"
]
},
"execution_count": 40,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ftr.fxcm_tick_reader.symbols"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [],
"source": [
"import datetime as dt"
]
},
{
"cell_type": "code",
"execution_count": 42,
"metadata": {},
"outputs": [],
"source": [
"start = dt.datetime(2017, 11, 14)\n",
"end = dt.datetime(2017, 11, 16)"
]
},
{
"cell_type": "code",
"execution_count": 43,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching data from: https://tickdata.fxcorporate.com/EURUSD/2017/46.csv.gz\n",
"CPU times: user 2.14 s, sys: 483 ms, total: 2.63 s\n",
"Wall time: 46.1 s\n"
]
}
],
"source": [
"%time raw = ftr.fxcm_tick_reader('EURUSD', start, end)"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Bid</th>\n",
" <th>Ask</th>\n",
" </tr>\n",
" <tr>\n",
" <th>DateTime</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>11/12/2017 22:00:00.008</th>\n",
" <td>1.16559</td>\n",
" <td>1.16603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/12/2017 22:00:09.477</th>\n",
" <td>1.16559</td>\n",
" <td>1.16602</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/12/2017 22:00:12.590</th>\n",
" <td>1.16559</td>\n",
" <td>1.16603</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/12/2017 22:01:06.757</th>\n",
" <td>1.16559</td>\n",
" <td>1.16601</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/12/2017 22:01:07.044</th>\n",
" <td>1.16559</td>\n",
" <td>1.16603</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Bid Ask\n",
"DateTime \n",
"11/12/2017 22:00:00.008 1.16559 1.16603\n",
"11/12/2017 22:00:09.477 1.16559 1.16602\n",
"11/12/2017 22:00:12.590 1.16559 1.16603\n",
"11/12/2017 22:01:06.757 1.16559 1.16601\n",
"11/12/2017 22:01:07.044 1.16559 1.16603"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw.get_raw_data().head()"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Bid</th>\n",
" <th>Ask</th>\n",
" </tr>\n",
" <tr>\n",
" <th>DateTime</th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>11/17/2017 21:58:57.299</th>\n",
" <td>1.17866</td>\n",
" <td>1.17940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/17/2017 21:58:57.339</th>\n",
" <td>1.17868</td>\n",
" <td>1.17940</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/17/2017 21:58:57.372</th>\n",
" <td>1.17868</td>\n",
" <td>1.17946</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/17/2017 21:59:04.994</th>\n",
" <td>1.17870</td>\n",
" <td>1.17946</td>\n",
" </tr>\n",
" <tr>\n",
" <th>11/17/2017 21:59:05.967</th>\n",
" <td>1.17874</td>\n",
" <td>1.17948</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Bid Ask\n",
"DateTime \n",
"11/17/2017 21:58:57.299 1.17866 1.17940\n",
"11/17/2017 21:58:57.339 1.17868 1.17940\n",
"11/17/2017 21:58:57.372 1.17868 1.17946\n",
"11/17/2017 21:59:04.994 1.17870 1.17946\n",
"11/17/2017 21:59:05.967 1.17874 1.17948"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"raw.get_raw_data().tail()"
]
},
{
"cell_type": "code",
"execution_count": 46,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"Index: 999666 entries, 11/12/2017 22:00:00.008 to 11/17/2017 21:59:05.967\n",
"Data columns (total 2 columns):\n",
"Bid 999666 non-null float64\n",
"Ask 999666 non-null float64\n",
"dtypes: float64(2)\n",
"memory usage: 22.9+ MB\n"
]
}
],
"source": [
"raw.get_raw_data().info()"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.3 s, sys: 62.5 ms, total: 4.37 s\n",
"Wall time: 4.44 s\n"
]
}
],
"source": [
"%time data = raw.get_data()"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Bid</th>\n",
" <th>Ask</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.004</th>\n",
" <td>1.18446</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.035</th>\n",
" <td>1.18446</td>\n",
" <td>1.18447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.045</th>\n",
" <td>1.18447</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.052</th>\n",
" <td>1.18448</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.058</th>\n",
" <td>1.18447</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.079</th>\n",
" <td>1.18448</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.084</th>\n",
" <td>1.18447</td>\n",
" <td>1.18449</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.090</th>\n",
" <td>1.18447</td>\n",
" <td>1.18448</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.104</th>\n",
" <td>1.18447</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.110</th>\n",
" <td>1.18446</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.170</th>\n",
" <td>1.18446</td>\n",
" <td>1.18447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.209</th>\n",
" <td>1.18446</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.234</th>\n",
" <td>1.18444</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.304</th>\n",
" <td>1.18444</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.309</th>\n",
" <td>1.18445</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.311</th>\n",
" <td>1.18446</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.365</th>\n",
" <td>1.18447</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.376</th>\n",
" <td>1.18447</td>\n",
" <td>1.18447</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.412</th>\n",
" <td>1.18447</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.480</th>\n",
" <td>1.18446</td>\n",
" <td>1.18446</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.517</th>\n",
" <td>1.18446</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.522</th>\n",
" <td>1.18444</td>\n",
" <td>1.18445</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.583</th>\n",
" <td>1.18444</td>\n",
" <td>1.18444</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.785</th>\n",
" <td>1.18444</td>\n",
" <td>1.18443</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.791</th>\n",
" <td>1.18444</td>\n",
" <td>1.18441</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.794</th>\n",
" <td>1.18444</td>\n",
" <td>1.18439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.802</th>\n",
" <td>1.18441</td>\n",
" <td>1.18437</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.805</th>\n",
" <td>1.18441</td>\n",
" <td>1.18439</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.807</th>\n",
" <td>1.18441</td>\n",
" <td>1.18438</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:00.816</th>\n",
" <td>1.18441</td>\n",
" <td>1.18437</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:02.632</th>\n",
" <td>1.18420</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:02.980</th>\n",
" <td>1.18420</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.075</th>\n",
" <td>1.18420</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.078</th>\n",
" <td>1.18418</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.080</th>\n",
" <td>1.18418</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.082</th>\n",
" <td>1.18418</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.084</th>\n",
" <td>1.18418</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.086</th>\n",
" <td>1.18418</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.190</th>\n",
" <td>1.18418</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.192</th>\n",
" <td>1.18418</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.194</th>\n",
" <td>1.18419</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.196</th>\n",
" <td>1.18420</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.198</th>\n",
" <td>1.18419</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.200</th>\n",
" <td>1.18420</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.202</th>\n",
" <td>1.18420</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.204</th>\n",
" <td>1.18420</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.475</th>\n",
" <td>1.18419</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.504</th>\n",
" <td>1.18418</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.526</th>\n",
" <td>1.18418</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.606</th>\n",
" <td>1.18417</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.612</th>\n",
" <td>1.18417</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.719</th>\n",
" <td>1.18416</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.842</th>\n",
" <td>1.18417</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.856</th>\n",
" <td>1.18418</td>\n",
" <td>1.18418</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.862</th>\n",
" <td>1.18419</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.877</th>\n",
" <td>1.18420</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.896</th>\n",
" <td>1.18421</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.903</th>\n",
" <td>1.18420</td>\n",
" <td>1.18419</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.906</th>\n",
" <td>1.18421</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2017-11-15 14:00:03.972</th>\n",
" <td>1.18422</td>\n",
" <td>1.18420</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>109 rows × 2 columns</p>\n",
"</div>"
],
"text/plain": [
" Bid Ask\n",
"2017-11-15 14:00:00.004 1.18446 1.18448\n",
"2017-11-15 14:00:00.035 1.18446 1.18447\n",
"2017-11-15 14:00:00.045 1.18447 1.18448\n",
"2017-11-15 14:00:00.052 1.18448 1.18448\n",
"2017-11-15 14:00:00.058 1.18447 1.18448\n",
"2017-11-15 14:00:00.079 1.18448 1.18448\n",
"2017-11-15 14:00:00.084 1.18447 1.18449\n",
"2017-11-15 14:00:00.090 1.18447 1.18448\n",
"2017-11-15 14:00:00.104 1.18447 1.18446\n",
"2017-11-15 14:00:00.110 1.18446 1.18446\n",
"2017-11-15 14:00:00.170 1.18446 1.18447\n",
"2017-11-15 14:00:00.209 1.18446 1.18446\n",
"2017-11-15 14:00:00.234 1.18444 1.18446\n",
"2017-11-15 14:00:00.304 1.18444 1.18445\n",
"2017-11-15 14:00:00.309 1.18445 1.18445\n",
"2017-11-15 14:00:00.311 1.18446 1.18445\n",
"2017-11-15 14:00:00.365 1.18447 1.18445\n",
"2017-11-15 14:00:00.376 1.18447 1.18447\n",
"2017-11-15 14:00:00.412 1.18447 1.18446\n",
"2017-11-15 14:00:00.480 1.18446 1.18446\n",
"2017-11-15 14:00:00.517 1.18446 1.18445\n",
"2017-11-15 14:00:00.522 1.18444 1.18445\n",
"2017-11-15 14:00:00.583 1.18444 1.18444\n",
"2017-11-15 14:00:00.785 1.18444 1.18443\n",
"2017-11-15 14:00:00.791 1.18444 1.18441\n",
"2017-11-15 14:00:00.794 1.18444 1.18439\n",
"2017-11-15 14:00:00.802 1.18441 1.18437\n",
"2017-11-15 14:00:00.805 1.18441 1.18439\n",
"2017-11-15 14:00:00.807 1.18441 1.18438\n",
"2017-11-15 14:00:00.816 1.18441 1.18437\n",
"... ... ...\n",
"2017-11-15 14:00:02.632 1.18420 1.18420\n",
"2017-11-15 14:00:02.980 1.18420 1.18419\n",
"2017-11-15 14:00:03.075 1.18420 1.18418\n",
"2017-11-15 14:00:03.078 1.18418 1.18418\n",
"2017-11-15 14:00:03.080 1.18418 1.18419\n",
"2017-11-15 14:00:03.082 1.18418 1.18418\n",
"2017-11-15 14:00:03.084 1.18418 1.18419\n",
"2017-11-15 14:00:03.086 1.18418 1.18418\n",
"2017-11-15 14:00:03.190 1.18418 1.18419\n",
"2017-11-15 14:00:03.192 1.18418 1.18418\n",
"2017-11-15 14:00:03.194 1.18419 1.18418\n",
"2017-11-15 14:00:03.196 1.18420 1.18418\n",
"2017-11-15 14:00:03.198 1.18419 1.18418\n",
"2017-11-15 14:00:03.200 1.18420 1.18418\n",
"2017-11-15 14:00:03.202 1.18420 1.18419\n",
"2017-11-15 14:00:03.204 1.18420 1.18420\n",
"2017-11-15 14:00:03.475 1.18419 1.18420\n",
"2017-11-15 14:00:03.504 1.18418 1.18420\n",
"2017-11-15 14:00:03.526 1.18418 1.18419\n",
"2017-11-15 14:00:03.606 1.18417 1.18419\n",
"2017-11-15 14:00:03.612 1.18417 1.18418\n",
"2017-11-15 14:00:03.719 1.18416 1.18418\n",
"2017-11-15 14:00:03.842 1.18417 1.18418\n",
"2017-11-15 14:00:03.856 1.18418 1.18418\n",
"2017-11-15 14:00:03.862 1.18419 1.18419\n",
"2017-11-15 14:00:03.877 1.18420 1.18419\n",
"2017-11-15 14:00:03.896 1.18421 1.18419\n",
"2017-11-15 14:00:03.903 1.18420 1.18419\n",
"2017-11-15 14:00:03.906 1.18421 1.18420\n",
"2017-11-15 14:00:03.972 1.18422 1.18420\n",
"\n",
"[109 rows x 2 columns]"
]
},
"execution_count": 48,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"data.loc['2017-11-15 14:00:00':'2017-11-15 14:00:03']"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [],
"source": [
"resam = data.resample('1min', label='right').last()"
]
},
{
"cell_type": "code",
"execution_count": 50,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"<class 'pandas.core.frame.DataFrame'>\n",
"DatetimeIndex: 7200 entries, 2017-11-12 22:01:00 to 2017-11-17 22:00:00\n",
"Freq: T\n",
"Data columns (total 2 columns):\n",
"Bid 7171 non-null float64\n",
"Ask 7171 non-null float64\n",
"dtypes: float64(2)\n",
"memory usage: 168.8 KB\n"
]
}
],
"source": [
"resam.info()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"<img src='http://hilpisch.com/tpq_logo.png' width=\"300px\" align=\"right\">"
]
}
],
"metadata": {
"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.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 2
}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

View raw

(Sorry about that, but we can’t show files that are this big right now.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment