After falling as much as 35% from late October levels, Bitcoin (BTC) is likely on the cusp of a dramatic + or – 50% move. BTC has price memory around 6,500, and a break below should take the market to 2018 lows around 3,000. A bounce could result in a 10,000 price print.

I built a Random Forest model using data going back to 2010 to predict future prices over the coming 3, 6, 9, and 12 months. Predicted prices are:

[table id=40 /]

In my view, the use cases of BTC remain speculation and criminal activity. Despite this emotion, up is the more likely near-term path, especially if 6,500 can hold. Speculator markets can continue unabated for a long time. The code for this post can be found at my GitHub under post 66.

Random Forest Model

Given the size of the dataset (a few thousand rows), I opted to build a Random Forest (RF) model as opposed to a neural network. The RF model uses daily BTC data since 2010. Model features are described below:

[table id=37 /]

I employed a standard Random Forest regressor model from scikit-learn. The core code is below. This model was done four times, for each timeframe.

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score, GridSearchCV
from sklearn.preprocessing import MinMaxScaler

labels = np.array(dfr['price'])
features= dfr.drop(['price','data'], axis = 1)
feature_list = list(features.columns)
features = np.array(features)
train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size = 0.25, random_state = 42)

print('Training Features Shape:', train_features.shape)
print('Training Labels Shape:', train_labels.shape)
print('Testing Features Shape:', test_features.shape)
print('Testing Labels Shape:', test_labels.shape)

print('Training Features Shape:', train_features.shape)
print('Training Labels Shape:', train_labels.shape)
print('Testing Features Shape:', test_features.shape)
print('Testing Labels Shape:', test_labels.shape)

#Test
dft = pd.read_csv(path/'Bitcoin - rftest.csv')
dft= dft.drop(['data','price'], axis = 1)
predictions = pd.DataFrame(rf.predict(dft))
predictions

I evaluated feature importance using the following code:

fi = rf.feature_importances_
pd.DataFrame({'Variable':feature_list,
            'Importance':rf.feature_importances_}).sort_values('Importance', ascending=False)

features=feature_list
importances = rf.feature_importances_
indices = np.argsort(importances)
plt.title('Feature Importances')
plt.barh(range(len(indices)), importances[indices], color='b', align='center')
plt.yticks(range(len(indices)), [features[i] for i in indices])
plt.xlabel('Relative Importance')
plt.show()

Perhaps unsurprisingly, Transactions, Total Bitcoins, and Wallets are the most important features determining BTC’s price.

Price Memory

BTC has price memory around 6,500, and a break below should take the market to 2018 lows around 3,000. A bounce could result in a 10,000 price print.

  • From 2/4/118 -2/6/18, BTC fell as much as 27% to 6,048 before bouncing and closing at 7,754, then rising as much as 91% to 11,573
  • Over 127 days from 6/13/18 – 10/17/18, BTC traded below 6,500 69 times and closed below than above that level 46 times
  • On 5/10/19, BTC made a high just short of 6,500. The next day it gapped up above and did not look back for several months
  • Today, BTC traded down to around 6,530 before bouncing up over 7,200

Core Views of Bitcoin

In my view, the use cases of BTC remain speculation and criminal activity. I wrote more about it here in May. Speculator markets can continue unabated for a long time.

[table id=39 /]


Any opinions or forecasts contained herein reflect the personal and subjective judgments and assumptions of the author only. There can be no assurance that developments will transpire as forecasted and actual results will be different. The accuracy of data is not guaranteed but represents the author’s best judgment and can be derived from a variety of sources. The information is subject to change at any time without notice.