K-Means Clustering Algorithm For Pair Selection In Python – Part IV

Articles From: QuantInsti
Website: QuantInsti

In the previous installment of this series, Lamarcus demonstrated how to build a heatmap.

Earlier we used Matplotlibs scatter plot method. So now we’ll introduce Seaborn’s scatter plot method. Note that Seaborn is built on top of Matplotlib and thus Matplotlibs functionality can be applied to Seaborn.

#Creating a scatter plot using Seaborn
plt.figure(figsize=(15,10))
sns.jointplot(newDF[‘WMT’],newDF[‘TGT’])
plt.legend(loc=0)
plt.show()

K-Means Clustering Algorithm For Pair Selection In Python

One feature that I like about using Seaborn’s scatter plot is that it provides the Correlation Coefficient and P-Value. From looking at this pearsonr value, we can see that WMT and TGT were not positively correlated over the period. Now that we have a better understanding of our two stocks, let’s check to see if a tradable relationship exists.

We’ll use the Augmented Dickey Fuller Test to determine of our stocks can be traded within a Statistical Arbitrage Strategy.

Recall that we imported the adfuller test from the statsmodels.tsa.api package earlier.

To perform the ADF test, we must first create the spread of our stocks. We add this to our existing newDF dataframe.

#adding the spread column to the nemDF dataframe
newDF[‘Spread’]=newDF[‘WMT’]-newDF[‘TGT’]
#instantiating the adfuller test
adf=adfuller(newDF[‘Spread’])

We have now performed the ADF test on our spread and need to determine whether or not our stocks are cointegrated. Let’s write some logic to determine the results of our test.

#Logic that states if our test statistic is less than
#a specific critical value, then the pair is cointegrated at that
#level, else the pair is not cointegrated
if adf[0] < adf[4][‘1%’]:
print(‘Spread is Cointegrated at 1% Significance Level’)
elif adf[0] < adf[4][‘5%’]:
print(‘Spread is Cointegrated at 5% Significance Level’)
elif adf[0] < adf[4][‘10%’]:
print(‘Spread is Cointegrated at 10% Significance Level’)
else:
print(‘Spread is not Cointegrated’)

Any trading symbols displayed are for illustrative purposes only and are not intended to portray recommendations.

Disclaimer: All investments and trading in the stock market involve risk. Any decisions to place trades in the financial markets, including trading in stock or options or other financial instruments is a personal decision that should only be made after thorough research, including a personal risk and financial assessment and the engagement of professional assistance to the extent you believe necessary. The trading strategies or related information mentioned in this article is for informational purposes only.

Disclosure: Interactive Brokers

Information posted on IBKR Campus that is provided by third-parties does NOT constitute a recommendation that you should contract for the services of that third party. Third-party participants who contribute to IBKR Campus are independent of Interactive Brokers and Interactive Brokers does not make any representations or warranties concerning the services offered, their past or future performance, or the accuracy of the information provided by the third party. Past performance is no guarantee of future results.

This material is from QuantInsti and is being posted with its permission. The views expressed in this material are solely those of the author and/or QuantInsti and Interactive Brokers is not endorsing or recommending any investment or trading discussed in the material. This material is not and should not be construed as an offer to buy or sell any security. It should not be construed as research or investment advice or a recommendation to buy, sell or hold any security or commodity. This material does not and is not intended to take into account the particular financial conditions, investment objectives or requirements of individual customers. Before acting on this material, you should consider whether it is suitable for your particular circumstances and, as necessary, seek professional advice.