+
+
+
+
+
+
+
+ Double-click (or enter) to edit
+diff --git "a/images/Application_ Crytpo-Currency Create Daily Dev v2.ipynb - Colaboratory.html" "b/images/Application_ Crytpo-Currency Create Daily Dev v2.ipynb - Colaboratory.html" new file mode 100644--- /dev/null +++ "b/images/Application_ Crytpo-Currency Create Daily Dev v2.ipynb - Colaboratory.html" @@ -0,0 +1,35451 @@ + + +
Double-click (or enter) to edit
+/usr/local/lib/python3.7/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead. + import pandas.util.testing as tm +
1 + 2 + 3 + 4 +utc_now = pytz.utc.localize(datetime.utcnow())
today = utc_now.astimezone(pytz.timezone("America/Chicago"))
new_today = today.strftime("%m-%d-%Y")
print(today, new_today)
2022-04-10 12:49:41.860788-05:00 04-10-2022 +
1 + 2 + 3 + 4 +!pip install yfinance
import yfinance as yf
Requirement already satisfied: yfinance in /usr/local/lib/python3.7/dist-packages (0.1.70) +Requirement already satisfied: requests>=2.26 in /usr/local/lib/python3.7/dist-packages (from yfinance) (2.27.1) +Requirement already satisfied: numpy>=1.15 in /usr/local/lib/python3.7/dist-packages (from yfinance) (1.21.5) +Requirement already satisfied: pandas>=0.24.0 in /usr/local/lib/python3.7/dist-packages (from yfinance) (1.3.5) +Requirement already satisfied: multitasking>=0.0.7 in /usr/local/lib/python3.7/dist-packages (from yfinance) (0.0.10) +Requirement already satisfied: lxml>=4.5.1 in /usr/local/lib/python3.7/dist-packages (from yfinance) (4.8.0) +Requirement already satisfied: pytz>=2017.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24.0->yfinance) (2018.9) +Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas>=0.24.0->yfinance) (2.8.2) +Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas>=0.24.0->yfinance) (1.15.0) +Requirement already satisfied: urllib3<1.27,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26->yfinance) (1.24.3) +Requirement already satisfied: idna<4,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26->yfinance) (2.10) +Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26->yfinance) (2021.10.8) +Requirement already satisfied: charset-normalizer~=2.0.0 in /usr/local/lib/python3.7/dist-packages (from requests>=2.26->yfinance) (2.0.12) +
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 +##############################################
# Use this code to read and write coins to DB from Google Sheets
##############################################
from google.colab import auth
auth.authenticate_user()
print('Google Authenticated')
# ##############################################
# # read in historical data previously created #
# ##############################################
# Here the data is stored in G drive and then written to BQ
# Only run this if needed
# drive.mount('/content/drive')
# coinsDF = pd.read_excel("drive/My Drive/Data/coinbase_coins.xlsx")
# drive.flush_and_unmount()
# ############################
# # Write to BigQuery
# # Run this only write new coins file to G drive
# ############################
# table_id = 'my_dataset.coinbase_coins'
# coinsDF.to_gbq(table_id, project_id = 'sports-betting1', if_exists = 'replace')
Google Authenticated +
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 +# variable_name = "" #@param [""]
###########################
# Let's test a form field #
###########################
# import ipywidgets as widgets
# fruit_list = coinbase_coins['Coin']
# fruit_picker = widgets.Dropdown(options=fruit_list)
# fruit_picker
# fruit_picker.value
1 +## fruit_picker.value
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 +##############################################
# read in coins from DB
##############################################
# %%bigquery --project sports-betting1 coinbase_coins
%%bigquery --project crypto1-307915 coinbase_coins
SELECT
*
# FROM `my_dataset.coinbase_coins`
FROM `my_dataset.coins`
--order by Coin asc
1 +coinbase_coins['Coin']
0 TBTC +1 KRL +2 IDEX +3 KNC +4 BAND +5 TRU +6 SYN +7 CTSI +8 WBTC +9 OGN +10 CTX +11 ICP +12 ARPA +13 COVAL +14 LOOM +15 ZEN +16 BOND +17 CLV +18 XRP +19 CRO +20 LCX +21 RLY +22 AGLD +23 PRO +24 DASH +25 IMX +26 COMP +27 NKN +28 PERP +29 ORN +30 DDX +31 LTC +32 UNI +33 FOX +34 BTC +35 APE +36 MKR +37 CVC +38 MASK +39 ASM +40 GFI +41 FIDA +42 QNT +43 IOTX +44 CGLD +45 SUPER +46 AMP +47 CHZ +48 FARM +49 RGT +50 USDC +51 BNT +52 BAT +53 LQTY +54 RAI +55 SHIB +56 TRAC +57 GODS +58 SNX +59 AXS +60 REN +61 MANA +62 SOL +63 UPI +64 SPELL +65 BCH +66 CRV +67 BADGER +68 TRIBE +69 ALICE +70 DOGE +71 STX +72 ENJ +73 PAX +74 PLA +75 ADA +76 RBN +77 REQ +78 OXT +79 ETH +80 FORTH +81 PLU +82 JASMY +83 UST +84 USDT +85 FIL +86 STORJ +87 ERN +88 GTC +89 SHPING +90 UNFI +91 COTI +92 RARI +93 SUKU +94 MUSD +95 MDT +96 MATIC +97 BICO +98 ZRX +99 ACH +100 BAL +101 AAVE +102 ANKR +103 XLM +104 LPT +105 AVT +106 AUCTION +107 FX +108 GYEN +109 DIA +110 SUSHI +111 BTRST +112 REP +113 XYO +114 AVAX +115 DOT +116 ZEC +117 GRT +118 OMG +119 AERGO +120 FET +121 ATOM +122 WCFG +123 CRPT +124 YFI +125 YFII +126 DNT +127 POWR +128 NMR +129 MIR +130 EOS +131 UMA +132 KEEP +133 BLZ +134 TRB +135 LRC +136 QUICK +137 MPL +138 SNT +139 ALGO +140 ETC +141 POLS +142 NU +143 NCT +144 MINA +145 MCO2 +146 INV +147 RNDR +148 API3 +149 ORCA +150 QSP +151 DAI +152 GALA +153 SKL +154 RAD +155 VGX +156 POLY +157 RLC +158 GLM +159 WLUNA +160 1INCH +161 ENS +162 GNT +163 MLN +164 HIGH +165 LINK +166 DESO +167 XTZ +168 ALCX +169 AIOZ +Name: Coin, dtype: object
1 + 2 +# from google.colab import drive
# drive.mount('/content/drive')
1 + 2 + 3 + 4 + 5 + 6 +# coinbase_coins.iloc[0,0]
# test_coin = (str(fruit_picker.value) + '-' + str('USD'))
# # test_coin = ('SHIB' + '-' + str('USD'))
# test_coin
1 + 2 +# tmp = yf.download(tickers=test_coin, period = '90d', interval = '1d')
# tmp
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 +########################
# test a single ticker #
########################
# tmp = yf.download(tickers=test_coin, period = '90d', interval = '1d')
# tmp.reset_index(inplace=True)
# # pd.datetime(np.where(tmp['Date'] > (datetime.today() - timedelta(days = 1)), datetime.today(), tmp['Date']))
# # tmp
# tmp.loc[tmp['Date'] > (datetime.today() - timedelta(days = 1)),'Date'] = (datetime.today() - timedelta(days = 1)).strftime('%Y-%m-%d 00:00:00')
# # (datetime.today() - timedelta(days = 1)).strftime('%Y-%m-%d')
# ## tmp.set_index('Date', inplace = True)
# tmp.set_index(pd.to_datetime(tmp['Date']), inplace = True)
# tmp.drop(columns = ['Date', inplace = True)
# tmp
########################
# Hourly data
########################
# tmp = yf.download(tickers=test_coin, period = '24h', interval = '30m', progress = True)
# .sort_values(ascending = False, by = 'Datetime')
# tmp = (yf.download(tickers=(str(coinbase_coins.iloc[x, 0]) + '-' + str('USD')), period = '72h', interval = '1h', progress=False))
# tmp = tmp[tmp['Volume'] != 0].tail(1)
## tmp.reset_index(inplace=True)
# tmp
1 + 2 + 3 + 4 + 5 +# Reset datetime
# utc_now = pytz.utc.localize(datetime.utcnow())
# today = utc_now.astimezone(pytz.timezone("America/Chicago"))
# new_today = today.strftime("%m-%d-%Y")
# print(today, new_today)
1 + 2 +# pd.DatetimeIndex
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 +############################
# here we take in UTC time and convert to local time
############################
# tmp.set_index(pd.DatetimeIndex(tmp['Datetime'])).tz_convert('US/Central')
# plt.figure(figsize=(16,8))
# plt.plot(tmp['Datetime'], tmp['Adj Close'])
# plt.xticks(rotation = 90)
# plt.grid()
# plt.show()
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +# from vega_datasets import data
# stocks = data.stocks()
# import altair as alt
# alt.Chart(tmp).mark_line().encode(
# x='Datetime:T',
# y='Adj Close'
# ).interactive(bind_y=True)
1 + 2 + 3 +# tmp['Date'] = pd.DatetimeIndex(tmp['Datetime'])
# tmp = tmp.set_index(tmp['Date']).tz_convert('US/Central')
# tmp.drop(['Datetime', 'Date'], axis = 1)
1 +# tmp.head()
1 +# tmp.shape
1 + 2 +# tmp2 = tmp[['Open', 'High', 'Low', 'Close']]
1 +# tmp3 = (tmp2).diff(1).dropna()
1 +# tmp3.tail()
1 +# tmp3_var = VAR(tmp3, freq='-30T')
1 +# (tmp3_var.fit(5)).summary()
1 +#tmp3_results = tmp3_var.fit(5)
1 +#tmp3.values[-1:]
1 +#pd.DataFrame(tmp3_results.forecast(tmp3.values[-5:], 2))
1 + 2 + 3 +# pull min/max CST + 30 min
#(tmp['Date'].min()).astimezone(pytz.timezone("America/Chicago")) + timedelta(minutes = 30)
2022-04-10 12:50:58.623903-05:00 04-10-2022 +
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 +# (tmp.index).apply(pytz.utc.localize)
# df15['Type of day'] = np.where(df15.index.weekday > 5, "Weekend", "Working Day")
# tmp['Type of day'] =
# np.where(tmp.index > (datetime.today() - timedelta(days = 0)), datetime.today(), tmp.index)
# tmp[tmp.index > datetime.today()].index = datetime.today()
1 +#tmp.reset_index(inplace=True)
1 +#tmp.dtypes
1 +# tmp[tmp.index > datetime.today()].index
1 +# coinbase_coins.shape
1 +# coinbase_coins.iloc[1, 0]
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 +dfOut = []
dfOut = pd.DataFrame()
for x in range(len(coinbase_coins)):
# print(coinbase_coins.iloc[x, 0])
# print(coinbase_coins.iloc[x, 0])
########################
# Hourly data
########################
## tmp = (yf.download(tickers=(str(coinbase_coins.iloc[x, 0]) + '-' + str('USD')), period = '72h', interval = '1h', progress=False))
## tmp = tmp[tmp['Volume'] != 0].tail(1)
########################
# Daily Data
########################
# tmp = (yf.download(tickers=(str(coinbase_coins.iloc[x, 0]) + '-' + str('USD')), period = '24h', interval = '30m', progress = False))
tmp = (yf.download(tickers=(str(coinbase_coins.iloc[x, 0]) + '-' + str('USD')), period = '180d', interval = '1d', progress=False))
tmp = tmp[tmp['Volume'] != 0]
# print(tmp)
###########################
# Clean up data alignment #
###########################
# tmp.reset_index(inplace=True)
# tmp.loc[tmp['Date'] > (datetime.today() - timedelta(days = 1)),'Date'] = (datetime.today() - timedelta(days = 1)).strftime('%Y-%m-%d 00:00:00')
# tmp.set_index(pd.to_datetime(tmp['Date']), inplace = True)
# tmp.drop(columns = ['Date'], inplace = True)
###########################
###########################
# print(tmp.shape)
tmp['Coin'] = coinbase_coins.iloc[x, 0]
if (tmp.shape[0] != 0):
print(coinbase_coins.iloc[x, 0])
dfOut = dfOut.append(tmp)
print(dfOut.shape)
# dfOut = dfOut.append(tmp)
TBTC +(180, 7) +KRL +(360, 7) +IDEX +(540, 7) +KNC +(720, 7) +BAND +(900, 7) +TRU +(1080, 7) +
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:34: SettingWithCopyWarning: +A value is trying to be set on a copy of a slice from a DataFrame. +Try using .loc[row_indexer,col_indexer] = value instead + +See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy +
SYN +(1172, 7) +CTSI +(1352, 7) +WBTC +(1532, 7) +OGN +(1712, 7) +CTX +(1892, 7) +ICP +(1893, 7) +ARPA +(2005, 7) +COVAL +(2185, 7) +LOOM +(2365, 7) +ZEN +(2545, 7) +BOND +(2725, 7) +CLV +(2905, 7) +XRP +(3085, 7) +CRO +(3265, 7) +LCX +(3445, 7) +RLY +(3625, 7) +AGLD +(3805, 7) +PRO +(3985, 7) +DASH +(4165, 7) +IMX +(4343, 7) +COMP +(4432, 7) +NKN +(4612, 7) +PERP +(4792, 7) +ORN +(4972, 7) +DDX +(5152, 7) +LTC +(5332, 7) +UNI +(5511, 7) +FOX +(5691, 7) +BTC +(5871, 7) +APE +(6042, 7) +MKR +(6222, 7) +CVC +(6402, 7) +MASK +(6462, 7) +ASM +(6642, 7) +GFI +(6643, 7) +FIDA +(6751, 7) +QNT +(6931, 7) +IOTX +(7111, 7) + +1 Failed download: +- CGLD-USD: No data found, symbol may be delisted +SUPER +(7145, 7) +AMP +(7325, 7) +CHZ +(7480, 7) +FARM +(7660, 7) +RGT +(7840, 7) +USDC +(8020, 7) +BNT +(8200, 7) +BAT +(8380, 7) +LQTY +(8560, 7) +RAI +(8740, 7) +SHIB +(8920, 7) +TRAC +(9100, 7) +GODS +(9264, 7) +SNX +(9444, 7) +AXS +(9624, 7) +REN +(9804, 7) +MANA +(9984, 7) +SOL +(10164, 7) +UPI +(10344, 7) +SPELL +(10524, 7) +BCH +(10704, 7) +CRV +(10884, 7) +BADGER +(11064, 7) +TRIBE +(11244, 7) +ALICE +(11424, 7) +DOGE +(11604, 7) +STX +(11784, 7) +ENJ +(11964, 7) + +1 Failed download: +- PAX-USD: No data found, symbol may be delisted +PLA +(12144, 7) +ADA +(12324, 7) +RBN +(12504, 7) +REQ +(12684, 7) +OXT +(12864, 7) +ETH +(13044, 7) +FORTH +(13224, 7) +PLU +(13404, 7) +JASMY +(13584, 7) +UST +(13764, 7) +USDT +(13944, 7) +FIL +(14124, 7) +STORJ +(14304, 7) +ERN +(14484, 7) +GTC +(14664, 7) +SHPING +(14844, 7) +UNFI +(15024, 7) +COTI +(15204, 7) +RARI +(15384, 7) +SUKU +(15564, 7) +MUSD +(15742, 7) +MDT +(15922, 7) +MATIC +(16102, 7) +BICO +(16233, 7) +ZRX +(16413, 7) +ACH +(16593, 7) +BAL +(16773, 7) +AAVE +(16953, 7) +ANKR +(17133, 7) +XLM +(17313, 7) +LPT +(17493, 7) +AVT +(17668, 7) +AUCTION +(17848, 7) +FX +(18028, 7) +GYEN +(18208, 7) +DIA +(18388, 7) +SUSHI +(18568, 7) +BTRST +(18748, 7) +REP +(18928, 7) +XYO +(19108, 7) +AVAX +(19288, 7) +DOT +(19410, 7) +ZEC +(19590, 7) +GRT +(19761, 7) +OMG +(19935, 7) +AERGO +(20115, 7) +FET +(20295, 7) +ATOM +(20475, 7) +WCFG +(20655, 7) +CRPT +(20835, 7) +YFI +(21015, 7) +YFII +(21195, 7) +DNT +(21375, 7) +POWR +(21555, 7) +NMR +(21735, 7) +MIR +(21915, 7) +EOS +(22095, 7) +UMA +(22275, 7) +KEEP +(22455, 7) +BLZ +(22635, 7) +TRB +(22815, 7) +LRC +(22995, 7) +QUICK +(23175, 7) +MPL +(23355, 7) +SNT +(23535, 7) +ALGO +(23636, 7) +ETC +(23816, 7) +POLS +(23996, 7) +NU +(24176, 7) +NCT +(24356, 7) +MINA +(24536, 7) +MCO2 +(24716, 7) +INV +(24896, 7) +RNDR +(25076, 7) +API3 +(25256, 7) +ORCA +(25436, 7) +QSP +(25616, 7) +DAI +(25796, 7) +GALA +(25797, 7) +SKL +(25977, 7) +RAD +(26157, 7) +VGX +(26337, 7) +POLY +(26517, 7) +RLC +(26697, 7) +GLM +(26877, 7) +WLUNA +(27057, 7) +1INCH +(27237, 7) +ENS +(27390, 7) +GNT +(27570, 7) +MLN +(27750, 7) +HIGH +(27929, 7) +LINK +(28109, 7) +DESO +(28110, 7) +XTZ +(28290, 7) +ALCX +(28470, 7) +AIOZ +(28650, 7) +
1 + 2 +dfOut.tail()
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +##########################
# make dates locak #
##########################
# dfOut.reset_index(inplace=True)
# dfOut['Date'] = pd.DatetimeIndex(dfOut['Datetime'])
# dfOut = dfOut.set_index(dfOut['Date']).tz_convert('US/Central')
# dfOut.drop(['Datetime', 'Date'], axis = 1, inplace=True)
1 +dfOut[dfOut['Coin'] == 'ADA'].tail()
1 +dfOut.tail()
1 +dfOut['Coin'].unique()
array(['TBTC', 'KRL', 'IDEX', 'KNC', 'BAND', 'TRU', 'SYN', 'CTSI', 'WBTC', + 'OGN', 'CTX', 'ICP', 'ARPA', 'COVAL', 'LOOM', 'ZEN', 'BOND', 'CLV', + 'XRP', 'CRO', 'LCX', 'RLY', 'AGLD', 'PRO', 'DASH', 'IMX', 'COMP', + 'NKN', 'PERP', 'ORN', 'DDX', 'LTC', 'UNI', 'FOX', 'BTC', 'APE', + 'MKR', 'CVC', 'MASK', 'ASM', 'GFI', 'FIDA', 'QNT', 'IOTX', 'SUPER', + 'AMP', 'CHZ', 'FARM', 'RGT', 'USDC', 'BNT', 'BAT', 'LQTY', 'RAI', + 'SHIB', 'TRAC', 'GODS', 'SNX', 'AXS', 'REN', 'MANA', 'SOL', 'UPI', + 'SPELL', 'BCH', 'CRV', 'BADGER', 'TRIBE', 'ALICE', 'DOGE', 'STX', + 'ENJ', 'PLA', 'ADA', 'RBN', 'REQ', 'OXT', 'ETH', 'FORTH', 'PLU', + 'JASMY', 'UST', 'USDT', 'FIL', 'STORJ', 'ERN', 'GTC', 'SHPING', + 'UNFI', 'COTI', 'RARI', 'SUKU', 'MUSD', 'MDT', 'MATIC', 'BICO', + 'ZRX', 'ACH', 'BAL', 'AAVE', 'ANKR', 'XLM', 'LPT', 'AVT', + 'AUCTION', 'FX', 'GYEN', 'DIA', 'SUSHI', 'BTRST', 'REP', 'XYO', + 'AVAX', 'DOT', 'ZEC', 'GRT', 'OMG', 'AERGO', 'FET', 'ATOM', 'WCFG', + 'CRPT', 'YFI', 'YFII', 'DNT', 'POWR', 'NMR', 'MIR', 'EOS', 'UMA', + 'KEEP', 'BLZ', 'TRB', 'LRC', 'QUICK', 'MPL', 'SNT', 'ALGO', 'ETC', + 'POLS', 'NU', 'NCT', 'MINA', 'MCO2', 'INV', 'RNDR', 'API3', 'ORCA', + 'QSP', 'DAI', 'GALA', 'SKL', 'RAD', 'VGX', 'POLY', 'RLC', 'GLM', + 'WLUNA', '1INCH', 'ENS', 'GNT', 'MLN', 'HIGH', 'LINK', 'DESO', + 'XTZ', 'ALCX', 'AIOZ'], dtype=object)
1 +dfOut[dfOut['Coin'] == 'ADA'].tail()
1 +# dfOut.loc[:,'Coin'].head()
1 + 2 + 3 +# Reference Date
## datetime.now() - timedelta(days = (120 + 0))
1 + 2 + 3 + 4 +# Max Date
## datetime.now() - timedelta(days = 0)
1 + 2 + 3 + 4 +# Min Date
## datetime.now() - timedelta(days = (0 - 1))
1 + 2 + 3 + 4 + 5 + 6 + 7 +###################################################
# Need logic to handle date changes in data
###################################################
## dfOut[dfOut['Coin'] == 'ADA']['Date'].max() > date.today()
1 + 2 + 3 +# dfOut[dfOut['Coin'] == 'ADA'][(dfOut[dfOut['Coin'] == 'ADA']['Date'] >= (datetime.now() - timedelta(days = (120 + 0)))) & (dfOut[dfOut['Coin'] == 'ADA']['Date'] < (datetime.now() - timedelta(days = 0)))]
# dfOut[dfOut['Coin'] == 'KNC']
1 +(datetime.today() - timedelta(days = 1))
datetime.datetime(2022, 4, 9, 17, 54, 34, 110184)
1 + 2 + 3 + 4 + 5 + 6 +#############################
# address time difference
#############################
## dfOut[dfOut['Date'] > (datetime.today() - timedelta(hours = 5))]['Date'] = (datetime.today() - timedelta(days = 1))
1 +dfOut[dfOut['Date'] > (datetime.today() - timedelta(hours = 5))]['Date']
Series([], Name: Date, dtype: datetime64[ns])
1 +# dfOut[(dfOut['Coin'].isin(['BTC', 'ADA', 'MATIC', 'STORJ', 'XLM']))]
1 + 2 +# dfOut[dfOut['Date'] > datetime.today().strftime('%Y-%m-%d')]
# datetime.today().strftime('%Y-%m-%d')
1 +# dfOut[dfOut['Date'] == dfOut['Date'].max()]
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12 + 13 + 14 + 15 + 16 + 17 + 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + 26 + 27 + 28 + 29 + 30 + 31 + 32 + 33 + 34 + 35 + 36 + 37 + 38 + 39 + 40 + 41 + 42 + 43 + 44 + 45 + 46 + 47 + 48 + 49 + 50 + 51 + 52 + 53 + 54 + 55 + 56 + 57 + 58 + 59 + 60 + 61 + 62 + 63 + 64 + 65 + 66 + 67 + 68 + 69 + 70 + 71 + 72 + 73 + 74 + 75 + 76 + 77 + 78 + 79 + 80 + 81 + 82 + 83 + 84 + 85 + 86 + 87 + 88 + 89 + 90 + 91 + 92 + 93 + 94 + 95 + 96 + 97 + 98 + 99 +100 +101 +102 +103 +104 +105 +106 +107 +108 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +122 +123 +124 +125 +126 +127 +128 +129 +130 +131 +132 +133 +134 +135 +136 +137 +138 +139 +140 +141 +142 +143 +144 +145 +146 +147 +148 +149 +150 +151 +152 +153 +154 +155 +156 +157 +158 +159 +160 +161 +162 +163 +164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +###########################
# assume long data
###########################
def get_sim(inputData, histDays, backcastDays, numLags, forecastDays):
resultsOut = pd.DataFrame()
tmp = []
###########################
# Loop over backcast days
###########################
for day in range(backcastDays):
print(day)
###########################
# partition data by last X days
# and previous Y days
###########################
ref_date = datetime.now() - timedelta(days = (histDays + day))
print("Reference Date:" )
print(ref_date)
max_date = datetime.now() - timedelta(days = day)
print("Max Date:")
print(max_date)
###############################
#
# IMPORTANT!!
#
###############################
fcst_date = datetime.now() - timedelta(days = (day - 1))
## fcst_date = datetime.now() - timedelta(days = (day))
print("Forecast Date:")
print(fcst_date)
# max_date = pd.Timestamp('now').floor('D')
# + pd.Timedelta(-1, unit='D')
#################################
# Take last Z days
# loop over backCast days
#################################
tmp = inputData[(inputData['Date'] >= ref_date) & (inputData['Date'] < max_date)]
print("Observed Min Date:")
print(tmp['Date'].min())
print("Observed Max Date:")
print(tmp['Date'].max())
tmp = tmp.set_index(['Date'])
#################################
# Loop over Coins
#################################
for coin in inputData['Coin'].unique():
print(coin)
###########################
# ETL long data to wide
# add Log(Volume)
###########################
mytmp = tmp[tmp['Coin'] == coin]
# yf.download(tickers='DOGE-USD', period = '90d', interval = '1d')
## print(mytmp.head(), mytmp.tail())
myBTC = tmp[tmp['Coin'] == 'BTC']
myBTC.columns = ('BTC-' + myBTC.columns)
mytmp2 = mytmp.merge(myBTC, how = 'left', on='Date')
mytmp2['logVolume'] = np.log(mytmp2.loc[:, 'Volume'])
mytmp2['BTC-logVolume'] = np.log(mytmp2.loc[:, 'BTC-Volume'])
# print(mytmp2)
# yf.download(tickers='BTC-USD', period = '90d', interval = '1d')
# tmp1 = tmp[tmp['Coin'] == coin]
# tmp2 = tmp1.pivot_table(index=['Date', 'Coin'], columns=['Variable'], values='Value').reset_index()
# mytmp2 = mytmp2.set_index(['Date'])
# tmp2 = tmp2.sort_values(['Coin', 'Date'], ascending = True)
# tmp2['logVolume'] = np.log(tmp2.loc[:,'5. volume'])
###########################
# Create Daily High-Low Diff
###########################
mytmp2['dailyHighLow'] = mytmp2['High'] - mytmp2['Low']
# mytmp2_use = mytmp2[['Open', 'High', 'Low', 'Close', 'Adj Close', 'BTC-Open', 'BTC-High', 'BTC-Low', 'BTC-Close', 'BTC-Adj Close', 'logVolume', 'BTC-logVolume', 'dailyHighLow']]
mytmp2_use = mytmp2[['Open', 'High', 'Low', 'Close', 'logVolume', 'dailyHighLow', 'BTC-Close', 'BTC-logVolume']]
# print((mytmp2_use.shape))
if mytmp2_use.shape[0] > 9:
# tmp2_out = tmp2[['1b. open (USD)', '2b. high (USD)', '3b. low (USD)', '4b. close (USD)', 'logVolume', 'Coin']]
#########################
# Remove Closing Price. Lag1Close = Lag0Open
#########################
# tmp2_use = tmp2[['1b. open (USD)', '2b. high (USD)', '3b. low (USD)', 'logVolume', 'dailyHighLow']]
# tmp2_out = tmp2[['1b. open (USD)', '2b. high (USD)', '3b. low (USD)', 'logVolume', 'dailyHighLow', 'Coin']]
# print(tmp2_out.tail())
# print(tmp['Date'].max())
# print(mytmp2_use.head(), mytmp2_use.tail())
###################################
# compute changes
###################################
data_ret = (mytmp2_use).diff(1).dropna()
# data_ret = data_ret.set_index(['Date'])
# print(data_ret.head())
# print(data_ret.head(), data_ret.tail())
# print(data_ret.info(verbose=True))
###################################
# construct model
###################################
model = VAR(data_ret, freq='D')
# print(data_ret)
###################################
# Fit model using 8 lags
###################################
results = model.fit(numLags)
# print(results.summary())
###########################
# append forecast
###########################
mytmp2_use_fcst = pd.DataFrame(results.forecast(data_ret.values[-numLags:], forecastDays))
mytmp2_use_fcst.columns = mytmp2_use.columns
mytmp2_use_fcst['Coin'] = coin
mytmp2_use_fcst['Date'] = (fcst_date).strftime('%Y-%m-%d')
# print((datetime.datetime.now() + datetime.timedelta(day)).strftime('%Y-%m-%d'))
mytmp2_use_fcst = mytmp2_use_fcst.set_index(['Date'])
# tmp2_out = data_ret.append(tmp2_use_fcst, ignore_index = False)
# print(tmp2_use_fcst)
resultsOut = resultsOut.append(mytmp2_use_fcst, ignore_index = False)
# # print(resultsOut)
# resultsOut.columns = ['TS', 'P', 'Variable', 'Coin', 'prev30dayAvg', 'prior30dayAvg']
return resultsOut
1 +myfcasts[myfcasts['Coin'] == 'ADA'].sort_values(by=['Coin', 'Date']).tail()
1 +dfOut.set_index('Date', inplace=True)
1 +dfOut[dfOut['Coin'] == 'ADA'].tail()
1 +myfcasts[myfcasts['Coin'] == 'ADA'].head()
1 + 2 + 3 +# data_in_long['nextDate'] =
# myfcasts.reset_index(inplace=True)
# (myfcasts['Date'] - timedelta(days = (-1)))
1 +myfcasts.reset_index(inplace=True)
1 +myfcasts['Date'] = pd.to_datetime(myfcasts['Date'])
1 +myfcasts.head()
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +##############################
# IMPORTANT!!
# reset Forecast Date to Today
##############################
myfcasts['priorDate'] = (myfcasts['Date'] - timedelta(days = (1)))
## myfcasts['priorDate'] = (myfcasts['Date'] - timedelta(days = (0)))
1 +myfcasts.head()
1 + 2 +myfcasts.rename(columns={"Date": "Forecast Date", "priorDate": "Date"}, inplace=True)
1 + 2 + 3 + 4 + 5 + 6 +##############################
# the fcasts data output
##############################
myfcasts.head()
1 + 2 + 3 + 4 + 5 + 6 +##############################
# go back to original data.
##############################
dfOut.tail()
1 + 2 +dfOut.dtypes
Open float64 +High float64 +Low float64 +Close float64 +Adj Close float64 +Volume int64 +Coin object +dtype: object
1 + 2 +dfOut.info(verbose=True)
<class 'pandas.core.frame.DataFrame'> +DatetimeIndex: 10577 entries, 2021-05-09 to 2021-11-04 +Data columns (total 7 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 Open 10577 non-null float64 + 1 High 10577 non-null float64 + 2 Low 10577 non-null float64 + 3 Close 10577 non-null float64 + 4 Adj Close 10577 non-null float64 + 5 Volume 10577 non-null int64 + 6 Coin 10577 non-null object +dtypes: float64(5), int64(1), object(1) +memory usage: 661.1+ KB +
1 + 2 +myfcasts.info(verbose=True)
<class 'pandas.core.frame.DataFrame'> +DatetimeIndex: 1530 entries, 2021-11-04 to 2021-10-06 +Data columns (total 10 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 Forecast Date 1530 non-null datetime64[ns] + 1 Open 1530 non-null float64 + 2 High 1530 non-null float64 + 3 Low 1530 non-null float64 + 4 Close 1530 non-null float64 + 5 logVolume 1530 non-null float64 + 6 dailyHighLow 1530 non-null float64 + 7 BTC-Close 1530 non-null float64 + 8 BTC-logVolume 1530 non-null float64 + 9 Coin 1530 non-null object +dtypes: datetime64[ns](1), float64(8), object(1) +memory usage: 131.5+ KB +
1 +# dfOut['Coin']
1 +dfOut.columns = ('Actual: ' + dfOut.columns)
1 +dfOut.rename(columns={"Actual: Coin": "Coin"}, inplace=True)
1 +dfOut[dfOut['Coin'] == 'ADA'].tail()
1 + 2 +final_output = myfcasts.merge(dfOut, how='left', on=('Date', 'Coin'), )
1 + 2 + 3 + 4 + 5 + 6 +###############################
# QA this mudder
###############################
final_output[final_output['Coin'] == 'ADA'].head(10)
1 + 2 +final_output.reset_index(inplace=True)
1 + 2 +final_output.info(verbose=True)
<class 'pandas.core.frame.DataFrame'> +RangeIndex: 1530 entries, 0 to 1529 +Data columns (total 17 columns): + # Column Non-Null Count Dtype +--- ------ -------------- ----- + 0 Date 1530 non-null datetime64[ns] + 1 Forecast Date 1530 non-null datetime64[ns] + 2 Open 1530 non-null float64 + 3 High 1530 non-null float64 + 4 Low 1530 non-null float64 + 5 Close 1530 non-null float64 + 6 logVolume 1530 non-null float64 + 7 dailyHighLow 1530 non-null float64 + 8 BTC-Close 1530 non-null float64 + 9 BTC-logVolume 1530 non-null float64 + 10 Coin 1530 non-null object + 11 Actual: Open 1530 non-null float64 + 12 Actual: High 1530 non-null float64 + 13 Actual: Low 1530 non-null float64 + 14 Actual: Close 1530 non-null float64 + 15 Actual: Adj Close 1530 non-null float64 + 16 Actual: Volume 1530 non-null int64 +dtypes: datetime64[ns](2), float64(13), int64(1), object(1) +memory usage: 203.3+ KB +
1 + 2 + 3 + 4 + 5 + 6 +####################
# format column names
####################
final_output.columns = final_output.columns.str.replace('[#,@,&,:, ,-]', '_')
1 +final_output.columns
Index(['Date', 'Forecast_Date', 'Open', 'High', 'Low', 'Close', 'logVolume', + 'dailyHighLow', 'BTC_Close', 'BTC_logVolume', 'Coin', 'Actual__Open', + 'Actual__High', 'Actual__Low', 'Actual__Close', 'Actual__Adj_Close', + 'Actual__Volume'], + dtype='object')
1 + 2 + 3 + 4 + 5 + 6 +##############################
# paste previous day price
##############################
dfOut[dfOut['Coin'] == 'ADA'].sort_values(by = 'Date', ascending = False).head(10)
1 +tmpdfOut = dfOut.reset_index()
1 + 2 +tmpdfOut_lag1.rename(columns={"priorDate": "Date", "Actual: Close": "Tomorrow_Close", }, inplace=True)
/usr/local/lib/python3.7/dist-packages/pandas/core/frame.py:4308: SettingWithCopyWarning: +A value is trying to be set on a copy of a slice from a DataFrame + +See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy + errors=errors, +
1 +tmpdfOut_lag1[tmpdfOut_lag1['Coin'] == 'ADA'].tail()
1 +final_output[final_output['Coin'] == 'ADA'].head()
1 + 2 + 3 + 4 + 5 + 6 +##############################
# extract only necessary data
##############################
tmpfcast = final_output[['Coin', 'Date', 'Actual__Close', 'Forecast_Date', 'Close']]
1 +tmpfcast[tmpfcast['Coin'] == 'ADA'].head()
1 + 2 + 3 +
tmpfcast['Close Price'] = tmpfcast['Actual__Close'] + tmpfcast['Close']
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:2: SettingWithCopyWarning: +A value is trying to be set on a copy of a slice from a DataFrame. +Try using .loc[row_indexer,col_indexer] = value instead + +See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy + +
1 + 2 + 3 + 4 + 5 + 6 + 7 +# WRONG
# tmpfcast['Miss'] = tmpfcast['Close Price'] - tmpfcast['Actual__Close']
# .sort_values(['Coin', 'Date'], ascending = False).head(30)
tmpfcast.sort_values(['Coin', 'Date'], ascending = False).head(10)
1 + 2 +tmpfcast[tmpfcast['Coin'] == 'ADA'].head()
1 + 2 + 3 + 4 + 5 + 6 +#######################
# compare to actuals #
#######################
tmpdfOut_lag1[tmpdfOut_lag1['Coin'] == 'ADA'].tail()
1 + 2 + 3 +#######################################################
#######################################################
1 +tmpfcast2[tmpfcast2['Coin'] == 'ADA'].tail()
1 + 2 +tmpfcast2.rename(columns={"Actual__Close": "Today_Price", "Close": "Forecast_PM", "Close Price": "Forecast_Price", "Tomorrow_Close": "Actual_Price"}, inplace=True)
1 +tmpfcast2.head()
1 + 2 +tmpfcast2['Actual_PM'] = tmpfcast2['Actual_Price'] - tmpfcast2['Today_Price']
1 + 2 + 3 +tmpfcast2 = tmpfcast2[['Coin', 'Date', 'Today_Price', 'Forecast_Date', 'Forecast_PM',
'Forecast_Price', 'Actual_PM', 'Actual_Price']]
1 +tmpfcast2[tmpfcast2['Coin'] == 'ADA'].tail()
1 + 2 + 3 +tmpfcast2['Miss'] = tmpfcast2['Forecast_Price'] - tmpfcast2['Actual_Price']
1 + 2 +tmpfcast2['absMiss'] = abs(tmpfcast2['Miss'])
1 +tmpfcast2[tmpfcast2['Coin'] == 'ADA'].tail()
1 + 2 + 3 + 4 + 5 + 6 +###################
# calc avg abs miss
# calc avg sq miss
###################
(tmpfcast2.groupby('Coin')['absMiss'].mean()).sort_values(ascending = True)
Coin +SHIB 0.000009 +MIR 0.000292 +USDC 0.000403 +USDT 0.000443 +ACH 0.007573 +IOTX 0.008994 +DNT 0.009602 +ANKR 0.010465 +CRO 0.013413 +XLM 0.014450 +DOGE 0.016835 +OXT 0.039436 +FET 0.040219 +NKN 0.040902 +CHZ 0.043270 +COTI 0.043946 +XRP 0.056233 +ZRX 0.077928 +CVC 0.082446 +BAT 0.086313 +LRC 0.100664 +MATIC 0.143131 +ENJ 0.158678 +STORJ 0.171876 +BNT 0.179655 +EOS 0.257915 +RLC 0.300727 +XTZ 0.408985 +BAND 0.419635 +SNX 0.511751 +UMA 0.697998 +OMG 0.966044 +MANA 1.007439 +BAL 1.491386 +REP 1.599674 +LINK 1.618269 +ETC 2.358549 +AVAX 3.691565 +ZEN 4.584268 +FIL 5.512985 +MLN 7.905663 +LTC 8.084823 +ZEC 9.136212 +DASH 11.012556 +QNT 18.729430 +BCH 21.631537 +COMP 22.646309 +MKR 113.445509 +ETH 174.683899 +BTC 1470.787377 +YFI 1740.134741 +Name: absMiss, dtype: float64
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +####################
# write to DB
####################
table_id = 'my_dataset.actuals_forecasts'
tmpfcast2.to_gbq(table_id, project_id = 'crypto1-307915', if_exists = 'replace')
print(datetime.now())
1it [00:02, 2.89s/it]
2021-11-04 23:38:26.026163 +
+
1 +tmpfcast2.head()
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +###############################################
# add section to create multi model output
###############################################
# final_output.dtypes
1 +
1 +# final_output['priorDate'] = (final_output['Date'] - timedelta(days = (1)))
1 +# final_output
1 +# final_output.dtypes
1 + 2 + 3 + 4 +
# final_output[['Coin', 'priorDate', 'Date', 'Actual__Close', 'Forecast_Date', 'Close']].sort_values(['Coin', 'Date'], ascending = False).head(30)
1 +
1 +
1 +
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 +######################
# pull a single ticker
######################
# mytmp = yf.download(tickers='DOGE-USD', period = '48h', interval = '5m')
mytmp = yf.download(tickers='ADA-USD', period = '90d', interval = '1d', tz='CST')
# myBTC = yf.download(tickers='BTC-USD', period = '90d', interval = '1d')
[*********************100%***********************] 1 of 1 completed +
1 +# mytmp = mytmp[mytmp['Volume'] != 0].head()
1 +# mytmp.shape
1 +mytmp.tail()
1 +# myBTC.tail()
1 +# myBTC.columns = ('BTC-' + myBTC.columns)
1 +# myBTC.head()
1 +# mytmp2 = mytmp.merge(myBTC, how = 'left', on='Date')
1 +# mytmp2.head()
1 + 2 +# mytmp2['BTC-Volume'].plot()
# plt.grid()
1 + 2 + 3 +# mytmp2['logVolume'] = np.log(mytmp2.loc[:, 'Volume'])
# mytmp2['BTC-logVolume'] = np.log(mytmp2.loc[:, 'BTC-Volume'])
1 +# mytmp2.head()
1 + 2 +# mytmp2_use = mytmp2[['Open', 'High', 'Low', 'Adj Close', 'logVolume', 'BTC-Open', 'BTC-High', 'BTC-Low', 'BTC-Adj Close', 'BTC-logVolume']]
1 + 2 +# data_ret = (mytmp2_use).diff(1).dropna()
# data_ret = (mytmp).diff(1).dropna()
1 +# data_ret.head()
1 +# data_ret.shape
1 +#data_ret.reset_index(inplace=True)
1 +#data_ret.head()
1 +# data_ret.dtypes
1 +#data_ret.set_index(['Date'], inplace=True)
1 +# data_ret['Adj Close'].plot()
1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 +# model = VAR(data_ret)
###################################
# Fit model using 8 lags
###################################
# results = model.fit(10)
1 +# results.params
1 + 2 + 3 + 4 + 5 + 6 +##################################
# create 1 day head forecast
##################################
# pd.DataFrame(results.forecast(data_ret.values[-10:],1))
1 + 2 + 3 +# tmp.pivot_table(index=['Variable', 'Date'],
# columns='Coin',
# values='Value').reset_index().round(3)
1 +# mytmp[mytmp['Volume'] != 0]
1 +# dfOut
1 +# dfOut2 = pd.concat(dfOut)
1 +# dfOut.shape
1 +# coinbase_coins.iloc[1,0]
1 + 2 + 3 +yf.download(tickers=(str(coinbase_coins.iloc[1,0]) + '-' + str('USD')), period = '2h', interval = '15m', tz = 'CST').tail(5)
1 +# yf.download(tickers=(str('ETC') + '-' + str('USD')), period = '90d', interval = '1d')
1 +
1 +
1 +