Three Strategies for Choosing What Cryptocurrency to Invest in Next

This article by Steven Buchko was originally published at CoinCentral.com

Finding the Next Bitcoin

You’ve probably thought it at one point or another: “I missed the Bitcoin payday. How do I decide what cryptocurrency to invest in now that I know about the market?”

The bad news: It’s unlikely that any other cryptocurrency will see the same astronomical growth that Bitcoin experienced over the last few years, and impossible to predict it.

The good news: There’s still plenty of opportunities to invest in up-and-coming cryptocurrencies that could potentially bring you 10-100x returns. This comes with a heavy note of caution, because as you may know, cryptocurrencies are incredibly volatile. This is not investment advice, and you should gain/lose money on your own research and intuition.

In this article, we’ll go over some basic strategies you can follow when searching for what cryptocurrency to invest in next. We’re focusing on high risk, high reward options here. If you’re looking for general investment tips, you should check out our article on how to build a proper cryptocurrency portfolio instead.

Scour Initial Coin Offerings (ICOs)

Initial Coin Offerings (ICOs) have quickly become the standard for blockchain startups to raise funding for their project. In an ICO, the team hosts a crowdsale in which you purchase tokens that you can use on their platform. You can also trade these tokens in the secondary market (exchanges) after the ICO.

For example, Golem held an ICO to distribute the first GNT tokens. The purpose of these tokens is to purchase computing power in the Golem network, but traders also buy and sell them on exchanges.

Participating in ICOs can be a lucrative trading strategy. If you invested in the NEO crowdsale (at the time the project was called AntShares), your return on investment (ROI) would be ~160,000% currently. Populous, about 5,000%. OmiseGo, around 4,000%. You get the picture.
ICO ROIs

Source: ICOBench

ICO gains do come with the highest amount of risk, though. The majority of ICOs will fail, and already almost half have done so already.

ICO Research

It’s important that you do your due diligence when picking what cryptocurrency to invest in pre-ICO. There are a ton of things to look at when evaluating a cryptocurrency, but the most important attributes are:

Team and advisors – The team should have experience in blockchain technology or at least the industry that they’re targeting. Preferably both. Having reputable advisors is also a strong sign that the ICO could succeed.
Clear problem/solution – The project’s white paper should clearly define what problem the project is aiming to solve and how the cryptocurrency solves it. Make sure it’s not just a document full of marketing BS.
Token distribution – The team should be distributing over fifty percent of the tokens to crowdsale participants if not much, much more. Be hesitant about projects in which the team and advisors keep a significant proportion of tokens.

Other things to take note of are: any notable partnerships, whether the team has already created a product, and the size of the industry they’re targeting. All of these things could lead to a favorable investment.

Check Lesser Known Exchanges

Even if you missed your chance to participate in an interesting ICO, you can still invest once the coin hits exchanges. At this time, there’s often a brief spike followed by an immediate dump as ICO investors look to cash-in on short-term gains. This is a prime opportunity to get coins you’re interested in for ICO-level (or even lower) prices.

Beyond the short post-ICO period, you still have time to invest in a coin before major exchanges begin to list it. Cryptopia and decentralized exchanges such as IDEX are goldmines for these types of coins. The same research strategies mentioned above apply to coins in this category as well.

IDEX Exchange

Search through coins with a small market cap (<$100 million) that haven’t been listed on a large exchange like Binance yet. You can check CoinMarketCap to see which exchanges coins are on. Make sure you research appropriately and find coins that you believe to have solid fundamentals.

Once you’ve found a coin you’re confident in, purchase it, and (this is the hardest part) wait. It could take days, weeks, or even months for your coin to reach a respectable amount of awareness. If you truly believe in the fundamentals of the coin, though, this timeframe shouldn’t matter. Once the coin joins a major exchange, feel free to trade it accordingly.

Time Important Events

Another popular strategy in selecting what cryptocurrency to invest in is to choose coins based on project roadmaps and event calendars. This is a short-term strategy and usually much harder to execute than the other ones that we’ve covered.

The price of cryptocurrency tends to rise after an important partnership announcement or development milestone. If you follow certain projects on Twitter or are active in their Telegram channel, you usually find out about these announcements ahead of the less involved general public.

With that information, you can sometimes buy into a project early and ride the wave up following the announcement. This has some potential downsides, though. Correct timing is incredibly difficult to accomplish. And, in a bear market, even the most impressive announcements can get crushed under the negative sentiment.

Additionally, the rest of the market may not react to the news the way that you expect. A recent example of this is Verge’s PornHub partnership announcement. While some supporters saw this as positive news, the majority of the market didn’t, and the price crashed accordingly.

Stay Vigilant

Most importantly, you just need to stay vigilant when looking for what cryptocurrency to invest in. New investment opportunities occur every day when you’re actively looking for them. Join subreddits, follow crypto traders on Twitter, constantly research new projects – in essence, engulf yourself in the blockchain space. You never know what gems you’ll stumble upon.

How to use a Random Forest classifier in Python using Scikit-Learn

Random Forest is a powerful machine learning algorithm, it can be used as a regressor or as a classifier. It’s a meta estimator, meaning it’s using a specified number of decision trees to fit and predict.

We’re going to use the package Scikit-Learn in Python, it’s a very useful library which contains a lot of machine learning algorithms and related tools.

Data preparation

To see how Random Forest can be applied, we’re going to try to predict the S&P 500 futures (E-Mini), you can get the data for free on Quandl. Here is what it looks like:

Date Open High Low Last Change Settle Volume Previous Day Open Interest
2016-12-30 2246.25 2252.75 2228.0 2233.5 8.75 2236.25 1252004.0 2752438.0
2016-12-29 2245.5 2250.0 2239.5 2246.25 0.25 2245.0 883279.0 2758174.0
2016-12-28 2261.25 2267.5 2243.5 2244.75 15.75 2245.25 976944.0 2744092.0

The column Change needs to be removed since there’s missing data and this information can be retrieved directly by substracting D close and D-1 close.

Since it’s a classifier, we need to create classes for each line: 1 if the future went up today, -1 if it went down or stayed the same.

import numpy as np
import pandas as pd

def computeClassification(actual):
if(actual &amp;gt; 0):
return 1
else:
return -1

data = pd.DataFrame.from_csv(path='EMini.csv', sep=',')

# Compute the daily returns
data['Return'] = (data['Settle']/data ['Settle'].shift(-1)-1)*100

# Delete the last line which contains NaN
data = data.drop(data.tail(1).index)

# Compute the last column (Y) -1 = down, 1 = up
data.iloc[:,len(data.columns)-1] = data.iloc[:,len(data.columns)-1].apply(computeClassification)

Now that we have a complete dataset with a predictable value, the last colum “Return” which is either -1 or 1, let’s create the train and test dataset.

testData = data[-(len(data)/2):] # 2nd half
trainData = data[:-(len(data)/2)] # 1st half

# X is the list of features (Open, High, Low, Settle)
data_X_train = trainData.iloc[:,0:len(trainData.columns)-1]
# Y is the value to be predicted
data_Y_train = trainData.iloc[:,len(trainData.columns)-1]

# Same thing for the test dataset
data_X_test = testData.iloc[:,0:len(testData.columns)-1]
data_Y_test = testData.iloc[:,len(testData.columns)-1]

Using the algorithm

Once we have everything ready we can start fitting the Random Forest classifier against our train dataset:

from sklearn import ensemble

# I picked 100 randomly, we'll see in another post how to find the optimal value for the number of estimators
clf = ensemble.RandomForestClassifier(n_estimators = 100, n_jobs = -1)
clf.fit(data_X_train, data_Y_train)

predictions = clf.predict(data_X_test)

predictions is an array containing the predicted values (-1 or 1) for the features in data_X_test.
You can see the prediction accuracy using the method accuracy_score which compares the predicted values versus the expected ones.

from sklearn.metrics import accuracy_score

print "Score: "+str(accuracy_score(data_Y_test, y_predictions))

What’s next ?

Now for example you can create a trading strategy that goes long the future if the predicted value is 1, and goes short if it’s -1. This can be easily backtested using a backtest engine such as Zipline in Python.
Based on your backtest result you could add or remove features, maybe the volatility or the 5-day moving average can improve the prediction accuracy ?

Using matplotlib to identify trading signals

Finding trading signals is one of the core problems of algorithmic trading, without any good signals your strategy will be useless. This is a very abstract process as you cannot intuitively guess what signals will make your strategy profitable or not, because of that I’m going to explain how you can have at least a visualization of the signals so that you can see if the signals make sense and introduce them in your algorithm.

We’re going to use matplotlib to graph the asset price and add buy/sell signals on the same graph, this way you can see if the signals are generated at the right moment or not: buy low, sell high.

Data preparation

For this tutorial I picked a very simple strategy which is a crossing moving average, the idea is to buy when the “short” moving average, let’s say 5-day is crossing the “long” moving average, let’s say 20-day, and to sell when they cross the other way.

First of all, we need to install matplotlib via the usual pip:

pip install matplotlib

This example requires pandas and matplotlib:

import pandas as pd
import matplotlib.pyplot as plt

I’m using the E-mini future dataset from Quandl, see this article.

Loading data and computing the moving averages is pretty trivial thanks to Pandas:

data = pd.DataFrame.from_csv(path='EMini.csv', sep=',')

# Generate moving averages
data = data.reindex(index=data.index[::-1]) # Reverse for the moving average computation
data['Mavg5'] = data['Settle'].rolling(window=5).mean()
data['Mavg20'] = data['Settle'].rolling(window=20).mean()

Now the actual signal generation part is a bit more tricky:

# Save moving averages for the day before
prev_short_mavg = data['Mavg5'].shift(1)
prev_long_mavg = data['Mavg20'].shift(1)

# Select buying and selling signals: where moving averages cross
buys = data.ix[(data['Mavg5'] &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;= data['Mavg20']) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; (prev_short_mavg &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;= prev_long_mavg)]
sells = data.ix[(data['Mavg5'] &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt;= data['Mavg20']) &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;amp; (prev_short_mavg &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;= prev_long_mavg)]

buys and sells is now containing all dates where we have a signal.

Plotting the signals

The interesting part is the graphing of this, the syntax is simple:

plt.plot(X, Y)

We want to display the E-Mini price and the moving averages is pretty simple, we use data.index because the dates in the DataFrame are in the index:

# The label parameter is useful for the legend
plt.plot(data.index, data['Settle'], label='E-Mini future price')
plt.plot(data.index, data['Mavg5'], label='5-day moving average')
plt.plot(data.index, data['Mavg20'], label='20-day moving average')

But for the signals, we want to put each marker at the specific date, which is in the index, and at the E-Mini price level so that visually it’s not too confusing:

plt.plot(buys.index, data.ix[buys.index]['Settle'], '^', markersize=10, color='g')
plt.plot(sells.index, data.ix[sells.index]['Settle'], 'v', markersize=10, color='r')

data.ix[buys.index][‘Settle’] means we take the ‘Settle’ field in the data DataFrame

plt.ylabel('E-Mini future price')
plt.xlabel('Date')
plt.legend(loc=0)
plt.show()

Here is the final result:

Conclusion

In conclusion, you can interpret this by noticing that most buying signals are at dips in the curve and selling signals are at local maximums. So our signal generation looks promising, however without a real backtest we cannot be sure that the strategy will be profitable, at least we can validate or not a signal.
The main advantage of this method is that we can instantly see if the signals are “right” or not, for example you can play with the short and long moving average, you could try 10-day versus 30-day etc. and in the end you can pick the right parameters for this signal.

Create a trading strategy from scratch in Python

To show you the full process of creating a trading strategy, I’m going to work on a super simple strategy based on the VIX and its futures. I’m just skipping the data downloading from Quandl, I’m using the VIX index from here and the VIX futures from here, only the VX1 and VX2 continuous contracts datasets.

Data loading

First we need to load all the necessary imports, the backtest import will be used later:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from backtest import backtest
from datetime import datetime

For the sake of simplicity, I’m going to put all values in one DataFrame and in different columns. We have the VIX index, VX1 and VX2, this gives us this code:

VIX = "VIX.csv"
VIX1 = "VX1.csv"
VIX2 = "VX2.csv"

data = []
fileList = []
# Create the base DataFrame
data = pd.DataFrame()

fileList.append(VIX)
fileList.append(VIX1)
fileList.append(VIX2)

# Iterate through all files
for file in fileList:
# Only keep the Close column
tmp = pd.DataFrame(pd.DataFrame.from_csv(path=file, sep=',')['Close'])

# Rename the Close column to the correct index/future name
tmp.rename(columns={'Close': file.replace(".csv", "")}, inplace=True)

# Merge with data already loaded
# It's like a SQL join on the dates
data = data.join(tmp, how = 'right')

# Resort by the dates, in case the join messed up the order
data = data.sort_index()

And here’s the result:

Date VIX VX1 VX2
02/01/2008 23.17 23.83 24.42
03/01/2008 22.49 23.30 24.60
04/01/2008 23.94 24.65 25.37
07/01/2008 23.79 24.07 24.79
08/01/2008 25.43 25.53 26.10

Signals

For this tutorial I’m going to use a very basic signal, the structure is the same and you can replace the logic with your whatever strategy you want, using very complex machine learning algos or just crossing moving averages.

The VIX is a mean-reverting asset, at least in theory, it means it will go up and down but in the end its value will move around an average. Our strategy will be to go short when it’s way higher than its mean value and to go short when it’s very low, based on absolute values to keep it simple.

high = 65
low = 12

# By default, set everything to 0
data['Signal'] = 0

# For each day where the VIX is higher than 65, we set the signal to -1 which means: go short
data.loc[data['VIX'] &gt; high, 'Signal'] = -1

# Go long when the VIX is lower than 12
data.loc[data['VIX'] &lt; low, 'Signal'] = 1

# We store only days where we go long/short, so that we can display them on the graph
buys = data.ix[data['Signal'] == 1]
sells = data.ix[data['Signal'] == -1]

Now we’d like to visualize the signal to check if, at least, the strategy looks profitable:

# Plot the VX1, not the VIX since we're going to trade the future and not the index directly
plt.plot(data.index, data['VX1'], label='VX1')
# Plot the buy and sell signals on the same plot
plt.plot(sells.index, data.ix[sells.index]['VX1'], 'v', markersize=10, color='r')
plt.plot(buys.index, data.ix[buys.index]['VX1'], '^', markersize=10, color='g')
plt.ylabel('Price')
plt.xlabel('Date')
plt.legend(loc=0)
# Display everything
plt.show()

The result is quite good, even though there’s no trade between 2009 and 2013, we could improve that later:

Backtesting

Let’s check if the strategy is profitable and get some metrics. We’re going to compare our strategy returns with the “Buy and Hold” strategy, which means we just buy the VX1 future and wait (and roll it at each expiry), this way we can see if our strategy is more profitable than a passive one.
I put the backtest method in a separate file to make the main code less heavy, but you can keep the method in the same file:

import numpy as np
import pandas as pd

# data = prices + dates at least
def backtest(data):
cash = 100000
position = 0
total = 0

data['Total'] = 100000
data['BuyHold'] = 100000
# To compute the Buy and Hold value, I invest all of my cash in the VX1 on the first day of the backtest
positionBeginning = int(100000/float(data.iloc[0]['VX1']))
increment = 1000

for row in data.iterrows():
price = float(row[1]['VX1'])
signal = float(row[1]['Signal'])

if(signal &gt; 0 and cash - increment * price &gt; 0):
# Buy
cash = cash - increment * price
position = position + increment
print(row[0].strftime('%d %b %Y')+" Position = "+str(position)+" Cash = "+str(cash)+" // Total = {:,}".format(int(position*price+cash)))

elif(signal &lt; 0 and abs(position*price) &lt; cash):
# Sell
cash = cash + increment * price
position = position - increment
print(row[0].strftime('%d %b %Y')+" Position = "+str(position)+" Cash = "+str(cash)+" // Total = {:,}".format(int(position*price+cash)))

data.loc[data.index == row[0], 'Total'] = float(position*price+cash)
data.loc[data.index == row[0], 'BuyHold'] = price*positionBeginning

return position*price+cash

In the main code I’m going to use the backtest method like this:

# Backtest
backtestResult = int(backtest(data))
print(("Backtest =&gt; {:,} USD").format(backtestResult))
perf = (float(backtestResult)/100000-1)*100
daysDiff = (data.tail(1).index.date-data.head(1).index.date)[0].days
perf = (perf/(daysDiff))*360
print("Annual return =&gt; "+str(perf)+"%")
print()

# Buy and Hold
perfBuyAndHold = float(data.tail(1)['VX1'])/float(data.head(1)['VX1'])-1
print(("Buy and Hold =&gt; {:,} USD").format(int((1+perfBuyAndHold)*100000)))
perfBuyAndHold = (perfBuyAndHold/(daysDiff))*360
print("Annual return =&gt; "+str(perfBuyAndHold*100)+"%")
print()

# Compute Sharpe ratio
data["Return"] = data["Total"]/data["Total"].shift(1)-1
volatility = data["Return"].std()*252
sharpe = perf/volatility
print("Volatility =&gt; "+str(volatility)+"%")
print("Sharpe =&gt; "+str(sharpe))

It’s important to display the annualized return, a strategy with a 20% return over 10 years is different than a 20% return over 2 months, we annualize everything so that we can compare strategies easily. The Sharpe Ratio is a useful metric, it allows us to see if the return is worth the risk, in this example I just assumed a 0% risk-free rate, if the ratio is > 1 it means the risk-adjusted return is interesting, if it’s > 10 it means the risk-adjusted return is very interesting, basically high return for a low volatility.
In our example we have a pretty nice Sharpe ratio of 4.6 which is quite good:

Backtest =&gt; 453,251 USD
Annual return =&gt; 38.3968478261%

Buy and Hold =&gt; 53,294 USD
Annual return =&gt; -5.07672097648%

Volatility =&gt; 8.34645515332%
Sharpe =&gt; 4.60037789945

Finally, we want to plot the strategy PnL vs the “Buy and hold” PnL:

plt.plot(data.index, data['Total'], label='Total', color='g')
plt.plot(data.index, data['BuyHold'], label='BuyHold', color='r')
plt.xlabel('Date')
plt.legend(loc=0)
plt.show()

The strategy perfomed very well until 2010 but then from 2013 the PnL starts to stagnate:

Backtest

Conclusion

I showed you a basic structure of creating a strategy, you can adapt it to your needs, for example you can implement your strategy using zipline instead of a custom bactktesting module. With zipline you’ll have way more metrics and you’ll easily be able to run your strategy on different assets, since market data is managed by zipline.
I didn’t mention any transactions fees or bid-ask spread in this post, the backtest doesn’t take into account all of this so maybe if we include them the strategy would lose money!

Load market data from Quandl

In the previous articles, we loaded market data from CSV files, the drawback is that we’d need to redownload the CSV file every day to get latest data. Why not get them directly from the source ? Quandl is a website aggregating market data from various sources: Yahoo Finance, CBOE, LIFFE among others.

Fortunately for us, Quandl has an API in Python which let you access its data. First of all, you’ll need to get your personal API key here, here is a basic code snippet:

import quandl

quandl.ApiConfig.api_key = 'YOUR_API_KEY'
VIXCode = "CHRIS/CBOE_VX1"

VX1 = quandl.get(VIXCode)

The quandl.get() method returns a Pandas data frame with the dates in the index and open/high/low/close data, this depends on the data source, you may get more information like volume etc.

In conclusion now you can directly work with that data frame, you can merge it with other data, apply some calculations and use it as an input in a machine learning algorithm. The main advantage is that you’ll always get the latest data, no need to redownload a file.