{
"cells": [
{
"cell_type": "code",
"execution_count": 117,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T12:02:38.049374Z",
"start_time": "2018-08-06T12:02:35.686591Z"
},
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Installing requirements ..\n",
"Done\n"
]
},
{
"data": {
"text/html": [
""
],
"text/vnd.plotly.v1+html": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/html": [
"\n",
"\n"
],
"text/plain": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%run \"Retropy_framework.ipynb\""
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T06:18:34.796365Z",
"start_time": "2018-08-06T06:18:34.772868Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"2016-01-01 0.01\n",
"2016-01-02 0.01\n",
"2016-01-03 0.02\n",
"2016-01-04 0.01\n",
"2016-01-05 -0.00\n",
"2016-01-06 -0.02\n",
"2016-01-07 0.00\n",
"2016-01-08 -0.00\n",
"2016-01-09 0.02\n",
"2016-01-10 0.01\n",
"2016-01-11 -0.01\n",
"2016-01-12 -0.02\n",
"2016-01-13 0.01\n",
"2016-01-14 0.01\n",
"2016-01-15 0.02\n",
"2016-01-16 0.01\n",
"2016-01-17 -0.01\n",
"2016-01-18 -0.01\n",
"2016-01-19 0.00\n",
"2016-01-20 0.01\n",
"2016-01-21 0.02\n",
"2016-01-22 0.01\n",
"2016-01-23 0.00\n",
"2016-01-24 -0.00\n",
"2016-01-25 0.01\n",
"2016-01-26 -0.01\n",
"2016-01-27 -0.01\n",
"2016-01-28 -0.00\n",
"2016-01-29 -0.00\n",
"2016-01-30 0.01\n",
"2016-01-31 -0.01\n",
"2016-02-01 -0.01\n",
"2016-02-02 0.01\n",
"2016-02-03 -0.00\n",
"2016-02-04 0.00\n",
"2016-02-05 -0.01\n",
"2016-02-06 -0.00\n",
"2016-02-07 0.00\n",
"2016-02-08 0.00\n",
"2016-02-09 0.02\n",
"2016-02-10 -0.00\n",
"2016-02-11 -0.01\n",
"2016-02-12 -0.00\n",
"2016-02-13 -0.00\n",
"2016-02-14 -0.01\n",
"2016-02-15 -0.01\n",
"2016-02-16 -0.01\n",
"2016-02-17 -0.01\n",
"2016-02-18 0.01\n",
"2016-02-19 0.01\n",
"2016-02-20 0.01\n",
"2016-02-21 -0.01\n",
"2016-02-22 -0.01\n",
"2016-02-23 0.01\n",
"2016-02-24 0.01\n",
"2016-02-25 0.02\n",
"2016-02-26 -0.00\n",
"2016-02-27 0.02\n",
"2016-02-28 -0.00\n",
"2016-02-29 -0.01\n",
"2016-03-01 0.01\n",
"2016-03-02 -0.01\n",
"2016-03-03 0.01\n",
"2016-03-04 -0.00\n",
"2016-03-05 0.00\n",
"2016-03-06 -0.01\n",
"2016-03-07 0.00\n",
"2016-03-08 -0.01\n",
"2016-03-09 -0.03\n",
"2016-03-10 0.01\n",
"2016-03-11 0.01\n",
"2016-03-12 -0.00\n",
"2016-03-13 -0.00\n",
"2016-03-14 -0.01\n",
"2016-03-15 0.01\n",
"2016-03-16 0.01\n",
"2016-03-17 0.00\n",
"2016-03-18 0.01\n",
"2016-03-19 -0.01\n",
"2016-03-20 -0.00\n",
"2016-03-21 -0.01\n",
"2016-03-22 0.01\n",
"2016-03-23 -0.00\n",
"2016-03-24 0.01\n",
"2016-03-25 -0.00\n",
"2016-03-26 0.00\n",
"2016-03-27 -0.00\n",
"2016-03-28 0.00\n",
"2016-03-29 -0.00\n",
"2016-03-30 -0.00\n",
"2016-03-31 -0.01\n",
"2016-04-01 -0.01\n",
"2016-04-02 -0.00\n",
"2016-04-03 0.00\n",
"2016-04-04 -0.00\n",
"2016-04-05 -0.01\n",
"2016-04-06 0.01\n",
"2016-04-07 0.00\n",
"2016-04-08 0.00\n",
"2016-04-09 0.02\n",
"2016-04-10 0.01\n",
"2016-04-11 0.00\n",
"2016-04-12 0.00\n",
"2016-04-13 -0.01\n",
"2016-04-14 0.00\n",
"2016-04-15 -0.03\n",
"2016-04-16 0.01\n",
"2016-04-17 0.00\n",
"2016-04-18 0.00\n",
"2016-04-19 0.01\n",
"2016-04-20 -0.00\n",
"2016-04-21 0.01\n",
"2016-04-22 -0.01\n",
"2016-04-23 -0.01\n",
"2016-04-24 0.01\n",
"2016-04-25 0.01\n",
"2016-04-26 -0.01\n",
"2016-04-27 0.01\n",
"2016-04-28 -0.01\n",
"2016-04-29 0.01\n",
"2016-04-30 0.01\n",
"2016-05-01 -0.01\n",
"2016-05-02 -0.01\n",
"2016-05-03 -0.01\n",
"2016-05-04 0.01\n",
"2016-05-05 0.01\n",
"2016-05-06 -0.00\n",
"2016-05-07 0.00\n",
"2016-05-08 0.00\n",
"2016-05-09 -0.01\n",
"2016-05-10 0.01\n",
"2016-05-11 0.00\n",
"2016-05-12 0.01\n",
"2016-05-13 -0.00\n",
"2016-05-14 -0.00\n",
"2016-05-15 -0.00\n",
"2016-05-16 -0.00\n",
"2016-05-17 -0.00\n",
"2016-05-18 -0.01\n",
"2016-05-19 0.00\n",
"2016-05-20 -0.00\n",
"2016-05-21 0.03\n",
"2016-05-22 0.00\n",
"2016-05-23 -0.03\n",
"2016-05-24 -0.00\n",
"2016-05-25 0.02\n",
"2016-05-26 0.01\n",
"2016-05-27 0.02\n",
"2016-05-28 0.02\n",
"2016-05-29 -0.00\n",
"2016-05-30 0.00\n",
"2016-05-31 -0.01\n",
"2016-06-01 -0.01\n",
"2016-06-02 0.00\n",
"2016-06-03 0.00\n",
"2016-06-04 0.00\n",
"2016-06-05 -0.00\n",
"2016-06-06 0.01\n",
"2016-06-07 -0.01\n",
"2016-06-08 0.00\n",
"2016-06-09 0.00\n",
"2016-06-10 0.00\n",
"2016-06-11 0.01\n",
"2016-06-12 0.01\n",
"2016-06-13 -0.01\n",
"2016-06-14 -0.01\n",
"2016-06-15 0.01\n",
"2016-06-16 0.01\n",
"2016-06-17 -0.01\n",
"2016-06-18 -0.01\n",
"2016-06-19 0.01\n",
"2016-06-20 0.01\n",
"2016-06-21 0.00\n",
"2016-06-22 0.02\n",
"2016-06-23 -0.01\n",
"2016-06-24 0.01\n",
"2016-06-25 -0.00\n",
"2016-06-26 -0.00\n",
"2016-06-27 0.02\n",
"2016-06-28 -0.02\n",
"2016-06-29 -0.01\n",
"2016-06-30 -0.01\n",
"2016-07-01 0.01\n",
"2016-07-02 0.00\n",
"2016-07-03 -0.01\n",
"2016-07-04 -0.02\n",
"2016-07-05 -0.02\n",
"2016-07-06 -0.00\n",
"2016-07-07 0.01\n",
"2016-07-08 -0.01\n",
"2016-07-09 0.00\n",
"2016-07-10 -0.02\n",
"2016-07-11 -0.01\n",
"2016-07-12 -0.00\n",
"2016-07-13 0.01\n",
"2016-07-14 0.00\n",
"2016-07-15 0.00\n",
"2016-07-16 -0.02\n",
"2016-07-17 -0.00\n",
"2016-07-18 -0.01\n",
"2016-07-19 -0.00\n",
"2016-07-20 0.00\n",
"2016-07-21 0.00\n",
"2016-07-22 0.00\n",
"2016-07-23 -0.01\n",
"2016-07-24 0.01\n",
"2016-07-25 0.01\n",
"2016-07-26 -0.00\n",
"2016-07-27 0.01\n",
"2016-07-28 0.01\n",
"2016-07-29 0.00\n",
"2016-07-30 -0.01\n",
"2016-07-31 -0.02\n",
"2016-08-01 0.01\n",
"2016-08-02 0.00\n",
"2016-08-03 -0.00\n",
"2016-08-04 -0.01\n",
"2016-08-05 -0.01\n",
"2016-08-06 0.02\n",
"2016-08-07 -0.01\n",
"2016-08-08 0.00\n",
"2016-08-09 -0.01\n",
"2016-08-10 0.00\n",
"2016-08-11 0.01\n",
"2016-08-12 -0.01\n",
"2016-08-13 0.01\n",
"2016-08-14 -0.01\n",
"2016-08-15 -0.00\n",
"2016-08-16 0.01\n",
"2016-08-17 0.00\n",
"2016-08-18 0.00\n",
"2016-08-19 -0.00\n",
"2016-08-20 -0.01\n",
"2016-08-21 0.01\n",
"2016-08-22 0.00\n",
"2016-08-23 0.00\n",
"2016-08-24 0.02\n",
"2016-08-25 0.00\n",
"2016-08-26 0.01\n",
"2016-08-27 -0.02\n",
"2016-08-28 0.00\n",
"2016-08-29 -0.00\n",
"2016-08-30 -0.01\n",
"2016-08-31 -0.00\n",
"2016-09-01 -0.00\n",
"2016-09-02 -0.01\n",
"2016-09-03 -0.01\n",
"2016-09-04 0.00\n",
"2016-09-05 0.01\n",
"2016-09-06 0.02\n",
"2016-09-07 0.02\n",
"2016-09-08 -0.01\n",
"2016-09-09 0.01\n",
"2016-09-10 0.02\n",
"2016-09-11 0.01\n",
"2016-09-12 -0.00\n",
"2016-09-13 -0.02\n",
"2016-09-14 -0.01\n",
"2016-09-15 -0.00\n",
"2016-09-16 0.00\n",
"2016-09-17 0.01\n",
"2016-09-18 0.00\n",
"2016-09-19 -0.01\n",
"2016-09-20 0.00\n",
"2016-09-21 -0.02\n",
"2016-09-22 -0.01\n",
"2016-09-23 -0.01\n",
"2016-09-24 -0.00\n",
"2016-09-25 -0.00\n",
"2016-09-26 -0.00\n",
"2016-09-27 -0.00\n",
"2016-09-28 -0.01\n",
"2016-09-29 -0.02\n",
"2016-09-30 0.02\n",
"2016-10-01 -0.02\n",
"2016-10-02 0.01\n",
"2016-10-03 -0.01\n",
"2016-10-04 -0.01\n",
"2016-10-05 -0.01\n",
"2016-10-06 0.02\n",
"2016-10-07 0.00\n",
"2016-10-08 -0.00\n",
"2016-10-09 0.00\n",
"2016-10-10 -0.01\n",
"2016-10-11 -0.00\n",
"2016-10-12 0.01\n",
"2016-10-13 0.01\n",
"2016-10-14 -0.01\n",
"2016-10-15 -0.01\n",
"2016-10-16 0.01\n",
"2016-10-17 0.01\n",
"2016-10-18 -0.00\n",
"2016-10-19 0.00\n",
"2016-10-20 0.02\n",
"2016-10-21 0.00\n",
"2016-10-22 -0.01\n",
"2016-10-23 0.00\n",
"2016-10-24 -0.00\n",
"2016-10-25 0.01\n",
"2016-10-26 0.00\n",
"2016-10-27 0.01\n",
"2016-10-28 0.01\n",
"2016-10-29 -0.01\n",
"2016-10-30 -0.02\n",
"2016-10-31 -0.01\n",
"2016-11-01 -0.02\n",
"2016-11-02 -0.00\n",
"2016-11-03 0.01\n",
"2016-11-04 -0.00\n",
"2016-11-05 -0.01\n",
"2016-11-06 -0.01\n",
"2016-11-07 0.00\n",
"2016-11-08 0.01\n",
"2016-11-09 0.01\n",
"2016-11-10 0.00\n",
"2016-11-11 0.01\n",
"2016-11-12 -0.00\n",
"2016-11-13 -0.00\n",
"2016-11-14 0.01\n",
"2016-11-15 -0.02\n",
"2016-11-16 -0.00\n",
"2016-11-17 0.00\n",
"2016-11-18 -0.00\n",
"2016-11-19 -0.00\n",
"2016-11-20 0.00\n",
"2016-11-21 0.01\n",
"2016-11-22 0.01\n",
"2016-11-23 0.01\n",
"2016-11-24 -0.02\n",
"2016-11-25 0.02\n",
"2016-11-26 0.00\n",
"2016-11-27 -0.01\n",
"2016-11-28 0.00\n",
"2016-11-29 0.01\n",
"2016-11-30 -0.01\n",
"2016-12-01 0.00\n",
"2016-12-02 -0.01\n",
"2016-12-03 0.01\n",
"2016-12-04 -0.01\n",
"2016-12-05 0.02\n",
"2016-12-06 0.00\n",
"2016-12-07 0.01\n",
"2016-12-08 -0.00\n",
"2016-12-09 0.02\n",
"2016-12-10 -0.00\n",
"2016-12-11 0.01\n",
"2016-12-12 -0.00\n",
"2016-12-13 -0.02\n",
"2016-12-14 0.00\n",
"2016-12-15 0.02\n",
"2016-12-16 0.01\n",
"2016-12-17 0.01\n",
"2016-12-18 -0.01\n",
"2016-12-19 -0.00\n",
"2016-12-20 0.02\n",
"2016-12-21 -0.00\n",
"2016-12-22 0.00\n",
"2016-12-23 -0.01\n",
"2016-12-24 0.01\n",
"2016-12-25 0.01\n",
"2016-12-26 0.02\n",
"2016-12-27 -0.00\n",
"2016-12-28 0.00\n",
"2016-12-29 0.02\n",
"2016-12-30 0.01\n",
"2016-12-31 -0.01\n",
"2017-01-01 0.02\n",
"2017-01-02 0.01\n",
"2017-01-03 -0.01\n",
"2017-01-04 0.01\n",
"2017-01-05 0.00\n",
"2017-01-06 0.01\n",
"2017-01-07 -0.02\n",
"2017-01-08 0.02\n",
"2017-01-09 0.01\n",
"2017-01-10 -0.01\n",
"2017-01-11 -0.00\n",
"2017-01-12 -0.01\n",
"2017-01-13 0.01\n",
"2017-01-14 -0.01\n",
"2017-01-15 0.01\n",
"2017-01-16 -0.01\n",
"2017-01-17 0.01\n",
"2017-01-18 0.00\n",
"2017-01-19 0.01\n",
"2017-01-20 -0.00\n",
"2017-01-21 0.00\n",
"2017-01-22 0.02\n",
"2017-01-23 -0.00\n",
"2017-01-24 0.01\n",
"2017-01-25 0.00\n",
"2017-01-26 -0.01\n",
"2017-01-27 0.00\n",
"2017-01-28 -0.01\n",
"2017-01-29 0.01\n",
"2017-01-30 -0.00\n",
"2017-01-31 0.01\n",
"2017-02-01 0.02\n",
"2017-02-02 0.01\n",
"2017-02-03 0.01\n",
"Freq: D, dtype: float64"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from pyfinance import *\n",
">>> s = np.random.randn(400) / 100 + 0.0008\n",
">>> idx = pd.date_range(start='2016', periods=len(s)) # default daily freq.\n",
">>> ts = TSeries(s, index=idx)\n",
"ts"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T06:21:22.481879Z",
"start_time": "2018-08-06T06:21:19.261061Z"
}
},
"outputs": [
{
"data": {
"text/html": [
"\n",
"\n",
"
\n",
" \n",
" \n",
" | \n",
" term_spread | \n",
" copper | \n",
"
\n",
" \n",
" DATE | \n",
" | \n",
" | \n",
"
\n",
" \n",
" \n",
" \n",
" 2000-02-01 | \n",
" -1.41 | \n",
" -0.02 | \n",
"
\n",
" \n",
" 2000-03-01 | \n",
" 2.00 | \n",
" -0.04 | \n",
"
\n",
" \n",
" 2000-04-01 | \n",
" 0.52 | \n",
" -0.03 | \n",
"
\n",
" \n",
" 2000-05-01 | \n",
" -0.10 | \n",
" 0.06 | \n",
"
\n",
" \n",
" 2000-06-01 | \n",
" 0.03 | \n",
" -0.02 | \n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" term_spread copper\n",
"DATE \n",
"2000-02-01 -1.41 -0.02\n",
"2000-03-01 2.00 -0.04\n",
"2000-04-01 0.52 -0.03\n",
"2000-05-01 -0.10 0.06\n",
"2000-06-01 0.03 -0.02"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"DATE\n",
"2000-02-01 0.01\n",
"2000-03-01 -0.00\n",
"2000-04-01 0.01\n",
"2000-05-01 0.02\n",
"2000-06-01 -0.01\n",
"Freq: MS, Name: usd, dtype: float64"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
">>> from pandas_datareader import DataReader\n",
"\n",
">>> syms = {\n",
"... 'TWEXBMTH': 'usd',\n",
"... 'T10Y2YM': 'term_spread',\n",
"... 'PCOPPUSDM': 'copper'\n",
"... }\n",
"\n",
">>> data = DataReader(syms.keys(), data_source='fred',\n",
"... start='2000-01-01', end='2016-12-31')\\\n",
"... .pct_change()\\\n",
"... .dropna()\\\n",
"... .rename(columns=syms)\n",
"\n",
">>> y = data.pop('usd')\n",
"\n",
">>> data.head()\n",
"\n",
">>> y.head()\n"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T06:23:30.344992Z",
"start_time": "2018-08-06T06:23:11.774037Z"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Fetching OLS from AV .. Failed to fetch OLS from AV, trying from Y .. Fetching OLS from Y .. Failed to fetch implied symbol: OLS\n"
]
},
{
"data": {
"text/plain": [
"0.001230320443416746"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"array([-0.00062647, -0.09490566])"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"33.42923069295481"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"(203,)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"(203,)"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
">>> from pyfinance import ols\n",
"\n",
">>> model = ols.OLS(y=y, x=data)\n",
"\n",
">>> model.alpha # the intercept - a scalar\n",
"\n",
">>> model.beta # the coefficients\n",
"\n",
">>> model.fstat\n",
"\n",
"# Residuals and predicted y values are NumPy arrays\n",
"# with the same shape as `y`.\n",
">>> model.resids.shape\n",
"\n",
">>> model.predicted.shape\n"
]
},
{
"cell_type": "code",
"execution_count": 201,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T08:23:04.422562Z",
"start_time": "2018-08-06T08:23:04.417060Z"
}
},
"outputs": [
{
"data": {
"text/plain": [
"365.0"
]
},
"execution_count": 201,
"metadata": {},
"output_type": "execute_result"
}
],
"source": []
},
{
"cell_type": "code",
"execution_count": 233,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T08:31:28.056977Z",
"start_time": "2018-08-06T08:31:27.901832Z"
}
},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"data": [
{
"name": "R^2",
"text": "R^2",
"type": "scatter",
"uid": "1cd5b3d8-9953-11e8-8e95-000c29825b7f",
"x": [
"2016-12-31",
"2017-01-31",
"2017-02-28",
"2017-03-31",
"2017-04-30",
"2017-05-31",
"2017-06-30",
"2017-07-31",
"2017-08-31",
"2017-09-30",
"2017-10-31",
"2017-11-30",
"2017-12-31",
"2018-01-31",
"2018-02-28",
"2018-03-31",
"2018-04-30",
"2018-05-31",
"2018-06-30",
"2018-07-31"
],
"y": [
0.3022435445486228,
0.4209781480128344,
0.3663952443689895,
0.4507307397222184,
0.5589805728497712,
0.4857173335814739,
0.2136723404954805,
0.23096927597444025,
0.18001706887623473,
0.06924732787152661,
0.12053213813335453,
0.12254075899604717,
0.11630405745117971,
0.07168380537501244,
0.06381541622231267,
0.08404129277110806,
0.08730918379437957,
0.002481929166200741,
0.011776635961231227,
0.00016602027815391934
]
},
{
"name": "MINT beta",
"text": "MINT beta",
"type": "scatter",
"uid": "1cd5b3d9-9953-11e8-8e95-000c29825b7f",
"x": [
"2016-12-31",
"2017-01-31",
"2017-02-28",
"2017-03-31",
"2017-04-30",
"2017-05-31",
"2017-06-30",
"2017-07-31",
"2017-08-31",
"2017-09-30",
"2017-10-31",
"2017-11-30",
"2017-12-31",
"2018-01-31",
"2018-02-28",
"2018-03-31",
"2018-04-30",
"2018-05-31",
"2018-06-30",
"2018-07-31"
],
"y": [
0.4608290364986796,
0.5179208224850931,
0.47172276727711093,
0.5365384798199249,
0.5216819000717673,
0.7801409593389478,
0.6022490952286845,
0.6251124125349878,
0.6466859810174346,
0.4749453044187809,
0.5833237872590782,
0.5983036678646625,
0.5919107559931149,
0.5698888251397196,
0.43847653772211476,
0.5558763326815435,
0.5724936422768746,
-0.06153890940917685,
0.11704838786662392,
0.014220704180947397
]
}
],
"layout": {
"hovermode": "closest",
"legend": {
"bgcolor": "rgb(255,255,255,187)",
"bordercolor": "#888888",
"borderwidth": 1,
"font": {
"color": "#000",
"family": "sans-serif",
"size": 12
},
"traceorder": "normal",
"x": 0,
"y": 1
},
"margin": {
"b": 30,
"l": 30,
"pad": 0,
"r": 30,
"t": 30
},
"shapes": [
{
"line": {
"color": "red",
"width": 1
},
"opacity": 1,
"type": "line",
"x0": 0,
"x1": 1,
"xref": "paper",
"y0": -1,
"y1": -1
},
{
"line": {
"color": "red",
"width": 1
},
"opacity": 1,
"type": "line",
"x0": 0,
"x1": 1,
"xref": "paper",
"y0": 0,
"y1": 0
},
{
"line": {
"color": "red",
"width": 1
},
"opacity": 1,
"type": "line",
"x0": 0,
"x1": 1,
"xref": "paper",
"y0": 1,
"y1": 1
}
],
"showlegend": true,
"yaxis": {
"autorange": true
}
}
},
"text/html": [
""
],
"text/vnd.plotly.v1+html": [
""
]
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"application/vnd.plotly.v1+json": {
"data": [
{
"name": "NEAR - NEAR / MINT - MINT",
"text": "NEAR - NEAR / MINT - MINT",
"type": "scatter",
"uid": "1cd5b3da-9953-11e8-8e95-000c29825b7f",
"x": [
"2016-02-29",
"2016-03-31",
"2016-04-30",
"2016-05-31",
"2016-06-30",
"2016-07-31",
"2016-08-31",
"2016-09-30",
"2016-10-31",
"2016-11-30",
"2016-12-31",
"2017-01-31",
"2017-02-28",
"2017-03-31",
"2017-04-30",
"2017-05-31",
"2017-06-30",
"2017-07-31",
"2017-08-31",
"2017-09-30",
"2017-10-31",
"2017-11-30",
"2017-12-31",
"2018-01-31",
"2018-02-28",
"2018-03-31",
"2018-04-30",
"2018-05-31",
"2018-06-30",
"2018-07-31"
],
"y": [
-0.4667432932007972,
0.6044320425658753,
0.5078266365556895,
0.1547671072773191,
1.657078855059975,
0.5951606750510529,
0.5151516542130272,
1.0082483694035804,
0.27942159453461685,
1.2967163218802324,
1.3220448686681505,
0.5436560637855271,
0.4827336644646455,
0.9184965890246373,
0.9813394783463009,
0.49223795794451336,
1.4212607739271441,
1.015808717874245,
0.932170407803931,
0.6233930665623652,
0.5100515406806657,
0.6573873583892073,
0.8966249559043787,
1.4851630111604361,
0.34696408716763777,
1.506038934409366,
0.703520775534849,
1.282195477091862,
0.8439230625519059,
1.060567122003657
]
}
],
"layout": {
"hovermode": "closest",
"legend": {
"bgcolor": "rgb(255,255,255,187)",
"bordercolor": "#888888",
"borderwidth": 1,
"font": {
"color": "#000",
"family": "sans-serif",
"size": 12
},
"traceorder": "normal",
"x": 0,
"y": 1
},
"margin": {
"b": 30,
"l": 30,
"pad": 0,
"r": 30,
"t": 30
},
"showlegend": true,
"yaxis": {
"autorange": true
}
}
},
"text/html": [
""
],
"text/vnd.plotly.v1+html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def show_rolling_beta(target, sources, window=None, rsq=True, betaSum=False, pvalue=False, freq=None):\n",
" if not isinstance(sources, list):\n",
" sources = [sources]\n",
" \n",
" target = get(target)\n",
" sources = get(sources)\n",
" names = [s.name for s in sources]\n",
" \n",
" target = logret(target)\n",
" sources = lmap(logret, sources)\n",
" \n",
" target = unwrap(target)\n",
" sources = lmap(unwrap, sources)\n",
" \n",
" sources = pd.DataFrame(sources).T.dropna()\n",
"\n",
" target, sources = sync(target, sources)\n",
" \n",
" if freq:\n",
" target = target.asfreq(freq)\n",
" sources = sources.asfreq(freq)\n",
" if window is None:\n",
" window = int(get_anlz_factor(freq))\n",
" else:\n",
" if window is None:\n",
" window = 365\n",
" \n",
" rolling = ols.PandasRollingOLS(y=target, x=sources, window=window)\n",
" #rolling.beta.head()\n",
" #rolling.alpha.head()\n",
" #rolling.pvalue_alpha.head()\n",
" #type(rolling.beta[\"feature1\"])\n",
" \n",
" \n",
" res = []\n",
" \n",
" if pvalue:\n",
" _pvalue = rolling.pvalue_beta\n",
" _pvalue.columns = [s + \" pvalue\" for s in names]\n",
" res += [_pvalue, 0.05]\n",
" \n",
" if rsq:\n",
" rsq = rolling.rsq\n",
" rsq.name = \"R^2\"\n",
" res += [rsq]\n",
"\n",
" _beta = rolling.beta\n",
" _beta.columns = [s + \" beta\" for s in names]\n",
" res += [_beta]\n",
" \n",
" if betaSum and len(names) > 1:\n",
" _betaSum = rolling.beta.sum(axis=1)\n",
" _betaSum.name = \"beta sum\"\n",
" res += [_betaSum]\n",
" \n",
" res += [-1, 0, 1]\n",
" \n",
" show(res, ta=False)\n",
" \n",
"#show_rolling_beta(PERM, [lc, gold, lgb], pvalue=False)\n",
"#show_rolling_beta(VT, [VTI, VXUS])\n",
"#show_rolling_beta(SVXY, ZIV, window=60, pvalue=True)\n",
"show_rolling_beta(NEAR, MINT, freq=\"M\")\n",
"#show(NEAR, MINT)\n",
"\n",
"show(logret(NEAR.asfreq(\"M\")) / logret(MINT.asfreq(\"M\")), ta=False)"
]
},
{
"cell_type": "code",
"execution_count": 232,
"metadata": {
"ExecuteTime": {
"end_time": "2018-08-06T08:31:16.568583Z",
"start_time": "2018-08-06T08:31:16.278073Z"
},
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"(-0.002, 0.005)"
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"text/plain": [
"(-0.002, 0.005)"
]
},
"execution_count": 232,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"