ENH strategy col_names support ENH classic linreg util TST strategies update

This commit is contained in:
Kevin Johnson committed 2020-09-25 09:18:46 -07:00
1 parent 591d5a474d
commit 3eee8901bf
11 files changed
+515 -272

No files matched your search

+1
View File
@@ -128,6 +128,7 @@ data/tulip.csv
examples/cache.sqlite
examples/taplot.py
examples/alpaca_trader.py
examples/ChartTA.ipynb
examples/charting.ipynb
examples/ib_trader.ipynb
+9 -9
View File
@@ -45,7 +45,7 @@
"Numpy v1.18.3\n",
"Pandas v1.1.0\n",
"mplfinance v0.12.6a3\n",
"Pandas TA v0.2.08b\n"
"Pandas TA v0.2.12b\n"
]
}
],
@@ -91,7 +91,7 @@
" # All Data: 0, Last Four Years: 0.25, Last Two Years: 0.5, This Year: 1, Last Half Year: 2, Last Quarter: 4\n",
" yearly_divisor = {\"all\": 0, \"10y\": 0.1, \"5y\": 0.2, \"4y\": 0.25, \"3y\": 1./3, \"2y\": 0.5, \"1y\": 1, \"6mo\": 2, \"3mo\": 4}\n",
" yd = yearly_divisor[tf] if tf in yearly_divisor.keys() else 0\n",
" return int(ta.TRADING_DAYS_PER_YEAR / yd) if yd > 0 else df.shape[0]"
" return int(ta.RATE[\"TRADING_DAYS_PER_YEAR\"] / yd) if yd > 0 else df.shape[0]"
]
},
{
@@ -112,13 +112,13 @@
"text": [
"[!] Loading All: SPY, QQQ, AAPL, TSLA\n",
"[i] Loaded['D']: SPY_D.csv\n",
"[i] Runtime: 812.7898 ms (0.8128 s)\n",
"[i] Runtime: 1812.7836 ms (1.8128 s)\n",
"[i] Loaded['D']: QQQ_D.csv\n",
"[i] Runtime: 818.7984 ms (0.8188 s)\n",
"[i] Runtime: 1747.0058 ms (1.7470 s)\n",
"[i] Loaded['D']: AAPL_D.csv\n",
"[i] Runtime: 1227.1223 ms (1.2271 s)\n",
"[i] Runtime: 1105.7967 ms (1.1058 s)\n",
"[i] Loaded['D']: TSLA_D.csv\n",
"[i] Runtime: 1858.9133 ms (1.8589 s)\n"
"[i] Runtime: 906.7782 ms (0.9068 s)\n"
]
}
],
@@ -353,7 +353,7 @@
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11196a5b0>"
"<matplotlib.axes._subplots.AxesSubplot at 0x11a0cc880>"
]
},
"execution_count": 9,
@@ -396,7 +396,7 @@
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11d8d3fd0>"
"<matplotlib.axes._subplots.AxesSubplot at 0x11a779940>"
]
},
"execution_count": 10,
@@ -441,7 +441,7 @@
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x11d9e70d0>"
"<matplotlib.axes._subplots.AxesSubplot at 0x10e090670>"
]
},
"execution_count": 11,
+191 -44
View File
@@ -85,7 +85,7 @@
"text": [
"name = All\n",
"description = All the indicators with their default settings. Pandas TA default.\n",
"created = 09/13/2020, 15:34:25\n",
"created = 09/25/2020, 07:53:11\n",
"ta = None\n"
]
}
@@ -116,7 +116,7 @@
"text": [
"name = Common Price and Volume SMAs\n",
"description = Common Price SMAs: 10, 20, 50, 200 and Volume SMA: 20.\n",
"created = 09/13/2020, 15:34:25\n",
"created = 09/25/2020, 07:53:11\n",
"ta = [{'kind': 'sma', 'length': 10}, {'kind': 'sma', 'length': 20}, {'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}, {'kind': 'sma', 'close': 'volume', 'length': 20, 'prefix': 'VOL'}]\n"
]
}
@@ -158,7 +158,7 @@
{
"data": {
"text/plain": [
"Strategy(name='A', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='A', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 4,
@@ -186,7 +186,7 @@
{
"data": {
"text/plain": [
"Strategy(name='B', ta=[{'kind': 'ema', 'length': 8}, {'kind': 'ema', 'length': 21}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'rsi'}, {'kind': 'supertrend'}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='B', ta=[{'kind': 'ema', 'length': 8}, {'kind': 'ema', 'length': 21}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'rsi'}, {'kind': 'supertrend'}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 5,
@@ -214,7 +214,7 @@
{
"data": {
"text/plain": [
"Strategy(name='Runtime Failure', ta=[{'kind': 'percet_return'}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='Runtime Failure', ta=[{'kind': 'percet_return'}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 6,
@@ -348,20 +348,23 @@
"class Watchlist(builtins.object)\n",
" | Watchlist(tickers: list, tf: str = None, name: str = None, strategy: pandas_ta.core.Strategy = None, ds: object = None, **kwargs)\n",
" | \n",
" | Watchlist Class (** This is subject to change! **)\n",
" | ============================================================================\n",
" | # Watchlist Class (** This is subject to change! **)\n",
" | A simple Class to load/download financial market data and automatically\n",
" | apply Technical Analysis indicators with a Pandas TA Strategy. Default\n",
" | Strategy: pandas_ta.AllStrategy.\n",
" | apply Technical Analysis indicators with a Pandas TA Strategy.\n",
" | \n",
" | Requirements:\n",
" | Default Strategy: pandas_ta.AllStrategy.\n",
" | \n",
" | ## Package Support:\n",
" | ### Data Source (Default: AlphaVantage)\n",
" | - AlphaVantage (pip install alphaVantage-api).\n",
" | - Python Binance (pip install python-binance). # Future Support\n",
" | - Yahoo Finance (pip install yfinance). # Almost Supported\n",
" | \n",
" | # Technical Analysis:\n",
" | - Pandas TA (pip install pandas_ta)\n",
" | - AlphaVantage (pip install alphaVantage-api) for the Default Data Source.\n",
" | To use another Data Source, update the load() method after AV.\n",
" | \n",
" | Required Arguments:\n",
" | ## Required Arguments:\n",
" | - tickers: A list of strings containing tickers. Example: ['SPY', 'AAPL']\n",
" | ============================================================================\n",
" | \n",
" | Methods defined here:\n",
" | \n",
@@ -435,12 +438,42 @@
"text": [
"[!] Loading All: SPY, IWM\n",
"[i] Loaded['D']: SPY_D.csv\n",
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n",
"[+] Strategy: Common Price and Volume SMAs\n",
"[i] Indicator arguments: {'timed': False, 'append': True}\n",
"[i] Multiprocessing: 4 of 4 cores.\n",
"[i] Total indicators: 5\n",
"[i] Columns added: 5\n",
"[i] Loaded['D']: IWM_D.csv\n",
" open high low close volume\n",
"date \n",
"2000-05-26 91.06 91.44 90.630 91.44 37400.0\n",
"2000-05-30 92.75 94.81 92.750 94.81 28800.0\n",
"2000-05-31 95.13 96.38 95.130 95.75 18000.0\n",
"2000-06-01 97.11 97.31 97.110 97.31 3500.0\n",
"2000-06-02 101.70 102.40 101.700 102.40 14700.0\n",
"... ... ... ... ... ...\n",
"2020-08-31 157.19 157.37 155.300 155.43 17051511.0\n",
"2020-09-01 155.22 157.31 154.450 157.21 15654144.0\n",
"2020-09-02 157.96 158.98 156.175 158.46 16763449.0\n",
"2020-09-03 158.12 158.29 152.960 153.78 32117585.0\n",
"2020-09-04 155.71 155.89 149.290 152.80 30618783.0\n",
"\n",
"[5102 rows x 5 columns]\n",
"[+] Strategy: Common Price and Volume SMAs\n",
"[i] Indicator arguments: {'timed': False, 'append': True}\n",
"[i] Multiprocessing: 4 of 4 cores.\n",
@@ -810,7 +843,7 @@
{
"data": {
"text/plain": [
"Strategy(name='A', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='A', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 14,
@@ -834,7 +867,22 @@
"name": "stdout",
"output_type": "stream",
"text": [
"[i] Loaded['D']: IWM_D.csv\n"
"[i] Loaded['D']: IWM_D.csv\n",
" open high low close volume\n",
"date \n",
"2000-05-26 91.06 91.44 90.630 91.44 37400.0\n",
"2000-05-30 92.75 94.81 92.750 94.81 28800.0\n",
"2000-05-31 95.13 96.38 95.130 95.75 18000.0\n",
"2000-06-01 97.11 97.31 97.110 97.31 3500.0\n",
"2000-06-02 101.70 102.40 101.700 102.40 14700.0\n",
"... ... ... ... ... ...\n",
"2020-08-31 157.19 157.37 155.300 155.43 17051511.0\n",
"2020-09-01 155.22 157.31 154.450 157.21 15654144.0\n",
"2020-09-02 157.96 158.98 156.175 158.46 16763449.0\n",
"2020-09-03 158.12 158.29 152.960 153.78 32117585.0\n",
"2020-09-04 155.71 155.89 149.290 152.80 30618783.0\n",
"\n",
"[5102 rows x 5 columns]\n"
]
},
{
@@ -1035,7 +1083,7 @@
{
"data": {
"text/plain": [
"Strategy(name='B', ta=[{'kind': 'ema', 'length': 8}, {'kind': 'ema', 'length': 21}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'rsi'}, {'kind': 'supertrend'}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='B', ta=[{'kind': 'ema', 'length': 8}, {'kind': 'ema', 'length': 21}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'rsi'}, {'kind': 'supertrend'}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 16,
@@ -1058,7 +1106,22 @@
"name": "stdout",
"output_type": "stream",
"text": [
"[i] Loaded['D']: SPY_D.csv\n"
"[i] Loaded['D']: SPY_D.csv\n",
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n"
]
},
{
@@ -1365,7 +1428,7 @@
{
"data": {
"text/plain": [
"Strategy(name='Runtime Failure', ta=[{'kind': 'percet_return'}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='Runtime Failure', ta=[{'kind': 'percet_return'}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 18,
@@ -1389,6 +1452,21 @@
"output_type": "stream",
"text": [
"[i] Loaded['D']: IWM_D.csv\n",
" open high low close volume\n",
"date \n",
"2000-05-26 91.06 91.44 90.630 91.44 37400.0\n",
"2000-05-30 92.75 94.81 92.750 94.81 28800.0\n",
"2000-05-31 95.13 96.38 95.130 95.75 18000.0\n",
"2000-06-01 97.11 97.31 97.110 97.31 3500.0\n",
"2000-06-02 101.70 102.40 101.700 102.40 14700.0\n",
"... ... ... ... ... ...\n",
"2020-08-31 157.19 157.37 155.300 155.43 17051511.0\n",
"2020-09-01 155.22 157.31 154.450 157.21 15654144.0\n",
"2020-09-02 157.96 158.98 156.175 158.46 16763449.0\n",
"2020-09-03 158.12 158.29 152.960 153.78 32117585.0\n",
"2020-09-04 155.71 155.89 149.290 152.80 30618783.0\n",
"\n",
"[5102 rows x 5 columns]\n",
"[X] Oops! 'AnalysisIndicators' object has no attribute 'percet_return'\n"
]
}
@@ -1431,7 +1509,7 @@
{
"data": {
"text/plain": [
"Strategy(name='Volume MAs and Price MA chain', ta=[{'kind': 'ema', 'close': 'volume', 'length': 10, 'prefix': 'VOLUME'}, {'kind': 'sma', 'close': 'volume', 'length': 20, 'prefix': 'VOLUME'}, {'kind': 'ema', 'length': 5}, {'kind': 'linreg', 'close': 'EMA_5', 'length': 8, 'prefix': 'EMA_5'}], description=None, created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='Volume MAs and Price MA chain', ta=[{'kind': 'ema', 'close': 'volume', 'length': 10, 'prefix': 'VOLUME'}, {'kind': 'sma', 'close': 'volume', 'length': 20, 'prefix': 'VOLUME'}, {'kind': 'ema', 'length': 5}, {'kind': 'linreg', 'close': 'EMA_5', 'length': 8, 'prefix': 'EMA_5'}], description=None, created='09/25/2020, 07:53:11')"
]
},
"execution_count": 20,
@@ -1483,7 +1561,22 @@
"name": "stdout",
"output_type": "stream",
"text": [
"[i] Loaded['D']: SPY_D.csv\n"
"[i] Loaded['D']: SPY_D.csv\n",
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n"
]
},
{
@@ -1732,7 +1825,7 @@
{
"data": {
"text/plain": [
"Strategy(name='MACD BBands', ta=[{'kind': 'macd'}, {'kind': 'bbands', 'close': 'MACD_12_26_9', 'length': 20, 'prefix': 'MACD'}], description='BBANDS_20 applied to MACD', created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='MACD BBands', ta=[{'kind': 'macd'}, {'kind': 'bbands', 'close': 'MACD_12_26_9', 'length': 20, 'prefix': 'MACD'}], description='BBANDS_20 applied to MACD', created='09/25/2020, 07:53:11')"
]
},
"execution_count": 23,
@@ -1782,7 +1875,22 @@
"name": "stdout",
"output_type": "stream",
"text": [
"[i] Loaded['D']: SPY_D.csv\n"
"[i] Loaded['D']: SPY_D.csv\n",
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n"
]
},
{
@@ -2078,7 +2186,7 @@
{
"data": {
"text/plain": [
"Strategy(name='Momo, Bands and SMAs and Cumulative Log Returns', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}, {'kind': 'bbands', 'length': 20}, {'kind': 'macd'}, {'kind': 'rsi'}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'sma', 'close': 'CUMLOGRET_1', 'length': 5, 'suffix': 'CUMLOGRET'}], description='MACD and RSI Momo with BBANDS and SMAs 50 & 200 and Cumulative Log Returns', created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='Momo, Bands and SMAs and Cumulative Log Returns', ta=[{'kind': 'sma', 'length': 50}, {'kind': 'sma', 'length': 200}, {'kind': 'bbands', 'length': 20}, {'kind': 'macd'}, {'kind': 'rsi'}, {'kind': 'log_return', 'cumulative': True}, {'kind': 'sma', 'close': 'CUMLOGRET_1', 'length': 5, 'suffix': 'CUMLOGRET'}], description='MACD and RSI Momo with BBANDS and SMAs 50 & 200 and Cumulative Log Returns', created='09/25/2020, 07:53:11')"
]
},
"execution_count": 26,
@@ -2136,7 +2244,22 @@
"output_type": "stream",
"text": [
"[i] Loaded['D']: SPY_D.csv\n",
"[i] Runtime: 782.4791 ms (0.7825 s)\n"
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n",
"[i] Runtime: 927.2966 ms (0.9273 s)\n"
]
},
{
@@ -2396,7 +2519,7 @@
{
"data": {
"text/plain": [
"Strategy(name='EMA, MACD History, Log Returns', ta=[{'kind': 'ema', 'params': (10,)}, {'kind': 'macd', 'params': (9, 19, 10), 'col_numbers': (1,)}, {'kind': 'log_return', 'params': (5, False)}], description='EMA, MACD History, and Log Returns Strategy', created='09/13/2020, 15:34:25', last_run=None, run_time=None)"
"Strategy(name='EMA, MACD History, Outter BBands, Log Returns', ta=[{'kind': 'ema', 'params': (10,)}, {'kind': 'macd', 'params': (9, 19, 10), 'col_numbers': (1,)}, {'kind': 'bbands', 'col_numbers': (0, 2), 'col_names': ('LB', 'UB')}, {'kind': 'log_return', 'params': (5, False)}], description='EMA, MACD History, BBands(LB, UB), and Log Returns Strategy', created='09/25/2020, 07:53:11')"
]
},
"execution_count": 29,
@@ -2410,12 +2533,14 @@
" # params sets MACD's keyword arguments: fast=9, slow=19, signal=10\n",
" # and returning the 2nd column: histogram\n",
" {\"kind\":\"macd\", \"params\": (9, 19, 10), \"col_numbers\": (1,)},\n",
" # Selects the Lower and Upper Bands and renames them LB and UB, ignoring the MB\n",
" {\"kind\":\"bbands\", \"col_numbers\": (0,2), \"col_names\": (\"LB\", \"UB\")},\n",
" {\"kind\":\"log_return\", \"params\": (5, False)},\n",
"]\n",
"params_ta_strategy = ta.Strategy(\n",
" \"EMA, MACD History, Log Returns\", # name\n",
" \"EMA, MACD History, Outter BBands, Log Returns\", # name\n",
" params_ta, # ta\n",
" \"EMA, MACD History, and Log Returns Strategy\" # description\n",
" \"EMA, MACD History, BBands(LB, UB), and Log Returns Strategy\" # description\n",
")\n",
"params_ta_strategy"
]
@@ -2428,7 +2553,7 @@
{
"data": {
"text/plain": [
"'EMA, MACD History, Log Returns'"
"'EMA, MACD History, Outter BBands, Log Returns'"
]
},
"execution_count": 30,
@@ -2452,7 +2577,22 @@
"output_type": "stream",
"text": [
"[i] Loaded['D']: SPY_D.csv\n",
"[i] Runtime: 685.6862 ms (0.6857 s)\n"
" open high low close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 7431500.0\n",
"... ... ... ... ... ...\n",
"2020-08-24 342.1200 343.0000 339.4504 342.9200 48588662.0\n",
"2020-08-25 343.5300 344.2100 342.2700 344.1200 38463381.0\n",
"2020-08-26 344.7600 347.8600 344.1700 347.5700 50790237.0\n",
"2020-08-27 348.5100 349.9000 346.5300 348.3300 58034142.0\n",
"2020-08-28 349.4400 350.7200 348.1500 350.5800 48588940.0\n",
"\n",
"[5241 rows x 5 columns]\n",
"[i] Runtime: 180.5198 ms (0.1805 s)\n"
]
},
{
@@ -2483,6 +2623,8 @@
" <th>volume</th>\n",
" <th>EMA_10</th>\n",
" <th>MACDh_9_19_10</th>\n",
" <th>LB</th>\n",
" <th>UB</th>\n",
" <th>LOGRET_5</th>\n",
" </tr>\n",
" <tr>\n",
@@ -2495,6 +2637,8 @@
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
@@ -2507,6 +2651,8 @@
" <td>48588662.0</td>\n",
" <td>337.797677</td>\n",
" <td>-0.000276</td>\n",
" <td>334.962909</td>\n",
" <td>343.657091</td>\n",
" <td>0.014718</td>\n",
" </tr>\n",
" <tr>\n",
@@ -2518,6 +2664,8 @@
" <td>38463381.0</td>\n",
" <td>338.947190</td>\n",
" <td>0.165373</td>\n",
" <td>334.441244</td>\n",
" <td>346.370756</td>\n",
" <td>0.016053</td>\n",
" </tr>\n",
" <tr>\n",
@@ -2529,6 +2677,8 @@
" <td>50790237.0</td>\n",
" <td>340.514974</td>\n",
" <td>0.469555</td>\n",
" <td>335.028792</td>\n",
" <td>349.919208</td>\n",
" <td>0.030201</td>\n",
" </tr>\n",
" <tr>\n",
@@ -2540,6 +2690,8 @@
" <td>58034142.0</td>\n",
" <td>341.935888</td>\n",
" <td>0.613083</td>\n",
" <td>337.277495</td>\n",
" <td>351.690505</td>\n",
" <td>0.029276</td>\n",
" </tr>\n",
" <tr>\n",
@@ -2551,6 +2703,8 @@
" <td>48588940.0</td>\n",
" <td>343.507545</td>\n",
" <td>0.771996</td>\n",
" <td>340.426029</td>\n",
" <td>352.981971</td>\n",
" <td>0.032174</td>\n",
" </tr>\n",
" </tbody>\n",
@@ -2566,13 +2720,13 @@
"2020-08-27 348.51 349.90 346.5300 348.33 58034142.0 341.935888 \n",
"2020-08-28 349.44 350.72 348.1500 350.58 48588940.0 343.507545 \n",
"\n",
" MACDh_9_19_10 LOGRET_5 \n",
"date \n",
"2020-08-24 -0.000276 0.014718 \n",
"2020-08-25 0.165373 0.016053 \n",
"2020-08-26 0.469555 0.030201 \n",
"2020-08-27 0.613083 0.029276 \n",
"2020-08-28 0.771996 0.032174 "
" MACDh_9_19_10 LB UB LOGRET_5 \n",
"date \n",
"2020-08-24 -0.000276 334.962909 343.657091 0.014718 \n",
"2020-08-25 0.165373 334.441244 346.370756 0.016053 \n",
"2020-08-26 0.469555 335.028792 349.919208 0.030201 \n",
"2020-08-27 0.613083 337.277495 351.690505 0.029276 \n",
"2020-08-28 0.771996 340.426029 352.981971 0.032174 "
]
},
"execution_count": 31,
@@ -2584,13 +2738,6 @@
"spy = watch.load(\"SPY\", timed=True)\n",
"spy.tail()"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
+143 -167
View File
@@ -56,10 +56,10 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Pandas TA - Technical Analysis Indicators - v0.2.08b\n",
"Total Indicators: 121\n",
"Pandas TA - Technical Analysis Indicators - v0.2.12b\n",
"Total Indicators: 122\n",
"Abbreviations:\n",
" aberration, above, above_value, accbands, ad, adosc, adx, amat, ao, aobv, apo, aroon, atr, bbands, below, below_value, bias, bop, brar, cci, cdl_doji, cdl_inside, cg, chop, cksp, cmf, cmo, coppock, cross, cross_value, decay, decreasing, dema, donchian, dpo, efi, ema, entropy, eom, er, eri, fisher, fwma, ha, hilo, hl2, hlc3, hma, ichimoku, increasing, inertia, kama, kc, kdj, kst, kurtosis, linreg, log_return, long_run, macd, mad, massi, median, mfi, midpoint, midprice, mom, natr, nvi, obv, ohlc4, pdist, percent_return, pgo, ppo, psar, psl, pvi, pvo, pvol, pvt, pwma, qstick, quantile, rma, roc, rsi, rvgi, rvi, short_run, sinwma, skew, slope, sma, smi, squeeze, stdev, stoch, stochrsi, supertrend, swma, t3, tema, trend_return, trima, trix, true_range, tsi, ttm_trend, ui, uo, variance, vortex, vp, vwap, vwma, wcp, willr, wma, zlma, zscore\n"
" aberration, above, above_value, accbands, ad, adosc, adx, amat, ao, aobv, apo, aroon, atr, bbands, below, below_value, bias, bop, brar, cci, cdl_doji, cdl_inside, cfo, cg, chop, cksp, cmf, cmo, coppock, cross, cross_value, decay, decreasing, dema, donchian, dpo, efi, ema, entropy, eom, er, eri, fisher, fwma, ha, hilo, hl2, hlc3, hma, ichimoku, increasing, inertia, kama, kc, kdj, kst, kurtosis, linreg, log_return, long_run, macd, mad, massi, median, mfi, midpoint, midprice, mom, natr, nvi, obv, ohlc4, pdist, percent_return, pgo, ppo, psar, psl, pvi, pvo, pvol, pvt, pwma, qstick, quantile, rma, roc, rsi, rvgi, rvi, short_run, sinwma, skew, slope, sma, smi, squeeze, stdev, stoch, stochrsi, supertrend, swma, t3, tema, trend_return, trima, trix, true_range, tsi, ttm_trend, ui, uo, variance, vortex, vp, vwap, vwma, wcp, willr, wma, zlma, zscore\n"
]
}
],
@@ -177,9 +177,15 @@
"price_size = (16, 8)\n",
"ind_size = (16, 3.25)\n",
"ticker = \"SPY\"\n",
"# All Data: 0, Last Four Years: 0.25, Last Two Years: 0.5, This Year: 1, Last Half Year: 2, Last Quarter: 3\n",
"yearly_divisor = 1\n",
"recent = int(ta.TRADING_DAYS_PER_YEAR / yearly_divisor) if yearly_divisor > 0 else df.shape[0]"
"# # All Data: 0, Last Four Years: 0.25, Last Two Years: 0.5, This Year: 1, Last Half Year: 2, Last Quarter: 3\n",
"# yearly_divisor = 1\n",
"# recent = int(ta.RATE[\"TRADING_DAYS_PER_YEAR\"] / yearly_divisor) if yearly_divisor > 0 else df.shape[0]\n",
"# print(recent)\n",
"def recent_bars(df, tf: str = \"1y\"):\n",
" # All Data: 0, Last Four Years: 0.25, Last Two Years: 0.5, This Year: 1, Last Half Year: 2, Last Quarter: 4\n",
" yearly_divisor = {\"all\": 0, \"10y\": 0.1, \"5y\": 0.2, \"4y\": 0.25, \"3y\": 1./3, \"2y\": 0.5, \"1y\": 1, \"6mo\": 2, \"3mo\": 4}\n",
" yd = yearly_divisor[tf] if tf in yearly_divisor.keys() else 0\n",
" return int(ta.RATE[\"TRADING_DAYS_PER_YEAR\"] / yd) if yd > 0 else df.shape[0]"
]
},
{
@@ -198,26 +204,26 @@
"name": "stdout",
"output_type": "stream",
"text": [
"SPY(5250, 7) from 1999-11-01 00:00:00 to 2020-09-11 00:00:00\n",
"SPY(5259, 6) from 1999-11-01 00:00:00 to 2020-09-24 00:00:00\n",
" open high low close adj_close \\\n",
"count 5250.000000 5250.000000 5250.000000 5250.000000 5250.000000 \n",
"mean 162.536632 163.498417 161.465172 162.533567 138.609095 \n",
"std 63.510375 63.701597 63.293436 63.521877 71.070742 \n",
"min 67.950000 70.000000 67.100000 68.110000 53.914200 \n",
"25% 116.500000 117.400000 115.580000 116.542500 87.510800 \n",
"50% 138.352500 139.320000 137.225000 138.183750 106.456300 \n",
"75% 204.762500 206.070000 203.917500 204.970000 185.195375 \n",
"max 355.870000 358.750000 353.430000 357.700000 357.700000 \n",
"count 5259.000000 5259.000000 5259.000000 5259.000000 5259.000000 \n",
"mean 162.824636 163.786606 161.760947 162.822990 138.379707 \n",
"std 63.849124 64.042411 63.611713 63.853704 71.174504 \n",
"min 67.950000 70.000000 67.100000 68.110000 53.696800 \n",
"25% 116.500000 117.410000 115.595000 116.555000 87.157500 \n",
"50% 138.437500 139.406200 137.328100 138.250000 106.138700 \n",
"75% 204.975000 206.255000 204.130000 205.210000 184.669600 \n",
"max 355.870000 358.750000 353.430000 357.700000 356.257100 \n",
"\n",
" volume \n",
"count 5.250000e+03 \n",
"mean 1.112000e+08 \n",
"std 9.800456e+07 \n",
"min 6.790000e+04 \n",
"25% 4.760167e+07 \n",
"50% 8.220760e+07 \n",
"75% 1.490664e+08 \n",
"max 8.708580e+08 \n"
"count 5.259000e+03 \n",
"mean 1.112084e+08 \n",
"std 9.791131e+07 \n",
"min 1.708170e+05 \n",
"25% 4.766386e+07 \n",
"50% 8.224770e+07 \n",
"75% 1.486532e+08 \n",
"max 8.710263e+08 \n"
]
},
{
@@ -241,7 +247,6 @@
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>open</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
@@ -257,58 +262,52 @@
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1999-11-01</th>\n",
" <td>1999-11-01</td>\n",
" <td>136.5000</td>\n",
" <td>137.0000</td>\n",
" <td>135.5625</td>\n",
" <td>135.5625</td>\n",
" <td>91.9725</td>\n",
" <td>91.5996</td>\n",
" <td>4006500.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-11-02</th>\n",
" <td>1999-11-02</td>\n",
" <td>135.9687</td>\n",
" <td>137.2500</td>\n",
" <td>134.5937</td>\n",
" <td>134.5937</td>\n",
" <td>91.3152</td>\n",
" <td>90.9450</td>\n",
" <td>6516900.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-11-03</th>\n",
" <td>1999-11-03</td>\n",
" <td>136.0000</td>\n",
" <td>136.3750</td>\n",
" <td>135.1250</td>\n",
" <td>135.5000</td>\n",
" <td>91.9301</td>\n",
" <td>91.5574</td>\n",
" <td>7222300.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-11-04</th>\n",
" <td>1999-11-04</td>\n",
" <td>136.7500</td>\n",
" <td>137.3593</td>\n",
" <td>135.7656</td>\n",
" <td>136.5312</td>\n",
" <td>92.6297</td>\n",
" <td>92.2542</td>\n",
" <td>7907500.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1999-11-05</th>\n",
" <td>1999-11-05</td>\n",
" <td>138.6250</td>\n",
" <td>139.1093</td>\n",
" <td>136.7812</td>\n",
" <td>137.8750</td>\n",
" <td>93.5414</td>\n",
" <td>93.1622</td>\n",
" <td>7431500.0</td>\n",
" </tr>\n",
" </tbody>\n",
@@ -316,21 +315,13 @@
"</div>"
],
"text/plain": [
" date open high low close adj_close \\\n",
"date \n",
"1999-11-01 1999-11-01 136.5000 137.0000 135.5625 135.5625 91.9725 \n",
"1999-11-02 1999-11-02 135.9687 137.2500 134.5937 134.5937 91.3152 \n",
"1999-11-03 1999-11-03 136.0000 136.3750 135.1250 135.5000 91.9301 \n",
"1999-11-04 1999-11-04 136.7500 137.3593 135.7656 136.5312 92.6297 \n",
"1999-11-05 1999-11-05 138.6250 139.1093 136.7812 137.8750 93.5414 \n",
"\n",
" volume \n",
"date \n",
"1999-11-01 4006500.0 \n",
"1999-11-02 6516900.0 \n",
"1999-11-03 7222300.0 \n",
"1999-11-04 7907500.0 \n",
"1999-11-05 7431500.0 "
" open high low close adj_close volume\n",
"date \n",
"1999-11-01 136.5000 137.0000 135.5625 135.5625 91.5996 4006500.0\n",
"1999-11-02 135.9687 137.2500 134.5937 134.5937 90.9450 6516900.0\n",
"1999-11-03 136.0000 136.3750 135.1250 135.5000 91.5574 7222300.0\n",
"1999-11-04 136.7500 137.3593 135.7656 136.5312 92.2542 7907500.0\n",
"1999-11-05 138.6250 139.1093 136.7812 137.8750 93.1622 7431500.0"
]
},
"execution_count": 6,
@@ -354,26 +345,26 @@
"name": "stdout",
"output_type": "stream",
"text": [
"SPY(252, 7) from 2019-09-13 00:00:00 to 2020-09-11 00:00:00\n",
"SPY(252, 6) from 2019-09-26 00:00:00 to 2020-09-24 00:00:00\n",
" open high low close adj_close \\\n",
"count 5250.000000 5250.000000 5250.000000 5250.000000 5250.000000 \n",
"mean 162.536632 163.498417 161.465172 162.533567 138.609095 \n",
"std 63.510375 63.701597 63.293436 63.521877 71.070742 \n",
"min 67.950000 70.000000 67.100000 68.110000 53.914200 \n",
"25% 116.500000 117.400000 115.580000 116.542500 87.510800 \n",
"50% 138.352500 139.320000 137.225000 138.183750 106.456300 \n",
"75% 204.762500 206.070000 203.917500 204.970000 185.195375 \n",
"max 355.870000 358.750000 353.430000 357.700000 357.700000 \n",
"count 5259.000000 5259.000000 5259.000000 5259.000000 5259.000000 \n",
"mean 162.824636 163.786606 161.760947 162.822990 138.379707 \n",
"std 63.849124 64.042411 63.611713 63.853704 71.174504 \n",
"min 67.950000 70.000000 67.100000 68.110000 53.696800 \n",
"25% 116.500000 117.410000 115.595000 116.555000 87.157500 \n",
"50% 138.437500 139.406200 137.328100 138.250000 106.138700 \n",
"75% 204.975000 206.255000 204.130000 205.210000 184.669600 \n",
"max 355.870000 358.750000 353.430000 357.700000 356.257100 \n",
"\n",
" volume \n",
"count 5.250000e+03 \n",
"mean 1.112000e+08 \n",
"std 9.800456e+07 \n",
"min 6.790000e+04 \n",
"25% 4.760167e+07 \n",
"50% 8.220760e+07 \n",
"75% 1.490664e+08 \n",
"max 8.708580e+08 \n"
"count 5.259000e+03 \n",
"mean 1.112084e+08 \n",
"std 9.791131e+07 \n",
"min 1.708170e+05 \n",
"25% 4.766386e+07 \n",
"50% 8.224770e+07 \n",
"75% 1.486532e+08 \n",
"max 8.710263e+08 \n"
]
},
{
@@ -397,7 +388,6 @@
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>date</th>\n",
" <th>open</th>\n",
" <th>high</th>\n",
" <th>low</th>\n",
@@ -413,80 +403,66 @@
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" <th></th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>2019-09-13</th>\n",
" <td>2019-09-13</td>\n",
" <td>301.78</td>\n",
" <td>302.1700</td>\n",
" <td>300.6800</td>\n",
" <td>301.09</td>\n",
" <td>295.1126</td>\n",
" <td>62053458.0</td>\n",
" <th>2019-09-26</th>\n",
" <td>297.63</td>\n",
" <td>297.86</td>\n",
" <td>295.45</td>\n",
" <td>297.00</td>\n",
" <td>291.2744</td>\n",
" <td>58594707.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019-09-16</th>\n",
" <td>2019-09-16</td>\n",
" <td>299.84</td>\n",
" <td>301.1378</td>\n",
" <td>299.4500</td>\n",
" <td>300.16</td>\n",
" <td>294.2011</td>\n",
" <td>57934320.0</td>\n",
" <th>2019-09-27</th>\n",
" <td>297.83</td>\n",
" <td>297.95</td>\n",
" <td>293.69</td>\n",
" <td>295.40</td>\n",
" <td>289.7052</td>\n",
" <td>84755721.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019-09-17</th>\n",
" <td>2019-09-17</td>\n",
" <td>299.94</td>\n",
" <td>301.0200</td>\n",
" <td>299.7500</td>\n",
" <td>300.92</td>\n",
" <td>294.9460</td>\n",
" <td>42770135.0</td>\n",
" <th>2019-09-30</th>\n",
" <td>295.97</td>\n",
" <td>297.55</td>\n",
" <td>295.92</td>\n",
" <td>296.77</td>\n",
" <td>291.0488</td>\n",
" <td>52438861.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019-09-18</th>\n",
" <td>2019-09-18</td>\n",
" <td>300.49</td>\n",
" <td>301.2200</td>\n",
" <td>298.2400</td>\n",
" <td>301.10</td>\n",
" <td>295.1224</td>\n",
" <td>73875018.0</td>\n",
" <th>2019-10-01</th>\n",
" <td>297.74</td>\n",
" <td>298.46</td>\n",
" <td>293.00</td>\n",
" <td>293.24</td>\n",
" <td>287.5869</td>\n",
" <td>89425082.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2019-09-19</th>\n",
" <td>2019-09-19</td>\n",
" <td>301.53</td>\n",
" <td>302.6300</td>\n",
" <td>300.7103</td>\n",
" <td>301.08</td>\n",
" <td>295.1028</td>\n",
" <td>77933334.0</td>\n",
" <th>2019-10-02</th>\n",
" <td>291.50</td>\n",
" <td>291.51</td>\n",
" <td>286.64</td>\n",
" <td>288.06</td>\n",
" <td>282.5067</td>\n",
" <td>124208927.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" date open high low close adj_close \\\n",
"date \n",
"2019-09-13 2019-09-13 301.78 302.1700 300.6800 301.09 295.1126 \n",
"2019-09-16 2019-09-16 299.84 301.1378 299.4500 300.16 294.2011 \n",
"2019-09-17 2019-09-17 299.94 301.0200 299.7500 300.92 294.9460 \n",
"2019-09-18 2019-09-18 300.49 301.2200 298.2400 301.10 295.1224 \n",
"2019-09-19 2019-09-19 301.53 302.6300 300.7103 301.08 295.1028 \n",
"\n",
" volume \n",
"date \n",
"2019-09-13 62053458.0 \n",
"2019-09-16 57934320.0 \n",
"2019-09-17 42770135.0 \n",
"2019-09-18 73875018.0 \n",
"2019-09-19 77933334.0 "
" open high low close adj_close volume\n",
"date \n",
"2019-09-26 297.63 297.86 295.45 297.00 291.2744 58594707.0\n",
"2019-09-27 297.83 297.95 293.69 295.40 289.7052 84755721.0\n",
"2019-09-30 295.97 297.55 295.92 296.77 291.0488 52438861.0\n",
"2019-10-01 297.74 298.46 293.00 293.24 287.5869 89425082.0\n",
"2019-10-02 291.50 291.51 286.64 288.06 282.5067 124208927.0"
]
},
"execution_count": 7,
@@ -496,10 +472,10 @@
],
"source": [
"# Recent Data\n",
"recent_startdate = df.tail(recent).index[0]\n",
"recent_enddate = df.tail(recent).index[-1]\n",
"print(f\"{df.name}{df.tail(recent).shape} from {recent_startdate} to {recent_enddate}\\n{df.describe()}\")\n",
"df.tail(recent).head()"
"recent_startdate = df.tail(recent_bars(df)).index[0]\n",
"recent_enddate = df.tail(recent_bars(df)).index[-1]\n",
"print(f\"{df.name}{df.tail(recent_bars(df)).shape} from {recent_startdate} to {recent_enddate}\\n{df.describe()}\")\n",
"df.tail(recent_bars(df)).head()"
]
},
{
@@ -536,7 +512,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"Columns: date, open, high, low, close, adj_close, volume, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, -100, -90, -80, -70, -50, -30, -20, -10, 10, 20, 30, 50, 70, 80, 90, 100\n"
"Columns: open, high, low, close, adj_close, volume, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, -100, -90, -80, -70, -50, -30, -20, -10, 10, 20, 30, 50, 70, 80, 90, 100\n"
]
}
],
@@ -609,7 +585,7 @@
" def _validate_chart_kwargs(self, **kwargs):\n",
" \"\"\"Chart Settings\"\"\"\n",
" self.config = {}\n",
" self.config[\"last\"] = kwargs.pop(\"last\", recent)\n",
" self.config[\"last\"] = kwargs.pop(\"last\", recent_bars(self.df))\n",
" self.config[\"rpad\"] = kwargs.pop(\"rpad\", 10)\n",
" self.config[\"title\"] = kwargs.pop(\"title\", \"Asset\")\n",
" self.config[\"volume\"] = kwargs.pop(\"volume\", True)\n",
@@ -942,7 +918,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
"[i] Loaded SPY(5250, 34)\n",
"[i] Loaded SPY(5259, 33)\n",
"[+] Strategy: Common Price and Volume SMAs\n",
"[i] Indicator arguments: {'append': True}\n",
"[i] Multiprocessing: 4 of 4 cores.\n",
@@ -952,7 +928,7 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1200x1000 with 10 Axes>"
]
@@ -967,7 +943,7 @@
"\n",
"Pandas v: 1.1.0 [pip install pandas] https://github.com/pandas-dev/pandas\n",
"Data from AlphaVantage v: 1.0.19 [pip install alphaVantage-api] http://www.alphavantage.co https://github.com/twopirllc/AlphaVantageAPI\n",
"Technical Analysis with Pandas TA v: 0.2.08b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Technical Analysis with Pandas TA v: 0.2.12b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Charts by Matplotlib Finance v: 0.12.6a3 [pip install mplfinance] https://github.com/matplotlib/mplfinance\n",
"\n"
]
@@ -975,7 +951,7 @@
{
"data": {
"text/plain": [
"<__main__.Chart at 0x11348ee20>"
"<__main__.Chart at 0x11d92d130>"
]
},
"execution_count": 11,
@@ -991,7 +967,7 @@
"Chart(df,\n",
" # style: which mplfinance chart style to use. Added \"random\" as an option.\n",
" # rpad: how many bars to leave empty on the right of the chart\n",
" style=\"yahoo\", title=ticker, last=recent, rpad=10,\n",
" style=\"yahoo\", title=ticker, last=recent_bars(df), rpad=10,\n",
" \n",
" # Overlap Indicators\n",
" linreg=True, midpoint=False, ohlc4=False, archermas=True,\n",
@@ -1044,7 +1020,7 @@
{
"data": {
"text/plain": [
"<matplotlib.axes._subplots.AxesSubplot at 0x116d6ab20>"
"<matplotlib.axes._subplots.AxesSubplot at 0x11e1472b0>"
]
},
"execution_count": 12,
@@ -1053,7 +1029,7 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1600x325 with 1 Axes>"
]
@@ -1066,8 +1042,8 @@
"clr_ma_length = 8\n",
"clrdf = df.ta.log_return(cumulative=True, append=True)\n",
"clrmadf = ta.ema(clrdf, length=clr_ma_length)\n",
"qqdf = pd.DataFrame({f\"{clrdf.name}\": clrdf, f\"{clrmadf.name}({clrdf.name})\": clrmadf})\n",
"qqdf.tail(recent).plot(figsize=ind_size, color=colors(\"BkBl\"), linewidth=1, title=ctitle(clrdf.name, ticker=ticker, length=recent), grid=True)"
"clrxdf = pd.DataFrame({f\"{clrdf.name}\": clrdf, f\"{clrmadf.name}({clrdf.name})\": clrmadf})\n",
"clrxdf.tail(recent_bars(df)).plot(figsize=ind_size, color=colors(\"BkBl\"), linewidth=1, title=ctitle(clrdf.name, ticker=ticker, length=recent_bars(df)), grid=True)"
]
},
{
@@ -1085,7 +1061,7 @@
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x117267250>"
"<matplotlib.lines.Line2D at 0x1213067c0>"
]
},
"execution_count": 13,
@@ -1094,7 +1070,7 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1600x325 with 1 Axes>"
]
@@ -1105,8 +1081,8 @@
],
"source": [
"macddf = df.ta.macd(fast=8, slow=21, signal=9, min_periods=None, append=True)\n",
"macddf[[macddf.columns[0], macddf.columns[2]]].tail(recent).plot(figsize=(16, 2), color=colors(\"BkBl\"), linewidth=1.3)\n",
"macddf[macddf.columns[1]].tail(recent).plot.area(figsize=ind_size, stacked=False, color=[\"silver\"], linewidth=1, title=ctitle(macddf.name, ticker=ticker, length=recent), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
"macddf[[macddf.columns[0], macddf.columns[2]]].tail(recent_bars(df)).plot(figsize=(16, 2), color=colors(\"BkBl\"), linewidth=1.3)\n",
"macddf[macddf.columns[1]].tail(recent_bars(df)).plot.area(figsize=ind_size, stacked=False, color=[\"silver\"], linewidth=1, title=ctitle(macddf.name, ticker=ticker, length=recent_bars(df)), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
]
},
{
@@ -1124,7 +1100,7 @@
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x1167a4a00>"
"<matplotlib.lines.Line2D at 0x1217aafd0>"
]
},
"execution_count": 14,
@@ -1133,7 +1109,7 @@
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABREAAAFNCAYAAACXASiAAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd1xT1/8/8FcYYSOIiCiKAgqIiNoiVmUoiriw7r2rVnG1rg9ua92jasU96kfrHtXWCY66t2JVHDg+KAqICwtCMDm/P/yRr5EACSBBeT0fDx4PcnJy7/vee+5N8s6550iEEAJERERERERERERE2dDTdQBERERERERERERUtDGJSERERERERERERDliEpGIiIiIiIiIiIhyxCQiERERERERERER5YhJRCIiIiIiIiIiIsoRk4hERERERERERESUIyYRiYiIiIiIiIiIKEdMIhIREREREREREVGOmEQkIiIiIiIiIiKiHDGJSEREVAgSEhLQrl072NjYQCKRYMGCBboOiYiISC2FQoFq1aph2rRpug5FqVOnTujQoYOuwyAiKtaYRCQioiz++ecftGvXDo6OjjA2Nka5cuXQuHFj/Prrryr1KlasCIlEovwrXbo0fH19sWvXLgDAzJkzIZFIcPDgQbXradasGUqUKIEnT55oFNfH61P316tXL4238/jx4wgJCUH58uVhbGyMMmXKIDg4GKdOnVJb//Tp06hfvz5MTU1RpkwZDB06FP/++69G6/rhhx9w8OBBhIWFYf369QgODtY4zsL26NEjTJkyBbVr14a1tTVKlSqFgIAAREZGqq3/6tUr9O/fH7a2tjAzM0ODBg1w+fLlLPW2bNmCbt26oXLlypBIJAgICMg2hkuXLiE4OBiWlpawsLBAUFAQrl69qtV27NmzB7Vq1YKxsTEqVKiASZMm4d27d1nqRUREKI+rtbU12rVrh4cPH2q8nqVLl6J9+/aoUKFCjm1Q2/amTlxcHDp06AArKytYWlqiVatWuH//vtq6q1evhru7O4yNjVG5cuUs529uNG3v6enpGDNmDMqWLQsTExP4+PggIiJCq3VpGqs22/+x6dOn448//tAqrtw8f/4cc+bMgZ+fH2xtbWFlZYU6depgy5Ytautruq8OHTqEvn37olq1atDX10fFihWzjSEmJgbt2rWD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 truncated
"image/png": "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 truncated
"text/plain": [
"<Figure size 1600x325 with 1 Axes>"
]
@@ -1145,8 +1121,8 @@
"source": [
"zscoredf = df.ta.zscore(length=30, append=True)\n",
"zcolors = [\"darkgreen\", \"green\", \"silver\", \"silver\", \"red\", \"maroon\", \"black\"]\n",
"zcols = df[[\"-4\", \"-3\", \"-2\", \"2\", \"3\", \"4\", zscoredf.name]].tail(recent)\n",
"zcols.plot(figsize=ind_size, color=zcolors, linewidth=1.2, title=ctitle(zscoredf.name, ticker=ticker, length=recent), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
"zcols = df[[\"-4\", \"-3\", \"-2\", \"2\", \"3\", \"4\", zscoredf.name]].tail(recent_bars(df))\n",
"zcols.plot(figsize=ind_size, color=zcolors, linewidth=1.2, title=ctitle(zscoredf.name, ticker=ticker, length=recent_bars(df)), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
]
},
{
@@ -1157,7 +1133,7 @@
{
"data": {
"text/plain": [
"<matplotlib.lines.Line2D at 0x1175b2730>"
"<matplotlib.lines.Line2D at 0x1219de9d0>"
]
},
"execution_count": 15,
@@ -1166,7 +1142,7 @@
},
{
"data": {
"image/png": "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 truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAABQoAAAFNCAYAAABIT1KfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeXhTVfoH8O9t2nRJN1q6Q8vSshRKq7L/BEUEZB0ZVFRAxB0QHRFkEBQc3ACVUVnUzggOggIKgiIKiCMKCMjOsBZp6Ub3PWmTJuf3R72xIWmbdEvafD/P0wd6c3LOe2/uTZP3nkUSQggQERERERERERGRU3OxdwBERERERERERERkf0wUEhEREREREREREROFRERERERERERExEQhERERERERERERgYlCIiIiIiIiIiIiAhOFREREREREREREBCYKiYiIiIiIiIiICEwUEhEREREREREREZgoJCIiIiIiIiIiIjBRSERE5LCOHj2KgQMHQqVSQZIknDx50t4hERERWbR582YEBASgtLTU3qEAAM6dOwdXV1ecPXvW3qEQEbUoTBQSETm4M2fO4J577kFUVBQ8PDwQERGBYcOG4f333zcp16FDB0iSZPwJDg7GoEGDsG3bNgDAm2++CUmS8P3331tsZ9SoUfDz80NGRkadMT3zzDOQJAlJSUk1llmwYAEkScLp06eN2/Ly8jB37lx07doVHh4eCAgIwIgRI/DNN9+YPT85ORmSJOGtt96qM56ayHXU9bNu3Tqr60xMTMRtt92GkJAQuLu7o2PHjpg2bRqSk5Mtlv/3v/+N7t27w8PDAzExMWavW010Oh3uvfde5OfnY8WKFVi/fj2ioqKsjrO5HT16FE8//TR69OgBlUqFyMhI3Hfffbh06ZLF8ufPn8ddd90Fb29vBAQEYMqUKcjJyTEr99prr2HcuHEICQmBJElYvHhxjTF8/vnnuPnmm+Hh4YGgoCA8+uijyM3NtXofDAYDli1bho4dO8LDwwO9evXCZ599ZrHsypUr0b17d7i7uyMiIgKzZ89GWVmZVe3YeqwMBgPWrFmDhIQEeHp6IjAwEHfccQdOnTplVXs7duwwHpfIyEgsWrQIlZWVZuUKCwvxxBNPICgoCCqVCkOGDMHx48etakOO09rjZ+3rXxNbYrV2/2907tw5LF68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 truncated
"text/plain": [
"<Figure size 1600x325 with 1 Axes>"
]
@@ -1179,8 +1155,8 @@
"# Now Volume Z Score\n",
"zvscoredf = df.ta.zscore(close=\"volume\", length=30, prefix=\"VOL\", append=True)\n",
"zcolors = [\"darkgreen\", \"green\", \"silver\", \"silver\", \"red\", \"maroon\", \"black\"]\n",
"zvcols = df[[\"-4\", \"-3\", \"-2\", \"2\", \"3\", \"4\", zvscoredf.name]].tail(recent)\n",
"zvcols.plot(figsize=ind_size, color=zcolors, linewidth=1.2, title=ctitle(zvscoredf.name, ticker=ticker, length=recent), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
"zvcols = df[[\"-4\", \"-3\", \"-2\", \"2\", \"3\", \"4\", zvscoredf.name]].tail(recent_bars(df))\n",
"zvcols.plot(figsize=ind_size, color=zcolors, linewidth=1.2, title=ctitle(zvscoredf.name, ticker=ticker, length=recent_bars(df)), grid=True).axhline(y=0, color=\"black\", lw=1.1)"
]
},
{
@@ -1214,7 +1190,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABJgAAANeCAYAAABeQrSXAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdZ3gV1fr38e/s2QmEhAQIJQiEXqRFROxiEpEmIAoCiiBY/h6wHzuWGMuxHeUcEdFHwIIICCIoCEhJCCD9AFKkg3QCBFJIQrL3zPMisklCAmmQ9vtcF5d7r1mz5p6YkeU9qxi2bduIiIiIiIiIiIgUkKO4AxARERERERERkdJNCSYRERERERERESkUJZhERERERERERKRQlGASEREREREREZFCUYJJREREREREREQKRQkmEREREREREREpFCWYRERERERERESkUJRgEhERERERERGRQlGCSURERERERERECkUJJhERERERERERKRQlmERERMqR6dOn06NHD2rXro23tzeVK1cmODiY66+/nkceeYQvvvgiS/3Q0FAMwzjvj2maVKlShWuvvZbIyEhOnjzpOadbt25Z6n755Zc5xjJw4MAs9d57771Leu8iIiIicukYtm3bxR2EiIiIXHoPP/ww48aNu2CdgIAATp065fkeGhrK4sWLL9p2UFAQCxcupGXLlhw6dIjWrVt7kk7+/v5s2rSJevXqeerPnDmT3r17e77feOONLFmyBIdD775ERERESiMlmERERMqB3377jS5duni+t2vXji5duhAQEEBcXBwbN25k6dKlmKZ5wQTThx9+CEBCQgIzZ87kjz/+8Bxr3749a9asAWDSpEncd999nmNdunRh7ty5AMTFxdGqVSuOHDkCgK+vLxs2bKBx48aX4M5FRERE5HJwFncAIiIicumdTe4ANG7cmNWrV2OaZpY66enpLFq06ILtPPfcc57PI0aMoGXLluzZsweAtWvXsmfPHho2bMi9997LTz/9xNSpUwGYN28e48aN46GHHuLJJ5/0JJcgI2ml5JKIiIhI6aZx6CIiIuWA2+32fD516hS7d+8+r46Xl1eWUU4XU7FiRdq3b5+l7PDhw57PY8aMISgoyPP92Wef5bPPPmPixImesi5dujBs2LA8X1NERERESiYlmERERMqBq6++2vP5xIkTNG/enJCQEB566CE+/fRTNmzYkO82U1NTWbt2bZay2rVrez4HBgYyduxYz/f4+Hgee+wxz/eqVatedE0oERERESkdtAaTiIhIOeByubj55ptZuXJlrnWaN2/Oe++9l2Xx7YKuwZTZI488kiXRdNbEiROzrNMkIiIiIqWXEkwiIiLlxOnTp/nwww8ZN24cBw4cyLGOYRjMnDmTnj17AnnfRa5mzZosXLiQ1q1bn3csKSmJtm3betZqArjnnnv44YcfCngnIiIiIlLSaIqciIhIOeHr68sbb7zB/v372bZtG99++y2PPvooNWvW9NSxbZuPP/74om0ZhoG/vz/XXHMNr7/+Olu2bMkxuQTg5+fHoEGDspRp3SURERGRskW7yImIiJRDzZo1o1mzZgwaNIgPP/yQFi1acOjQIQD++uuvXM8r6MBnwzAu+F1ERERESjclmERERMqBb775htOnT3PfffdRpUqVLMcqVKiAt7e353tgYODlDk9ERERESjklmERERMqBPXv2EBkZydNPP81NN91Eu3btqFGjBomJicyePZu9e/d66nbv3r34AhURERGRUkkJJhERkXIkPT2d6OhooqOjczx+zTXX8Nxzz13eoERERESk1FOCSUREpBx4+umnCQkJITo6mtWrV3PkyBFiY2NJS0ujatWqtGrVij59+vDII49kmS4nIiIiIpIXhl3Q1TpFREREREREREQAR3EHICIiIiIiIiIipZsSTCIiIiIiIiIiUihKMImIiIiIiIiISKEowSQiIiIiIiIiIoWiBJOIiIiIiIiISAGNGzeOm266ieDgYIKDg+ncuTPz58/PUmfVqlX06tWLOnXqEBwcTPfu3UlJSfEcP3nyJI888gjBwcHUr1+fJ554gqSkpMt9K4WiXeRERERERERERApozpw5mKZJ48aNsW2bSZMmMWrUKBYvXsyVV17JqlWr6Nu3L8888wxdu3bF6XSyadMmunfvToUKFQDo27cvR48eZeTIkaSnp/P444/Trl07xo4dW8x3l3dKMImIiIiIiIiIFKGGDRvy5ptvMmjQIG6//XZCQ0N55ZVXcqy7bds2rr/+ehYtWkS7du0AWLBgAf369WPz5s3Url37coZeYM7iDuBysCzL89kwjGKMRERERERERERKMtu2OXPmDGlpaVlyCBUqVPCMOMqN2+1mxowZJCcn06FDB44dO8aaNWu455576Ny5M3v37qVp06a8+uqr3HDDDQCsXr2agIAAT3IJIDQ0FIfDwdq1a+nRo8eludEiVi4STACJiYnFHYKIiIiIiIiIlBLXXXcdR48e9Xx/8cUXeemll3Ksu3nzZrp06UJqaiq+vr5MmDCBFi1asHr1agDee+893nrrLdq0acPkyZPp3bs3v//+O40bN+bo0aPUqFEjS3tOp5OqVatmuX5JV24STAAOh4M9e/bQqFEjTNMs7nBESgW3283u3bv13Ijkk54dkYLRsyNSMHp2RPIvt+fGtm3S09NZuXLleSOYctO0aVNiYmJISEhg5syZDB8+nFmzZnlmVA0ZMoSBAwcC0LZtWxYvXsx3331HRETEJbq7y69cJJjO/kI4nU5s28bpdOo/uiJ5ZBiGnhuRAtCzI1IwenZECkbPjkj+5fbcnE0w+fv753mZHW9vbxo1agTAVVddxbp16/j888955plnAGjevHmW+s2bN+fAgQMA1KpVi2PHjmU57nK5OHnyJLVq1Srw/V1ujuIOQERERERERESkLLEsi7S0NIKDg6lduzY7d+7Mcnznzp3Uq1cPgA4dOhAfH8/69es9x2NiYrAsi/bt21/WuAujXIxgEhEREREREZHcRUVFERYWVtxhlEqRkZF06tSJevXqkZiYyLRp01i6dCk//vgjhmHwxBNP8O6779K6dWvatGnDpEmT2LFjB9988w2QMZrptttu46mnnuLjjz8mPT2dF154gbvvvrvU7CAHSjCJiIiIiIiIlHvR0dFKMBXQ8ePHGTZsGEePHsXf359WrVrx448/en6ew4YNIzU1lREjRnDq1ClatWrF9OnTadiwoaeNL7/8kueff57evXtjGAa9evXivffeK65bKhAlmERERERERERECmjUqFEXrfPMM8941mPKSdWqVRk7dmxRhnXZaQ0mEREREREREREpFCWYRERERERERMqxkJgIFgTFERITUdyhSCmmKXIiIiIiIiIi5diJtCRONauIOy2puEORUkwjmEREREREREREpFCUYBIRERERERERkUJRgklEREREREREsoiKiiruEKSUUYJJRERERERERLKIjo4u7hCklNEi3yIiIiIiIiLiYfYfQLjbjdm1GwQE4J4yubhDklJACSYREREREREROSc+nnCHCQ4T4uOLOxopJTRFTkRERERERERECkUJJhERERERERERKRQlmERERERERETKsUBvP+puTyXQ26+4Q5FSTAkmERERERERkXJsQ8dIOh2pxoaOkcUdipRiSjCJiIiIiIiIiEihKMEkIiIiIiIiIiKFogSTiIiIiIiISDkXGhpa3CFIKacEk4iIiIiIiEg5FxYWVtwhSCmnBJOIiIiIiIhIORMVFVXcIUgZ4yzuAERERERERETk8gmJicBvaxxJZrR2jpMiowSTiIiIiIiISDlyIi2JU80q4k5LKu5QpAzRFDkRERERERERESkUJZhERERERERERKRQlGASERERERERKeO0qLdcakowiYiIiIiIiJRx0dHRxR2ClHFa5FtERERERESkDAmJieBEWhKB3n7aJU4uG41gEhERERERESlDTqQlYRoOTvy9S5zZfwDhm7dg9h8AQKC3H3W3pxLo7VecYUoZowSTiIiIiIiISCl3wTWW4uMJT06B+HgANnSMpNORahrdJEVKCSYRERERERGRUk5rLElxU4JJREREREREpAw5bwpcQACLKvlAQEDxBiZlmhJMIiIiIiIiImVI9ilw7imTsR4bjnvKZE+d0NDQYopOyiolmERERERERETKuLCwsAt+FyksJZhERERERERESrHsu8QVFRcWqyrH89GKjxj+63AW/7W4SNuXssVZ3AGIiIiIiIiISNEq6BQ427b5tepxRtc5yFL/kyQ53bBoDQDjN4wn8tZInr/heRyGxqtIVvqNEBERERERESlloqKiPJ/dUyazqFXLLGssFWQK3KbYTfSY3IOebTYwt9pxkpxuqqQ7uaPpHdzV/C4s2+K16NfoO60vp1JPFcl9SNmhEUwiIiIiIiIipUhITAR+W+NIMqM9C3kXRlxKHK9Hv87Y9WOxbAtvy+CJQ8Hcd6w2bRIrQcRPAPSO7M3CiguZtWMW14+/nv92+S+3NbwNp0OpBdEIJhEREREREZFS5URaEgeaVeREWlKh27Jsi7um3sX/W/f/Mj43v4tNa67ng73Nueq0PyaGp26IFcLiwYtpENCA3ad203NKTxp80oCn5j3Fsv3LsGyr0PFI6aUEk4iIiIiIiEg59fWGr1l+YDl+3n4sGLiAKX2m0Di1Uq71r659NSseXMGw9sMI9AkkNjmWMWvHEDYhjC4Tu5CcnnwZo5eSRAkmERERERERkXLoePJxRkSNACCiYwQd63fM03nVfKrx3y7/Zd+T+/il/y8MajOISl6VWLxvMffPuB+X5bqUYUsJpQSTiIiIiIiISClXkF3jXl70MnEpcbSt2ZbHrnks3+d7mV50adyFcT3HMXvAbCo6KzJrxyyenPsktm3nuz0p3ZRgEhERERERESnl8rtr3LL9y/jmj28Line truncated
"image/png": "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CxcSFxdHhw4dOHnyJOvXr2fgwIH06tWL/fv307BhQ5577jluuOEGANatW4evr687uQQQGBiIaZps2LCB22+/PW8uLpcVmwQTwMGDBykGA7ZEREREREREJJsMw8Df35/mzZunqoP01FNP8fTTT6d7TEREBL179yY+Ph5vb28+++wzmjRpwrp16wB47bXXeOmll2jRogVz5syhX79+rF69mvr163P8+HEqVaqUqj8PDw/Kly/P8ePH8+5Cc1mxSDBdyDjWrVuXPXv20KBBAyzLKuCoRIoG27bZvXu37huRLNK9I5I9undEskf3jkjWXem+cRyHxMREtm3bdtkIpitp2LAh4eHhxMTEsGjRIsaNG8eSJUvcJXtGjhzJvffeC0DLli35+eef+fzzzwkKCsqjq8t/xSLBdMGFXxjLsvQfXZEs0n0jkj26d0SyR/eOSPbo3hHJurT3zYWZT2XLls10HWcvLy/q1asHQOvWrdm4cSPTp0/nkUceAaBx48ap9m/cuDGHDh0CoEqVKpw8eTLV9uTkZKKioqhSpUr2LqoAZK9alYiIiIiIiIiIpMvlcpGYmIi/vz/VqlVj9+7dqbbv3r2bWrVqAdChQweio6PZtGmTe3t4eDgul4t27drla9w5UaxGMImIiIiIiIgUtNDQULp161bQYUguCQ4OpmfPntSqVYuzZ8/y9ddfs3LlSubPn49hGDz00EO8+uqrNG/enBYtWjB79mz+/PNPPv30UyBlNFOPHj0YP348b731FklJSTz55JP079+/yKwgB0owiYiIiIiIiOSrsLAwJZiuIadOnWLs2LEcP36csmXLEhAQwPz5891/x2PHjiU+Pp4JEyZw5swZAgIC+Oabb6hbt667jw8//JAnnniCfv36YRgGd9xxB6+99lpBXVK2KMEkIiIiIiIiIpJNU6ZMyXCfRx55xF2PKT3ly5dnxowZuRlWvlMNJhEREREREZF80io8iOVVT9Mq/NpZPUwENIJJREREREREJN9EJsZyplFJ7MTYgg5FJFdpBJOIiIiIiIiIiOSIEkwiIiIiIiIiIpIjSjCJiIiIiIiIiEiOKMEkIiIiIiIiUoBCQ0MLOgSRHFOCSURERERERKSAWIOHYE59D2vwkIIORSRHtIqciIiIiIiISEGJjqa7aYHLLuhIRHJEI5hERERERERERCRHlGASEREREREREZEcUYJJREREREREJJ/4eflQc1c8fl4+BR2KSK5SgklEREREREQkn2zuGkzPYxXY3DW4oEMRyVVKMImIiIiIiIiISI4owSQiIiIiIiIiIjmiBJOIiIiIiIiIiOSIEkwiIiIiIiIi+SgwMLCgQxDJdUowiYiIiIiIiOSjbt26FXQIIrnOo6ADEBEREREREblWtQoPIjIxFj8vH60cJ9c0jWASERERERERySORibFYhklkYmxBhyKSp5RgEhERERERERGRHFGCSUREREREREREckQJJhERERERERERyRElmERERERERERyUWhoaEGHIJLvlGASERERERERyYG0CaWwsLCCCUSkAHkUdAAiIiIiIiIiRVWr8CB8dpwm1gpjc9fggg5HpMBoBJOIiIiIiIhINkUmxnKoUUkiE2MBsAYPoXvEdqzBQwDw8/Kh5q54/Lx8CjJMkTynBJOIiIiIiIhIFly1xlJ0NN3jzkN0NACbuwbT81gFjW6Sa54STCIiIiIiIiJZoBpLIpdTgklEREREREQkmy6bAufrS0jpUuDr694nMDCwYIITyUdKMImIiIiIiIhkU9opcPbcObgeGIc9d457n27duhVUeCL5RgkmERERERERkVykhJIUR0owiYiIiIiIiGSCMe9rrMFDqHHgAMa8r3Ot37NWMsvKR/Js6LN0/bQrLd5vwZyIORkfKFKIeBR0ACIiIiIiIiJFgTNwAPbAARwOCsIZOMDdnt0aS3ui9vBs0y0sqngK23BgzSb3thGLRvDroV95o+cbeFleOQ1dJM9pBJOIiIiIiIjIFYSGhma4T1anxEXHR/P0iqdp+X5Lvql0EttwqHu+JCNajmDG7TMYXGMwAO9teI+en/fkUMyhbMUukp80gklEREREREQkHa3Cg/DZcZoD9hL8vHzchbxzYm7EXB758RFOnT8FQK/TFXhjf2NaxJbGfmkGAHvm72HBsAWM+nYUvx7+lY4fdeSRjo8wsNlAavvWznEMInlBI5hERERERERE0hGZGMuhRiWxDJPIxNgc97flxBZGLh7JqfOnaOLXhMWDF7N0WxtaxJW5bN/bGt7Gr6N+pVWVVpyMO8mE0Ak0nNqQm2bdxNR1U4nNhXhEcpMSTCIiIiIiIiJ5zOW4eGjZQ9iOTd9GfdkwegN96ve56jH1ytcjfEQ4793yHoG1AzEwWHNoDY/89Ag9Pu9BdHx0PkUvkjElmERERERERESyIDtFvWdtmcWaQ2vw9vTm7V5v42l5Zuq4Up6lGN1mND/e+yP7HtrHmz3fpGKpimw8tpG75t1FXFJclmMRyQtKMImIiIiIiIhkQVaLekfGRfJMyDMATOwykVpla2XrvNXLVOeh6x7iu6HfUbZEWVbLine truncated
"text/plain": [
"<Figure size 1200x1000 with 8 Axes>"
]
@@ -1229,7 +1205,7 @@
"\n",
"Pandas v: 1.1.0 [pip install pandas] https://github.com/pandas-dev/pandas\n",
"Data from AlphaVantage v: 1.0.19 [pip install alphaVantage-api] http://www.alphavantage.co https://github.com/twopirllc/AlphaVantageAPI\n",
"Technical Analysis with Pandas TA v: 0.2.08b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Technical Analysis with Pandas TA v: 0.2.12b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Charts by Matplotlib Finance v: 0.12.6a3 [pip install mplfinance] https://github.com/matplotlib/mplfinance\n",
"\n"
]
@@ -1237,7 +1213,7 @@
{
"data": {
"text/plain": [
"<__main__.Chart at 0x1175701f0>"
"<__main__.Chart at 0x121d32a90>"
]
},
"execution_count": 17,
@@ -1247,7 +1223,7 @@
],
"source": [
"Chart(df, style=\"yahoo\", title=ticker, verbose=False,\n",
" last=recent, rpad=10, clr=True, squeeze=True,\n",
" last=recent_bars(df), rpad=10, clr=True, squeeze=True,\n",
" show_nontrading=False, # Intraday use if needed\n",
")"
]
@@ -1266,7 +1242,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIYAAANeCAYAAABnJQXMAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdZ3QW1dqH8Wtm0iAJLdKk9yYGBERQ6YKgcEBBULGDir0dC3qMWPHF3o8CHkUFRDAoXUhCQJQuVZqA9JaQQEifmfdD5IGEhHTS/r+1WOTZs2fPPSFjtvfsYriu6yIiIiIiIiIiImWOWdQBiIiIiIiIiIhI0VBiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSERERERERESkjFJiSEREpJSYMWMG119/PTVr1sTHx4fAwEDq1q3LFVdcwciRI/nvf/+brn63bt0wDOOcP5ZlUalSJS6//HLGjBnD8ePHPef07ds3Xd0vvvgi01huvfXWdPXGjh1bqPcuIiIiInljuK7rFnUQIiIikj8jRoxgwoQJ561TsWJFYmJiPJ+7devG4sWLs227Ro0aLFq0iJYtW3LgwAEuueQST7KoQoUKbNy4kTp16njqz5w5k4EDB3o+d+7cmSVLlmCaeh8lIiIiUtwoMSQiIlLCLViwgD59+ng+t23blj59+lCxYkWio6PZsGEDS5cuxbKs8yaGxo0bB8CJEyeYOXMm69ev9xxr164dq1atAmDy5MnccsstnmN9+vRh3rx5AERHR9OqVSsOHToEgL+/P+vWraNRo0aFcOciIiIikl9eRR2AiIiI5M/ppAxAo0aNWLlyJZZlpauTkpJCWFjYedt56qmnPF+PHj2ali1bsmvXLgBWr17Nrl27aNCgATfffDM//vgj06ZNA2D+/PlMmDCBe+65h0ceecSTFIK0ZJOSQiIiIiLFl8Z0i4iIlHC2bXu+jomJYefOnefU8fb2TjeqKDt+fn60a9cuXdnBgwc9X3/66afUqFHD8/nJJ5/kk08+4dtvv/WU9enTh1GjRuX4miIiIiJy4SkxJCIiUsJddtllnq+joqJo1qwZwcHB3HPPPXz00UesW7cu120mJiayevXqdGU1a9b0fB0UFMT48eM9n2NjY3nwwQc9nytXrpztmkciIiIiUvS0xpCIiEgJl5qaylVXXcXy5cuzrNOsWTPGjh2bblHovK4xdLaRI0emSxCd9u2336Zbh0hEREREiiclhkREREqBU6dOMW7cOCZMmMC+ffsyrWMYBjNnzqR///5Aznclq1atGosWLeKSSy4551hcXByXXnqpZy0igCFDhvD999/n8U5ERERE5ELSVDIREZFSwN/fn5deeom9e/eydetWvv76a+677z6qVavmqeO6Lu+88062bRmGQYUKFWjfvj0vvvgimzdvzjQpBBAQEMBtt92WrkzrComIiIiUHNqVTEREpJRp2rQpTZs25bbbbmPcuHE0b96cAwcOAPD3339neV5eBxEbhnHezyIiIiJSfCkxJCIiUsJ99dVXnDp1iltuuYVKlSqlO+br64uPj4/nc1BQ0IUOT0RERESKMSWGRERESrhdu3YxZswYHnvsMa688kratm1L1apVOXnyJLNnz2b37t2euv369Su6QEVERESk2FFiSEREpJRISUkhIiKCiIiITI+3b9+ep5566sIGJSIiIiLFmhJDIiIiJdxjjz1GcHAwERERrFy5kkOHDnHkyBGSk5OpXLkyrVq14sYbb2TkyJHpppWJiIiIiGi7ehERERERERGRMkrb1YuIiIiIiIiIlFFKDImIiIiIiIiIlFFKDImIiIiIiIiIlFFKDImIiIiIiIiIlFFKDImIiIiIiIiIZGLChAlceeWV1K1bl7p169K7d29++eWXdHVWrFjBgAEDqFWrFnXr1qVfv34kJCR4jh8/fpyRI0dSt25d6tWrx8MPP0xcXNyFvpUsaVcyEREREREREZFMzJ07F8uyaNSoEa7rMnnyZD788EMWL15MixYtWLFiBYMHD+bxxx/n2muvxcvLi40bN9KvXz98fX0BGDx4MIcPH+bdd98lJSWFhx56iLZt2zJ+/Pgivrs0SgyJiIiIiIiIiORQgwYNePnll7ntttu45ppr6NatG88//3ymdbdu3coVV1xBWFgYbdu2BWDhwoXcdNNNbNq0iZo1a17I0DPlVdQB5JfjOJ6vDcMowkhEREREREREpDhzXZekpCSSk5PT5RB8fX09I3yyYts2oaGhxMfH06FDB44ePcqqVasYMmQIvXv3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 truncated
"image/png": "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sGEDAwYMoHv37hw8eJCbb76ZV199lbZt2wKwfv16AgMD3UkhgNDQUGw2Gxs3bqR37955c3FZcEMkhgAOHz5MER/8JCIiIiIiIiJ5yDAMgoODadKkSao6Py+99BJjxoxJ95gdO3bQo0cPEhIS8PPz44svvqBBgwasX78egPHjx/PPf/6Tpk2bMnv2bPr27cu6deuoU6cOp06dokKFCqn68/LyomzZspw6dSrvLjQLinxi6EqGr1atWvzxxx/UrVsX0zQLOCqRosHpdLJv3z7dNyJZpHtHJHt074hkj+4dkazL6L6xLAu73c727duvGTGUkZtvvpno6GguXLjAwoULeeKJJ1i0aJG7tM2DDz7I/fffD0CzZs1YtWoVs2bNIiwsLI+uLncV+cTQFVe+0aZp6i9LkSzSfSOSPbp3RLJH945I9ujeEcm6tPfNlZlGAQEBHtcp9vHxoXbt2gA0b96cTZs2MXXqVJ555hkA6tevn2r/+vXrc/ToUQAqVarE6dOnU213OBycO3eOSpUqZe+icpmWqxcRERERERER8ZDL5cJutxMcHEyVKlXYt29fqu379u2jRo0aALRu3ZrY2Fg2b97s3h4dHY3L5aJly5b5GndGbpgRQyIiIiIiIiIFLTIykk6dOhV0GJJLwsPD6dq1KzVq1ODixYvMmzePNWvW8O2332IYBqNGjeKtt96iSZMmNG3alK+//pq9e/fy+eefA8mjh7p06cJTTz3FxIkTSUpK4sUXX+S+++4rFCuSgRJDIiIiIiIiIrkmKipKiaEbyJkzZxg5ciSnTp0iICCAxo0b8+2337q/xyNHjiQhIYGxY8dy/vx5GjduzPz586lVq5a7j48//pgXXniBvn37YhgGffr0Yfz48QV1SddQYkhEREREREREJB3vv/9+pvs888wz7npD6SlbtizTp0/PzbBylWoMiYiIiIiIiOSCkOgwfqx8lpDoorEalQhoxJCIiIiIiIhIroixx3G+Xgmc9riCDkXEYxoxJCIiIiIiIiJSTCkxJCIiIiIiIiJSTCkxJCIiIiIiIiJSTCkxJCIiIiIiIpJHIiMjCzoEketSYkhEREREREQkD5iDBmObPAVz0OCCDkUkQ1qVTERERERERCQvxMbS2WaCy1nQkYhkSCOGRERERERERESKKSWGRERERERERESKKSWGRERERERERHJBkI8/1fckEOTjX9ChiHhMiSERERERERGRXLClYzhdT5ZjS8fwgg5FxGNKDImIiIiIiIiIFFNKDImIiIiIiIiIFFNKDImIiIiIiIiIFFNKDImIiIiIiIjkktDQ0IIOQSRLlBgSERERERERySWdOnUq6BBEssSroAMQERERERERKYpCosOIsccR5OOvlcikyNKIIREREREREZFsiLHHYRo2YuxxBR2KSLYpMSQiIiIiIiIiUkwpMSQiIiIiIiIiUkwpMSQiIiIiIiIiUkwpMSQiIiIiIiLiocjIyIIOQSRXKTEkIiIiIiIikoG0iaCoqKiCCUQkj2i5ehEREREREZF0hESH4b/rLHFmlJajlxuWRgyJiIiIiIiIpCPGHsfReiXcy9GbgwbTecdOzEGDAQjy8af6ngSCfPwLMkyRHFFiSEREREREROQv160hFBtL5/jLEBsLwJaO4XQ9WU6jiaRIU2JIRERERERE5C+qISTFjRJDIiIiIiIiIum4ZqpYYCARpUpCYKB7n9DQ0IIJTiSXKDEkIiIiIiIiko60U8Wcc2bjevIJnHNmu/fp1KlTQYUnkiuUGBIRERERERHxkBJBcqNRYkhEREREREQEML6ZR7VDhzC+mZdrfV62OYkKPMc/V/+T7l92p9GHjZj06yQsy8q1c4jkhFdBByAiIiIiIiJSGFgD+nNs+zasAf3dbdmtIXQy7iThN//OF5VOYLdZsPo397YXfnyBn47+xMd3fUxp39I5DVskRzRiSERERERERIqt6y5PT9anjiU4Enh73ds0mtqIGVWOY7dZVEn0YWCjgXxw5weMqDkCb5s383fNp+2nbdl5emdOwhfJMY0YEhERERERkWInJDqMGHscNffaiTOj3AWmcyLiQASP/e8xDsUeAqDNhQAmHKxP+/OlcYXPAiBsYRgRf4tgyPwh7Dm7h/afteepNk8xqPEgGpZvmOMYRLJKI4ZERERERESk2Imxx2EaNo7WK0GMPS7H/Z2IO8HA+QM5FHuI6qWr81mfz1i7uRUdLpTFwEi1763VbuWXh3+h802duZR0iTfXvknIRyG0mt6Kd9a9w+lLp3Mcj4inlBgSERERERERyaGXVr7EhcQLtKzSku2Pb2dok6HY0iSEUqrgV4HFgxfz+T2f06tuL7xsXmz9cyuvRr1Ku8/acfTC0XyMXoozJYZERERERERE/pKdYtMRByKYvWM2BgaT75xMKe9SHh1n2kyGNB7CgoELOPrUUab2mkqtMrU4FHuInl/31MghyRdKDImIiIiIiIj8JavFphMdiYxeNhqAx1s+zi1VbsnWecuVLMfDzR9m+f3LqV66OrtjdtN7Tm9iE2Kz1Z+Ip5QYEhEREREREcmmib9MZM/ZPVTLine truncated
"text/plain": [
"<Figure size 1200x1000 with 8 Axes>"
]
@@ -1281,7 +1257,7 @@
"\n",
"Pandas v: 1.1.0 [pip install pandas] https://github.com/pandas-dev/pandas\n",
"Data from AlphaVantage v: 1.0.19 [pip install alphaVantage-api] http://www.alphavantage.co https://github.com/twopirllc/AlphaVantageAPI\n",
"Technical Analysis with Pandas TA v: 0.2.08b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Technical Analysis with Pandas TA v: 0.2.12b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Charts by Matplotlib Finance v: 0.12.6a3 [pip install mplfinance] https://github.com/matplotlib/mplfinance\n",
"\n"
]
@@ -1289,7 +1265,7 @@
{
"data": {
"text/plain": [
"<__main__.Chart at 0x114347e20>"
"<__main__.Chart at 0x120d32e20>"
]
},
"execution_count": 18,
@@ -1299,7 +1275,7 @@
],
"source": [
"Chart(df, style=\"yahoo\", title=ticker, verbose=False,\n",
" last=recent, rpad=10, clr=True, squeeze=True, lazybear=True,\n",
" last=recent_bars(df), rpad=10, clr=True, squeeze=True, lazybear=True,\n",
" show_nontrading=False, # Intraday use if needed\n",
")"
]
@@ -1320,7 +1296,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABH8AAANeCAYAAACLfKKfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3wUdf7H8dfMbAokIUDoJZTQpBgQsYBCQARFVEQQRFHv1FNsp2c5f54aOe9+5++wnBUs6CEqKEVAUFRKiIhIEVBAQaqEEiAhjZTN7s7vj8CaQEiyySbZhPfz8UB3Z77z/X6GbcNnvsWwbdtGRERERERERERqJbO6AxARERERERERkcqj5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiIiIiIiISC2m5I+IiEgNNHfuXIYPH07z5s0JDg4mIiKC6OhoLrroIu68807efPPNIuXj4uIwDOO0P5ZlUb9+fS644AImTpzIsWPHvMdceeWVRcq+/fbbxcZy0003FSn33HPPVeq5i4iIiIhvDNu27eoOQkRERMrujjvuYOrUqSWWiYyMJC0tzfs8Li6OFStWlFp3s2bNWLp0KV27duXAgQN0797dmxCqV68emzdvpnXr1t7y8+fPZ8SIEd7nffv25ZtvvsE0dX9JREREJFAo+SMiIlKDfPXVVwwdOtT7vFevXgwdOpTIyEhSU1P56aefWLlyJZZllZj8mTRpEgAZGRnMnz+fH3/80buvd+/erFu3DoAZM2Ywbtw4776hQ4eyePFiAFJTU+nWrRuHDh0CICwsjE2bNhETE1MJZy4iIiIi5eWo7gBERESk7E4mXgBiYmJYu3YtlmUVKZOfn8+yZctKrOeRRx7xPn7iiSfo2rUru3fvBmD9+vXs3r2bdu3aceONN/Lpp58ya9YsAL788kumTp3K7bffzgMPPOBN/EBBQkmJHxEREZHAoz7ZIiIiNYjb7fY+TktLY9euXaeVCQoKKtI7qDShoaH07t27yLaDBw96H0+ePJlmzZp5nz/88MO88cYbfPjhh95tQ4cOZcKECWVuU0RERESqjpI/IiIiNch5553nfZySkkLnzp2JjY3l9ttv57XXXmPTpk0+15mbm8v69euLbGvevLn3cVRUFO+88473eXp6Ovfee6/3eYMGDUqdg0hEREREqo/m/BEREalBXC4Xl1xyCd9///0Zy3Tu3JnnnnuuyETM5Z3zp7A777yzSBLopA8//LDIvEAiIiIiEliU/BEREalhjh8/zqRJk5g6dSpJSUnFljEMg/nz53P11VcDZV/tq0mTJixdupTu3bufti8rK4tzzz3XOzcQwOjRo/nkk0/KeSYiIiIiUhU07EtERKSGCQsL45lnnmHfvn1s27aN999/n7vuuosmTZp4y9i2zYsvvlhqXYZhUK9ePc4//3yefvpptm7dWmziByA8PJzx48cX2aZ5fkREREQCn1b7EhERqcE6depEp06dGD9+PJMmTaJLly4cOHAAgL17957xuPJ2/DUMo8TnIiIiIhJ4lPwRERGpQaZNm8bx48cZN24c9evXL7IvJCSE4OBg7/OoqKiqDk9EREREApCSPyIiIjXI7t27mThxIg8++CD9+vWjV69eNG7cmMzMTBYtWsSePXu8ZYcNG1Z9gYqIiIhIwFDyR0REpAbKz88nISGBhISEYveff/75PPLII1UblIiIiIgEJCV/REREapAHH3yQ2NhYEhISWLt2LYcOHeLw4cM4nU4aNGhAt27duP7667nzzjuLDAETERERkbOXlnoXEREREREREanFtNS7iIiIiIiIiEgtpuSPiIiIiIiIiEgtpuSPiIiIiIiIiEgtpuSPiIiIiIiIiEgtpuSPiIiIiIiIiAgwdepU+vXrR3R0NNHR0QwZMoSvv/66SJk1a9ZwzTXX0LJlS6Kjoxk2bBg5OTne/ceOHePOO+8kOjqaNm3acP/995OVlVXVp1KEVvsSEREREREREQG++OILLMsiJiYG27aZMWMGr776KitWrOCcc85hzZo1jBo1ioceeogrrrgCh8PB5s2bGTZsGCEhIQCMGjWK5ORkXnrpJfLz87nvvvvo1asX77zzTrWdl5I/IiIiIiIiIiJn0K5dO/7+978zfvx4Lr/8cuLi4vjb3/5WbNlt27Zx0UUXsWzZMnr16gXAkiVLuOGGG9iyZQvNmzevytC9HNXSajl5PB7vY8MwqjESEREREREREQl0tm2Tl5eH0+kskkcICQnx9tQ5E7fbzbx588jOzqZPnz4cOXKEdevWMXr0aIYMGcKePXvo2LEjTz75JBdffDEAa9euJTIy0pv4AYiLi8M0TdavX8/w4cMr50RLUaOSPwCZmZnVHYKIiIiIiIiI1CAXXnghycnJ3ud//etfefzxx4stu2XLFoYOHUpubi5hYWFMnz6dLl26sHbtWgCee+45nn32WXr06MHMmTMZMWIEq1atIiYmhuTkZBo3blykPofDQYMGDYq0X9VqXPIHwDRNdu/eTfv27bEsq7rDEakx3G43u3bt0mdHxEf67Ij4Tp8bkfLRZ0ekfM702bFtm/z8fL7//vvTev6cSceOHUlMTCQjI4P58+dzzz33sHDhQu9opNtuu42bbroJgHPPPZcVK1bwwQcfEB8fX0lnV3E1Kvlz8oVyOBzYto3D4dAXoogPDMPQZ0ekHPTZEfGdPjci5aPPjkj5nOmzczL5U69evTJPHxMcHEz79u0B6NmzJxs2bGDKlCk89NBDAHTu3LlI+c6dO5OUlARA06ZNOXLkSJH9LpeLY8eO0bRp03KfX0VpqXcRERERERERkTPweDw4nU6io6Np3rw5O3bsKLJ/x44dtG7dGoA+ffqQnp7Oxo0bvfsTExPxeDz07t27SuMurEb1/BERERERERERqSwTJ05k8ODBtG7dmszMTGbPns3KlSuZM2cOhmFw//33869//Yvu3bvTo0cPZsyYwa+//sq0adOAgl5Al112GX/+85958cUXyc/P57HHHmPkyJHVttIX1NTkz6FDOA4fhogI8LUrZIsWcOBA6WUKK618aceLVFRZ3rOnltH7UEpSnu+1s/W78MABcLvL/7tTUeX5u68tbfr7PXS2fJcGwjmc+rk5cTe00tssSW15fatCVXzfV8X1uK9tnK3O1t/3Wm758uUMHDjw9B0V/X0/C75Ljx49yoQJE0hOTqZevXp069aNOXPmeP8+J0yYQG5uLk888QRpaWl069aNuXPn0q5dO28db7/9No8++igjRozAMAyuueYannvuueo6JaCmJn9EREREREREpFgJCQnFJ3+kVK+++mqpZR566CHv/D/FadCgAe+8844/w6owzfkjIiIiIiIiIlKLKfkjIiIiIiIiIlKLKfkjIiIiIiIiUkvEJsazpFkqsYnx1R2KBBDN+SMiIiIiIiJSS6Q4s0jrFIrbmVXdoUgAUc8fEREREREREZFaTMkfEREREREREZFaTMkfEREREREREZFaTMkfERERERERkVps+fLl1R2CVDMlf0RERERERERqsYSEhOoOQaqZkj8iIiIiIiIitZQ1ZiyDtmzFGjO2ukORaqSl3kVERERERERqq/R0BpkWeNzVHYlUI/X8ERERERERERGpxZT8ERERERERERGpxZT8ERERERERERGpxZT8EREREREREaklooLDabU9l6jg8OoORQKIkj8iIiIiIiIitcSm/hMZfKghm/pPrO5QJIAo+SMiIiIiIiIiUosp+SMiIiIiIiIiUosp+SMiIiIiIiIiUosp+SMiIiIiIiJSi8TFxVV3CBJglPwRERERERERqUUGDhxY3SFIgFHyR0RERERERESkFnNUdwAiIiIiIiIiUj6xifGkOLOICg7X8u5yRur5IyIiIiIiIlJDpTizsAyTFGdWdYciAUzJHxERERERERGRWkzJHxERERERERGRWkzJHxERERERERGRWkzJHxEREREREZEaZPny5dUdgtQwSv6IiIiIiIiI1CAJCQnVHYLUMEr+iIiIiIiIiAQo9fIRf3BUdwAiIiIiIiIicrrYxHjCf0kly0pgU/+J1R2O1GDq+SMiIiIiIiISgFKcWSR1CiXFmQWANWYs1hVXMmjLVqwxYwGICg6n1fZcooLDqzNUCXBK/oiIiIiIiIjUBOnpYFoMys4peAxs6j+RwYcaqmeQlEjJHxEREREREZEAoTl+pDIo+SMiIiIiIiISIAqv5KUhXeIvSv6IiIiIiIiIBKDThnRFRoLHzbK6dQoenxAXF1c9AUqNodW+RERERERERGoA98czAfAsX4574EDv9oGFHosURz1/RERERERERGoQJXvEV0r+iIiIiIiIiAQAa8zYIsu4+9vOjL288fM0pu+Yg23bldKGBCYN+xIREREREREJUBWdz+e7iHRmNTnMFw2Osn3uAO/2tUc38tIFz2CZVgUjlJpAPX9EREREREREqknhpd3dH89kWbeu3rl9oPxDvNJz0/nToj9xSa91vNzyN7bXzcZhOLiwcS8MDKb8Mp3xiQ+Q586r8DlI4FPyR0RERERERKSaFF7a3V++3vU1vd7uxX83/RfDhnGHm/PJ1h4cvPEHvrnqU55qfh9BZhCz9yxixJLbyczP8nsMEliU/BERERERERGpBrGJ8SxplkpsYrxf6nN5XNz7xb1cNfMqkjKTaF+/Pct+PI/p23tw/dEmRAbXAyD0J5t5l00lzFGXpQdXMuiLG1jw21e4PC6/xCGBR8kfERERERERkWqQ4swiqVMoKU7/9Lx5Z8M7vL3hbQDuPf9e1t+xnv7pDYote3nL/nw19COiQhqwKXUro5b9iU6zL+UfG1/mQHayX+KRwKHkj4iLine truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIMAAANgCAYAAAC/fKhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3wUdf7H8dfsbgqkAaGX0AlSRaQXAVEQEVFBUMTTUxBsJ8rpHRaMeurvsNzZ0BNOURAQqQeKBRJCExERKdJr6ARSIWV35vdHYCWQkOxm09/PxyOanfnOdz6T3dkZPvMthmVZFiIiIiIiIiIiUi7YijsAEREREREREREpOkoGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIiIiIiIiUI0oGiYiIlAHz5s1j4MCB1KpVC39/f0JCQoiIiKBz586MGjWKjz76KFv5Xr16YRjGZT92u51KlSrRsWNHoqKiOHPmjHubm266KVvZjz/+OMdYRowYka3c66+/XqjHLiIiIiKeMSzLsoo7CBEREfHegw8+yNSpU69YJiwsjISEBPfrXr16sWLFijzrrlmzJsuWLaNFixYcOXKEVq1auRNEoaGhbNmyhXr16rnLL1y4kMGDB7tfd+3alZUrV2Kz6fmTiIiISEmhZJCIiEgp9t1339GvXz/363bt2tGvXz/CwsI4ffo0mzdvZtWqVdjt9ismgyZNmgRAUlISCxcu5LfffnOva9++PT///DMAM2fO5O6773av69evH0uXLgXg9OnTtGzZkmPHjgEQFBTEpk2baNy4cSEcuYiIiIh4y1HcAYiIiIj3LiRiABo3bsz69eux2+3ZymRmZrJ8+fIr1jN+/Hj37xMmTKBFixbs27cPgA0bNrBv3z4aNmzIXXfdxfz585kzZw4A3377LVOnTuWBBx7g8ccfdyeCICvBpESQiIiISMmjNtsiIiKlmMvlcv+ekJDA3r17Lyvj5+eXrfVQXgIDA2nfvn22ZUePHnX/PnnyZGrWrOl+/dRTT/HBBx8wY8YM97J+/foxduzYfO9TRERERIqOkkEiIiKl2DXXXOP+PT4+nsjISNq2bcsDDzzAe++9x6ZNmzyuMy0tjQ0bNmRbVqtWLffv4eHhTJkyxf06MTGRRx55xP26cuXKeY5hJCIiIiLFR2MGiYiIlGJOp5Pu3buzbt26XMtERkby+uuvZxvY2dsxgy42atSobEmhC2bMmJFtXCERERERKVmUDBIRESnlUlNTmTRpElOnTiUuLi7HMoZhsHDhQm655RYg/7OJVa9enWXLltGqVavL1qWkpNCmTRv32EIAQ4cO5csvv/TySERERESkKKibmIiISCkXFBTEiy++yKFDh9ixYwefffYZDz30ENWrV3eXsSyLt956K8+6DMMgNDSUa6+9lhdeeIFt27blmAgCCA4OZuTIkdmWaZwgERERkZJPs4mJiIiUIc2aNaNZs2aMHDmSSZMm0bx5c44cOQLAgQMHct3O24bChmFc8bWIiIiIlDxKBomIiJRi06ZNIzU1lbvvvptKlSplWxcQEIC/v7/7dXh4eFGHJyIiIiIlkJJBIiIipdi+ffuIioriiSeeoFu3brRr145q1aqRnJzMkiVL2L9/v7vsgAEDii9QERERESkxlAwSEREpAzIzM4mJiSEmJibH9ddeey3jx48v2qBEREREpERSMkhERKQUe+KJJ2jbti0xMTGsX7+eY8eOceLECTIyMqhcuTItW7bkjjvuYNSoUdm6jImIiIhI+aWp5UVEREREREREyhFNLS8iIiIiIiIiUo4oGSQiIiIiIiIiUo4oGSQiIiIiIiIiUo4oGSQiIiIiIiIiUo4oGSQiIiIiIiIikoOpU6fSrVs3IiIiiIiI4MYbb+T777/PVuann35i0KBB1KlTh4iICAYMGMC5c+fc68+cOcOoUaOIiIigfv36PPbYY6SkpBT1oWSj2cRERERERERERHLwzTffYLfbady4MZZlMXPmTN59911WrFjBVVddxU8//cSQIUMYN24c/fv3x+FwsGXLFgYMGEBAQAAAQ4YM4fjx47z99ttkZmby6KOP0q5dO6ZMmVJsx1Wqk0Gmabp/NwyjGCMRERERERERkZLu4hSIzeZdZ6mGDRvy0ksvMXLkSG644QZ69erFs88+m2PZHTt20LlzZ5YvX067du0A+OGHH7jzzjvZunUrtWrV8iqGgnIUy159KDk5ubhDEBEREREREZFS5uJGJQEBAe6WPLlxuVwsWLCAs2fP0qFDB06ePMnPP//M0KFDufHGG9m/fz9Nmzblueeeo0uXLgCsX7+esLAwdyIIoFevXthsNjZs2MDAgQML5+DyUOqTQQAHDx6kFDdwEhEREREREZEiYBgGERERtGrVKtu4Pc888wx/+9vfctxm69at9OvXj7S0NIKCgvj8889p3rw569evB+D111/n5ZdfpnXr1syaNYvBgwezZs0aGjduzPHjx6lWrVq2+hwOB5UrV+b48eOFd6B5KNXJoAtZvIYNG7Jnzx6aNGmC3W4v5qhESg+Xy8Xu3bt17oh4SOeOiHd07oh4TueNiHdyO3csyyIjI4MtW7Zc1jIoN02bNiU2NpakpCQWLlzIww8/zOLFi91D19x3332MGDECgDZt2rBixQqmT5/OxIkTC+noCq5UJ4MuuPDG2u12fUGKeEHnjoh3dO6IeEfnjojndN6IeOfSc+dCr6LQ0NB8jz3s7+9Po0aNALj66qvZuHEjH374IePGjQMgMjIyW/nIyEji4uIAqFGjBidPnsy23ul0cubMGWrUqOHdQfmAppYXEREREREREckn0zTJyMggIiKCWrVqsXv37mzrd+/eTb169QDo0KEDiYmJ/Prrr+71sbGxmKZJ+/btizTui5WJlkEiIiIiIiIiIr4WFRVF3759qVevHsnJyXz11VesWrWKuXPnYhgGjz32GK+99hqtWrWidevWzJw5k127djFt2jQgq5XQ9ddfz1/+8hfeeustMjMzefrpp7n99tuLbSYxKCvJoGPHcJw4ASEhcD77JuIzR45ceX3t2peXqV278OKR0i+vz9SlcvqM5WebssDT4y6o/P6tXa4/rjsFbbLvzfvra0XxPZZT/fn5fi1tSsL1oDhiyO+18uJzR/dsOSuK73tPz73CuG6VxvO7MHh6zdF5UypER0fTu3fvy1cUxT1gTnUUdQxl7Pw+deoUY8eO5fjx44SGhtKyZUvmzp3rfo/Hjh1LWloaEyZMICEhgZYtWzJv3jwaNmzoruPjjz/mr3/9K4MHD8YwDAYNGsTrr79eXIcElJVkkIiIiIiIiEgJEBMTk3MySEqld999N88y48aNc48flJPKlSszZcoUX4ZVYBozSERERERERESkHFEySERERERERESkHFEySERERERERMQH2sZO5Ieap2kbO7G4QxG5Io0ZJCIiIiIiIuID8RkpJDQLxJWRUtyhiFyRWgaJiIiIiIiIiJQjSgaJiIiIiIiIiJQjSgaJiIiIiIiIiJQjSgaJiIiIiIiIFJLo6OjiDkHkMkoGiYiIiIiIiBSSmJiY4g5B5DJKBomIiIiIiIgUAvuw4fTZug37sOHFHYpINppaXkRERERERKQwJCbSx2YH01XckYhko5ZBIiIiIiIiIiLliJJBIiIiIiIiIiLliJJBIiIiIiIiIiLliJJBIiIiIiIiIj4Q7h9M3Z1phPsHF3coIlekZJCIiIiIiIiID2zqGUXfY1XY1DOquEMRuSIlg0REREREREREyhElg0REREREREREyhElg0REREREREREyhElg0RERERERER8pFevXsUdgkielAwSERERERER8ZHevXsXdwgieVIySERERERERMRL0dHRxR2CiMccxR2AiIiIiIiISGnUNnYiwdtPk2KP0XTyUqooGSQiIiIiIiLihfiMFBKaBeLKSCnuUEQ8om5iIiIiIiIiIiLliJJBIiIiIiIiIiLliJJBIiIiIiIiIiLliJJBIiIiIiIiIvmk2cOkLFAySERERERERCSfYmJiijsEkQJTMkhEREREREQkB2oFJGWVppYXERERERERuUTb2IkEbz/NAddiwv2D2dQzqrhDEvEZtQwSERERERERuUR8RgpxzQKxGzbiM1KwDxuOvf9N9Nm6Dfuw4QCE+wdTd2ca4f7BxRytiGeUDBIREREREREhj25hiYlgs9Pn7Lms34FNPaPoe6yKWg1JqaNkkIiIiIiIiAgaHFrKDyWDRERERERERC5xoQuYyzLVDUzKHCWDRERERERERC5xoQtYXN83s7qBhYWB6WJ5xQpZv5/Xq1ev4gtSxEuaTUxEREREREQkD67ZswAwo6Nx9e7tXt77ot9FSgu1DBIRERERERHJJyV/pCxQMkhERERERETKPWPOV9Q5cABjzlc+r/uofzqf7vqSYdFjuSvmEU6lnfb5PkQ8oW5iIiIiIiIiUu5ZQ4dweMtmrKFD3MsKMh5QpiuTf9c5wMwax/klOBlWr3Kv23JmO0tu+IyI4DoFCVnEa2oZJCIiIiIiIuVSdHT0Fdd72yXstxO/0e3Tbvy18e6sRBBwbdW2/L3NY1RzVGFH4h56fT2E3xN2e1W/SEGpZZCIiIiIiIiUO21jJxK8/TQp9pis2cJ8INOVyT/X/pNXV71KpplJlUwHLx9oym0nw6n60XQAXDFJLGy4ih2Je+j9zRAW9f2EjtXa+WT/IvmllkEiIiIiIiJS7sRnpBDXLJD4jBSf1JeSkUKvz3sRFRtFppnJoGaD2PxzZ8Ycq0eNzAB3uUpmCNE3zaFD1bacTk+g79LhjF3zdzbGb/FJHCL5oWSQiIiIiIiISAG9u/5d1h9ZT6XLine truncated
"text/plain": [
"<Figure size 1200x1000 with 6 Axes>"
]
@@ -1335,7 +1311,7 @@
"\n",
"Pandas v: 1.1.0 [pip install pandas] https://github.com/pandas-dev/pandas\n",
"Data from AlphaVantage v: 1.0.19 [pip install alphaVantage-api] http://www.alphavantage.co https://github.com/twopirllc/AlphaVantageAPI\n",
"Technical Analysis with Pandas TA v: 0.2.08b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Technical Analysis with Pandas TA v: 0.2.12b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Charts by Matplotlib Finance v: 0.12.6a3 [pip install mplfinance] https://github.com/matplotlib/mplfinance\n",
"\n"
]
@@ -1343,7 +1319,7 @@
{
"data": {
"text/plain": [
"<__main__.Chart at 0x117cfcbe0>"
"<__main__.Chart at 0x12278a400>"
]
},
"execution_count": 19,
@@ -1353,7 +1329,7 @@
],
"source": [
"Chart(df, style=\"yahoo\", title=ticker, verbose=False,\n",
" last=recent, rpad=10,\n",
" last=recent_bars(df), rpad=10,\n",
" volume=True, midpoint=False, ohlc4=False,\n",
" rsi=False, clr=True, macd=False, zscore=False, squeeze=False, lazybear=False,\n",
" archermas=True, archerobv=False,\n",
@@ -1378,7 +1354,7 @@
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAABH8AAANeCAYAAACLfKKfAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3gWVdrH8e/MpJKEGCK9dwUkFFFEliWANBVRQVCEVwVUsKwuurpYYnYt7GIv2AALIr0tCBYgMWKjCAgoTYoESIAEUgjhSWbm/SPyQCCBJIQ0f5/ryu7znDlz5p7IyPGeUwzXdV1ERERERERERKRCMks7ABERERERERERuXCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERERERERERqcCU/BERESmH5s6dy3XXXUfNmjXx8/MjJCSEevXq0bFjR0aOHMm7776bq37Xrl0xDOOMH8uyuOiii7jiiiuIjo7m8OHD3nP69OmTq+7777+fZyxDhgzJVW/cuHEX9N5FREREpHAM13Xd0g5CRERECm7EiBFMmjTprHVCQ0M5cuSI93vXrl35+uuvz9l2jRo1WLZsGS1atGDfvn20atXKmxCqXLkyGzdupG7dut76CxYsoH///t7vnTp14ptvvsE09X5JREREpKxQ8kdERKQc+fLLL+nVq5f3e9u2benVqxehoaEkJyezYcMGVqxYgWVZZ03+jB8/HoDU1FQWLFjAzz//7D3Wvn17Vq9eDcC0adO47bbbvMd69erF559/DkBycjItW7YkISEBgKCgINavX0/jxo0vwJ2LiIiISFH5lHYAIiIiUnAnEi8AjRs3ZtWqVViWlatOVlYWy5cvP2s7jzzyiPfz2LFjadGiBTt37gRgzZo17Ny5k4YNG3Lrrbcyb948Zs2aBcAXX3zBpEmTGD58OA8++KA38QM5CSUlfkRERETKHo3JFhERKUds2/Z+PnLkCDt27Dijjq+vb67RQecSEBBA+/btc5Xt37/f+/ntt9+mRo0a3u9jxoxhwoQJTJ061VvWq1cvRo0aVeBrioiIiEjJUfJHRESkHGnXrp33c1JSEs2bNyciIoLhw4fz5ptvsn79+kK3mZmZyZo1a3KV1axZ0/s5PDyciRMner+npKRw3333eb+HhYWdcw0iERERESk9WvNHRESkHMnOzqZz5878+OOP+dZp3rw548aNy7UQc1HX/DnVyJEjcyWBTpg6dWqudYFEREREpGxR8kdERKScOXr0KOPHj2fSpEnEx8fnWccwDBYsWMD1118PFHy3r2rVqrFs2TJatWp1xrH09HRat27tXRsIYODAgcycObOIdyIiIiIiJUHTvkRERMqZoKAgnnnmGfbs2cOWLVv4+OOPueeee6hWrZq3juu6vPzyy+dsyzAMKleuzOWXX87TTz/NL7/8kmfiByA4OJihQ4fmKtM6PyIiIiJln3b7EhERKceaNWtGs2bNGDp0KOPHj+eSSy5h3759AOzevTvf84o68NcwjLN+FxEREZGyR8kfERGRcuSjjz7i6NGj3HbbbVx00UW5jvn7++Pn5+f9Hh4eXtLhiYiIiEgZpOSPiIhIObJz506io6N56KGHuPrqq2nbti1Vq1YlLS2Nzz77jF27dnnr9u3bt/QCFREREZEyQ8kfERGRcigrK4vY2FhiY2PzPH755ZfzyCOPlGxQIiIiIlImKfkjIiJSjjz00ENEREQQGxvLqlWrSEhI4MCBA3g8HsLCwmjZsiU333wzI0eOzDUFTERERET+vLTVu4iIiIiIiIhIBaat3kVEREREREREKjAlf0REREREREREKjAlf0REREREREREKjAlf0REREREREREKjAlf0REREREREREgEmTJnH11VdTr1496tWrR8+ePfnqq69y1Vm5ciX9+vWjdu3a1KtXj759+3Ls2DHv8cOHDzNy5Ejq1atH/fr1eeCBB0hPTy/pW8lFu32JiIiIiIiIiABLlizBsiwaN26M67pMmzaNN954g6+//ppLL72UlStXMmDAAB5++GF69+6Nj48PGzdupG/fvvj7+wMwYMAAEhMTeeWVV8jKyuL++++nbdu2TJw4sdTuS8kfEREREREREZF8NGzYkH/9618MHTqUa665hq5du/LEE0/kWXfLli107NiR5cuX07ZtWwCWLl3KLbfcwqZNm6hZs2ZJhu7lUypXLSLHcbyfDcMoxUhEREREREREpKxzXZfjx4/j8Xhy5RH8/f29I3XyY9s28+fPJyMjgw4dOnDw4EFWr17NwIED6dmzJ7t27aJp06Y8+eSTXHXVVQCsWrWK0NBQb+IHoGvXrpimyZo1a7juuusuzI2eQ7lK/gCkpaWVdggiIiIiIiIiUo5ceeWVJCYmer8/9thjPP7443nW3bRpE7169SIzM5OgoCCmTJnCJZdcwqpVqwAYN24c//73v7nsssuYPn06/fv357vvvqNx48YkJiZStWrVXO35+PgQFhaW6/olrdwlfwBM02Tnzp00atQIy7JKOxyRcsO2bXbs2KFnR6SQ9OyIFJ6eG5Gi0bMjUjT5PTuu65KVlcWPP/54xsif/DRt2pS4uDhSU1NZsGABo0ePZtGiRd7ZSHfccQdDhgwBoHXr1nz99dd88sknREVFXaC7O3/lKvlz4h+Uj48Pruvi4+OjfyGKFIJhGHp2RIpAz45I4em5ESkaPTsiRZPfs3Mi+VO5cuUCLx/j5+dHo0aNAGjTpg1r167lnXfe4eGHHwagefPmueo3b96c+Ph4AKpXr87BgwdzHc/Ozubw4cNUr169yPd3vrTVu4iIiIiIiIhIPhzHwePxUK9ePWrWrMn27dtzHd++fTt169YFoEOHDqSkpLBu3Trv8bi4OBzHoX379iUa96nK1cgfERERERERETm7mJgYIiMjSzuMcik6OpoePXpQt25d0tLSmD17NitWrGDOnDkYhsEDDzzACy+8QKtWrbjsssuYNm0a27Zt46OPPgJyRgF1796dv/3tb7z88stkZWXxj3/8g5tuuqnUdvoCJX9EREREREREKpTY2Fglf4ro0KFDjBo1isTERCpXrkzLli2ZM2eO9/c5atQoMjMzGTt2LEeOHKFly5bMnTuXhg0bett4//33efTRR+nfvz+GYdCvXz/GjRtXWrcEKPkjIiIiIiIiIgLAG2+8cc46Dz/8sHf9n7yEhYUxceLE4gzrvGnNHxERERERERGRCkzJHxEREREREZEKIiIuiqU1komIK7vbjkvJ07QvERERERERkQoiyZPOkWYB2J700g5FyhCN/BERERERERERqcCU/BERERERERERqcCU/BERERERERGpwGJiYko7BCllSv6IiIiIiIiIVGCxsbGlHYKUMiV/RERERERERCooa9Bgum36BWvQ4NIORUqRdvsSERERERERqahSUuhmWuDYpR2JlCKN/BERERERERERqcCU/BERERERERERqcCU/BERERERERGpIML9gqmzNZNwv+DSDkXKECV/RERERERERCqI9V2i6ZFQhfVdoks7FClDlPwREREREREREanAlPwREREREREREanAlPwRERERERERqUC6du1a2iFIGaPkj4iIiIiIiEgFEhkZWdohSBmj5I+IiIiIiIhIORYTE1PaIUgZ51PaAYiIiIiIiIhI0UTERRG8OZl0K1Y7fEm+lPwRERERERERKaeSPOkcaRaA7Ukv7VCkDNO0LxERERERERGRCkzJHxERERERERGRCkzJHxEREREREZFyRAs8S2Ep+SMiIiIiIiJSjsTGxpZ2CFLOaMFnERERERERkTIoIi6KJE864X7B2slLzotG/oiIiIiIiIiUQUmedCzDJOmPnbysQYOxeveh26ZfsAYNBiDcL5g6WzMJ9wsuzVCljFPyR0RERERERKSMOOt6PikpYFp0yziW8xlY3yWaHglVNDJIzkrJHxEREREREZEyQuv5yIWg5I+IiIiIiIhIGXTGlK7QUHBsllcKzPksUkBK/oiIiIiIiIiUQadP6bJnTMf+fAnOfaOxZ0z31uvatWspRSjlhZI/IiIiIiIiIuVIZGTkWb+LnE5bvYuIiIiIiIiUAdagwXSzbaxBg3ON7CkOCb7HifllJt/u+ZbqQdV5+MqHCfQNLNZrSNml5I+IiIiIiIhIGXU+U7oOHD3Ai422srhKElsrZcD8Fd5j87fMZ/pN02kU1qgYopSyTtO+RERERERERErJqVu72zOms7xli1yjfooypet49nFe/P5FWrzTglfr7GFrpQwMFyKqR3Bvu3sJ9QllXeI6On7QkcXbFxfLfUjZppE/IiIiIiIiIqUgIi6K4M3JpFux3kWdz9eCLQt4bNlj7DiyA4D2aSH8M74RXQ+HUnnRUgCs7y1WNVzFyn0r6T+zP2M6juHBKx6kZnDNYolByh6N/BEREREREREpBUmedOKbBZDkSS+W9v639X8MnDOQHUd2UDO4JhOvm8gPaztwY1J1wrJ9vfUqU5nlQ5czuv1oAF764SUavN6AnlN7MmntJJIykoolHik7lPwRERERERERKefSPek8/OXDAPxf6/9j072bGNZ6GCZGnvX9LD9e7fUq026cRsfaHXFxid0dy6glo2j0ZiOWbF9SkuHLBabkj4iIiIiIiEg599yK59iTuocGoQ14rddrBPsFF+i8my+9mbj/i2Pr6K08F/kcLau25Fj2MW6ddyur9q26wFFLSVHyR0RERERERKSMKMruXhsPbOS1la8B8ErPV6jkW6nQbTS4qAGPXvUoK+9aSc9GPcnIyuCGGTewNWlroduSskfJHxEREREREZEyorC7e7muy4NfPEi2k02/Zv24tum1Z61vDRpMt02Line truncated
"image/png": "iVBORw0KGgoAAAANSUhEUgAABIMAAANgCAYAAAC/fKhVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAPYQAAD2EBqD+naQAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdeVwW5frH8c/MIKCgqLjhgvuuoaWWaSZqbmWaS5Jm28nKVtvNFqRzKsuWc45Z+VM7aYuauZWZ5gJSarlvaJr7kvuCIiI8z8zvD/IRFNkRkO/79TKfueeee64BJsZr7sVwHMdBRERERERERESKBDO/AxARERERERERkatHySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySARERERERERkSJEySAREZFrwIwZM7jjjjsICgrC29ubkiVLEhwczE033cTgwYMZO3Zsqvrt27fHMIzL/liWRenSpWnVqhURERGcPHnSc0y3bt1S1R03blyasQwcODBVvZEjR+bptYuIiIhI1hiO4zj5HYSIiIhk38MPP8yECRPSrRMQEMCpU6c82+3bt2fJkiUZtl2pUiUWLVpEo0aN+Ouvv2jSpIknQVSqVCk2bdpEtWrVPPVnz55Nr169PNs333wzv/zyC6ap908iIiIiBYWSQSIiIoXYzz//TJcuXTzbzZs3p0uXLgQEBHDixAk2btzIr7/+imVZ6SaDRo0aBcDp06eZPXs2GzZs8Oy74YYbWLVqFQCTJ09mwIABnn1dunRh3rx5AJw4cYLGjRtz6NAhAPz8/Fi/fj21a9fOgysXERERkezyyu8AREREJPsuJGIAateuzcqVK7EsK1WdpKQkFi9enG47L7zwgufz8OHDadSoEbt27QJg9erV7Nq1i5o1a3LPPfcwc+ZMpk2bBsD8+fOZMGEC//jHP3j66ac9iSBITjApESQiIiJS8KjPtoiISCHmdrs9n0+dOsXOnTsvq1OsWLFUvYcy4uvryw033JCq7ODBg57Pn376KZUqVfJsP//883zyySd8/fXXnrIuXbowZMiQTJ9TRERERK4eJYNEREQKseuvv97z+fjx49Sv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 truncated
"text/plain": [
"<Figure size 1200x1000 with 8 Axes>"
]
@@ -1393,7 +1369,7 @@
"\n",
"Pandas v: 1.1.0 [pip install pandas] https://github.com/pandas-dev/pandas\n",
"Data from AlphaVantage v: 1.0.19 [pip install alphaVantage-api] http://www.alphavantage.co https://github.com/twopirllc/AlphaVantageAPI\n",
"Technical Analysis with Pandas TA v: 0.2.08b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Technical Analysis with Pandas TA v: 0.2.12b [pip install pandas_ta] https://github.com/twopirllc/pandas-ta\n",
"Charts by Matplotlib Finance v: 0.12.6a3 [pip install mplfinance] https://github.com/matplotlib/mplfinance\n",
"\n"
]
@@ -1401,7 +1377,7 @@
{
"data": {
"text/plain": [
"<__main__.Chart at 0x116ce9820>"
"<__main__.Chart at 0x1213aa1f0>"
]
},
"execution_count": 20,
@@ -1411,7 +1387,7 @@
],
"source": [
"Chart(df, style=\"yahoo\", title=ticker, verbose=False,\n",
" last=recent, rpad=10,\n",
" last=recent_bars(df), rpad=10,\n",
" volume=True, midpoint=False, ohlc4=False,\n",
" rsi=False, clr=True, macd=False, zscore=False, squeeze=False, lazybear=False,\n",
" archermas=False, archerobv=True,\n",
+11 -10
View File
@@ -8,7 +8,7 @@ import pandas as pd # pip install pandas
import yfinance as yf
# yf.pdr_override() # <== that's all it takes :-)
from alphaVantageAPI.alphavantage import AlphaVantage # pip install alphaVantage-api
import alphaVantageAPI as AV # pip install alphaVantage-api
import pandas_ta as ta # pip install pandas_ta
@@ -55,7 +55,7 @@ class Watchlist(object):
A simple Class to load/download financial market data and automatically
apply Technical Analysis indicators with a Pandas TA Strategy.
Default Strategy: pandas_ta.AllStrategy.
Default Strategy: pandas_ta.CommonStrategy
## Package Support:
### Data Source (Default: AlphaVantage)
@@ -67,7 +67,7 @@ class Watchlist(object):
- Pandas TA (pip install pandas_ta)
## Required Arguments:
- tickers: A list of strings containing tickers. Example: ['SPY', 'AAPL']
- tickers: A list of strings containing tickers. Example: ["SPY", "AAPL"]
"""
def __init__(
self,
@@ -78,11 +78,12 @@ class Watchlist(object):
ds: object = None,
**kwargs
):
self.tickers = tickers
self.tf = tf
self.verbose = kwargs.pop("verbose", False)
self.debug = kwargs.pop("debug", False)
self.name = name
self.tickers = tickers
self.tf = tf
self.name = name if isinstance(name, str) else f"Watch: {', '.join(tickers)}"
self.data = None
self.kwargs = kwargs
self.strategy = strategy
@@ -92,9 +93,9 @@ class Watchlist(object):
elif isinstance(ds, str) and ds.lower() == "yahoo":
self.ds = yf
else:
AVkwargs = {"api_key": "YOUR API KEY","clean": True, "export": True, "export_path": ".", "output_size": "full", "premium": False}
AVkwargs = {"api_key": "YOUR API KEY", "clean": True, "export": True, "export_path": ".", "output_size": "full", "premium": False}
av_kwargs = kwargs.pop("av_kwargs", AVkwargs)
self.ds = AlphaVantage(**av_kwargs)
self.ds = AV.AlphaVantage(**av_kwargs)
def _drop_columns(self, df: pd.DataFrame, cols: list = ["Unnamed: 0", "date", "split_coefficient", "dividend"]):
@@ -145,8 +146,8 @@ class Watchlist(object):
print(f"[i] Loaded['{tf}']: {filename_}")
else:
print(f"[+] Downloading['{tf}']: {ticker}")
if isinstance(self.ds, AlphaVantage):
df = self.ds.data(tf, ticker)
if isinstance(self.ds, AV.AlphaVantage):
df = self.ds.data(ticker, tf)
if not df.ta.datetime_ordered:
df = df.set_index(pd.DatetimeIndex(df[index]))
elif isinstance(self.ds, yfinance):
+24
View File
@@ -18,6 +18,14 @@ except DistributionNotFound:
else:
__version__ = _dist.version
from importlib.util import find_spec
Imports = {
"scipy": find_spec("scipy") is not None,
"sklearn": find_spec("sklearn") is not None,
"alphaVantage-api ": find_spec("alphaVantageAPI") is not None,
"yfinance": find_spec("yfinance") is not None
}
# Not ideal and not dynamic but it works.
# Will find a dynamic solution later.
Category = {
@@ -46,4 +54,20 @@ Category = {
"volume": ["ad", "adosc", "aobv", "cmf", "efi", "eom", "mfi", "nvi", "obv", "pvi", "pvol", "pvt"],
}
# https://www.worldtimezone.com/markets24.php
EXCHANGE_TZ = {
"NZSX": 12, "ASX": 11,
"TSE": 9, "HKE": 8, "SSE": 8, "SGX": 8,
"NSE": 5.5, "DIFX": 4, "RTS": 3,
"JSE": 2, "FWB": 1, "LSE": 1,
"BMF": -2, "NYSE": -4, "TSX": -4
}
RATE = {
"TRADING_DAYS_PER_YEAR": 252, # Keep even
"TRADING_HOURS_PER_DAY": 6.5,
"MINUTES_PER_HOUR": 60
}
from pandas_ta.core import *
+23 -17
View File
@@ -23,7 +23,7 @@ from pandas_ta.volatility import *
from pandas_ta.volume import *
from pandas_ta.utils import *
version = ".".join(("0", "2", "11b"))
version = ".".join(("0", "2", "12b"))
# Strategy DataClass
@@ -350,18 +350,18 @@ class AnalysisIndicators(BasePandasObject):
else:
if isinstance(result, pd.DataFrame):
# If specified in kwargs, rename the columns. If not, use the default names.
if 'col_names' in kwargs and isinstance(kwargs['col_names'], tuple):
if len(kwargs['col_names'])>=len(result.columns):
for col, ind_name in zip(result.columns, kwargs['col_names']):
if "col_names" in kwargs and isinstance(kwargs["col_names"], tuple):
if len(kwargs["col_names"])>=len(result.columns):
for col, ind_name in zip(result.columns, kwargs["col_names"]):
df[ind_name] = result.loc[:,col]
else:
print(f'Not enough col_names were specified : got {len(kwargs["col_names"])}, expected {len(result.columns)}.')
print(f"Not enough col_names were specified : got {len(kwargs['col_names'])}, expected {len(result.columns)}.")
return
else:
for i, column in enumerate(result.columns):
df[column] = result.iloc[:,i]
else:
ind_name = kwargs['col_names'][0] if 'col_names' in kwargs and isinstance(kwargs['col_names'], tuple) else result.name
ind_name = kwargs["col_names"][0] if "col_names" in kwargs and isinstance(kwargs["col_names"], tuple) else result.name
df[ind_name] = result
@@ -587,25 +587,31 @@ class AnalysisIndicators(BasePandasObject):
excluded_str = ", ".join(excluded)
print(f"[i] Excluded[{len(excluded)}]: {excluded_str}")
if verbose:
print(f"[i] Multiprocessing: {self.cores} of {cpu_count()} cores.")
timed = kwargs.pop("timed", False)
results = []
pool = Pool(self.cores)
if timed: stime = perf_counter()
if mode["custom"]:
has_col_names = True if len([True for x in ta if 'col_names' in x and isinstance(x['col_names'], tuple)]) else False
custom_ta = [(ind["kind"], ind["params"] if "params" in ind and isinstance(ind["params"], tuple) else (), {**ind, **kwargs}) for ind in ta]
# Custom multiprocessing pool. Must be ordered for Chained Strategies
# May fix this to cpus if Chaining/Composition if it remains inconsistent
results = pool.imap(self._mp_worker, custom_ta, self.cores)#, cpus)
# Without multiprocessing :
for ind in ta:
params = ind["params"] if "params" in ind and isinstance(ind["params"], tuple) else tuple()
getattr(self, ind["kind"])(*params, **{**ind, **kwargs})
if has_col_names:
if verbose: print(f"[i] No mulitproccessing support for 'col_names' option.")
# Without multiprocessing:
for ind in ta:
params = ind["params"] if "params" in ind and isinstance(ind["params"], tuple) else tuple()
getattr(self, ind["kind"])(*params, **{**ind, **kwargs})
else:
if verbose:
print(f"[i] Multiprocessing: {self.cores} of {cpu_count()} cores.")
# Custom multiprocessing pool. Must be ordered for Chained Strategies
# May fix this to cpus if Chaining/Composition if it remains inconsistent
results = pool.imap(self._mp_worker, custom_ta, self.cores)
else:
if verbose:
print(f"[i] Multiprocessing: {self.cores} of {cpu_count()} cores.")
default_ta = [(ind, tuple(), kwargs) for ind in ta]
# All and Categorical multiprocessing pool. Speed over Order.
results = pool.imap_unordered(self._mp_worker, default_ta, self.cores)
+3 -1
View File
@@ -75,7 +75,9 @@ def linreg(close, length=None, offset=None, **kwargs):
linreg.__doc__ = \
"""Linear Regression Moving Average (linreg)
Linear Regression Moving Average
Linear Regression Moving Average (LINREG). This is a simplified version of a
Standard Linear Regression. LINREG is a rolling regression of one variable. A
Standard Linear Regression is between two or more variables.
Source: TA Lib
+66 -18
View File
@@ -1,7 +1,13 @@
# -*- coding: utf-8 -*-
import math
import sys
from datetime import datetime
from functools import reduce
# from importlib.util import find_spec
from operator import mul
from pathlib import Path
from sys import float_info as sflt
from time import perf_counter
from numpy import argmax, argmin, dot, ones, triu
@@ -9,27 +15,17 @@ from numpy import append as npAppend
from numpy import array as npArray
from numpy import ndarray as npNdArray
from numpy import sum as npSum
# from numpy import std as npStd
from numpy import sqrt as npSqrt
from numpy import corrcoef as npCorrcoef
from numpy import seterr
from pandas import DataFrame, Series
from pandas.api.types import is_datetime64_any_dtype
from functools import reduce
from operator import mul
from sys import float_info as sflt
TRADING_DAYS_PER_YEAR = 252 # Keep even
TRADING_HOURS_PER_DAY = 6.5
MINUTES_PER_HOUR = 60
from pandas_ta import Imports, EXCHANGE_TZ, RATE
# https://www.worldtimezone.com/markets24.php
EXCHANGE_TZ = {
"NZSX": 12, "ASX": 11,
"TSE": 9, "HKE": 8, "SSE": 8, "SGX": 8,
"NSE": 5.5, "DIFX": 4, "RTS": 3,
"JSE": 2, "FWB": 1, "LSE": 1,
"BMF": -2, "NYSE": -4, "TSX": -4
}
seterr(divide="ignore", invalid="ignore")
def _above_below(
@@ -318,6 +314,59 @@ def get_time(exchange: str = "NYSE", to_string:bool = False) -> (None, str):
return s if to_string else print(s)
def _linear_regression_np(x: Series, y: Series) -> dict:
"""Simple Linear Regression in Numpy for two 1d arrays for environments
without the sklearn package."""
m = x.size
x_sum = x.sum()
y_sum = y.sum()
# 1st row, 2nd col value corr(x, y)
r = npCorrcoef(x, y)[0,1]
r_mixture = m * (x * y).sum() - x_sum * y_sum
b = r_mixture / (m * (x * x).sum() - x_sum * x_sum)
a = y.mean() - b * x.mean()
line = a + b * x
return {
"a": a, "b": b, "r": r,
"t": r / npSqrt((1 - r * r) / (m - 2)),
"line": line
}
def _linear_regression_sklearn(x, y):
"""Simple Linear Regression in Scikit Learn for two 1d arrays for
environments with the sklearn package."""
from sklearn.linear_model import LinearRegression
regression = LinearRegression().fit(DataFrame(x), y=y)
r = regression.score(DataFrame(x), y=y)
a, b = regression.intercept_, regression.coef_[0]
return {
"a": a, "b": b, "r": r,
"t": r / npSqrt((1 - r * r) / (x.size - 2)),
"line": a + b * x
}
def linear_regression(x: Series, y: Series) -> dict:
"""Classic Linear Regression in Numpy or Scikit-Learn"""
x = verify_series(x)
y = verify_series(y)
m, n = x.size, y.size
if m != n:
print(f"[X] Linear Regression X and y observations do not match: {m} != {n}")
return
if Imports["sklearn"]:
return _linear_regression_sklearn(x, y)
else:
return _linear_regression_np(x, y)
def is_percent(x: int or float) -> bool:
if isinstance(x, (int, float)):
return x is not None and x >= 0 and x <= 100
@@ -325,8 +374,7 @@ def is_percent(x: int or float) -> bool:
def non_zero_range(high: Series, low: Series) -> Series:
"""Returns the difference of two series and adds epsilon to any zero values. This occurs commonly in crypto data when
high = low.
"""Returns the difference of two series and adds epsilon to any zero values. This occurs commonly in crypto data when 'high' = 'low'.
"""
diff = high - low
if diff.eq(0).any().any():
+31 -6
View File
@@ -99,9 +99,9 @@ class TestStrategyMethods(TestCase):
]
custom = pandas_ta.Strategy(
"Momo, Bands and SMAs and Cumulative Log Returns", # name
"Commons with Cumulative Log Return EMA Chain", # name
momo_bands_sma_ta, # ta
"MACD and RSI Momo with BBANDS and SMAs 50 & 200 and Cumulative Log Returns" # description
"Common indicators with specific lengths and a chained indicator" # description
)
self.data.ta.strategy(custom, verbose=verbose, timed=strategy_timed)
@@ -110,15 +110,40 @@ class TestStrategyMethods(TestCase):
self.category = "Custom B"
custom_args_ta = [
{"kind":"fisher", "params": (13, 7)},
{"kind":"macd", "params": (9, 19, 7), "col_numbers": (1,)},
{"kind":"ema", "params": (5,)},
{"kind":"linreg", "close": "EMA_5", "length": 8, "suffix": "EMA_5"}
{"kind":"fisher", "params": (13, 7)},
]
custom = pandas_ta.Strategy(
"Custom Args Tuple", custom_args_ta,
"Allow for easy filling in indicator arguments without naming them"
"Allow for easy filling in indicator arguments by argument placement."
)
self.data.ta.strategy(custom, verbose=verbose, timed=strategy_timed)
def test_custom_col_names_tuple(self):
self.category = "Custom C"
custom_args_ta = [
{"kind":"bbands", "col_names": ("LB", "MB", "UB")}
]
custom = pandas_ta.Strategy(
"Custom Col Numbers Tuple", custom_args_ta,
"Allow for easy renaming of resultant columns"
)
self.data.ta.strategy(custom, verbose=verbose, timed=strategy_timed)
# @skip
def test_custom_col_numbers_tuple(self):
self.category = "Custom D"
custom_args_ta = [
{"kind":"macd", "col_numbers": (1,)}
]
custom = pandas_ta.Strategy(
"Custom Col Numbers Tuple", custom_args_ta,
"Allow for easy selection of resultant columns"
)
self.data.ta.strategy(custom, verbose=verbose, timed=strategy_timed)
+13
View File
@@ -161,6 +161,19 @@ class TestUtilities(TestCase):
self.assertEqual(self.utils.EXCHANGE_TZ["NYSE"], -4)
self.assertIsInstance(result, str)
def test_linear_regression(self):
x = Series([1, 2, 3, 4, 5])
y = Series([1.8, 2.1, 2.7, 3.2, 4])
# r = {"a": 1.1099999999999985, "b": 0.5500000000000006}
result = self.utils.linear_regression(x, y)
self.assertIsInstance(result, dict)
self.assertIsInstance(result["a"], float)
self.assertIsInstance(result["b"], float)
self.assertIsInstance(result["r"], float)
self.assertIsInstance(result["t"], float)
self.assertIsInstance(result["line"], Series)
def test_pascals_triangle(self):
self.assertIsNone(self.utils.pascals_triangle(inverse=True), None)