📜  使用支持向量机预测股价方向

📅  最后修改于: 2022-05-13 01:55:22.534000             🧑  作者: Mango

使用支持向量机预测股价方向

我们将使用支持向量机来实现一个端到端的项目来为我们进行交易。您可能一定听说过股票市场这个词,众所周知,它造就了数千人的生活,也摧毁了数百万人的生活。如果您不熟悉股票市场,您可以浏览一些有关市场的基本资料。

使用的工具和技术:

  • Python
  • Sklearn-支持向量分类器
  • 雅虎财经
  • Jupyter-笔记本
  • 蓝移

分步实施

第 1 步:导入库

Python3
# Machine learning
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
  
# For data manipulation
import pandas as pd
import numpy as np
  
# To plot
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid')
  
# To ignore warnings
import warnings
warnings.filterwarnings("ignore")


Python3
# Read the csv file using read_csv 
# method of pandas
df = pd.read_csv('RELIANCE.csv')
df


Python3
# Changes The Date column as index columns
df.index = pd.to_datetime(df['Date'])
df
  
# drop The original date column
df = df.drop(['Date'], axis='columns')
df


Python3
# Create predictor variables
df['Open-Close'] = df.Open - df.Close
df['High-Low'] = df.High - df.Low
  
# Store all predictor variables in a variable X
X = df[['Open-Close', 'High-Low']]
X.head()


Python3
# Target variables
y = np.where(df['Close'].shift(-1) > df['Close'], 1, 0)
y


Python3
split_percentage = 0.8
split = int(split_percentage*len(df))
  
# Train data set
X_train = X[:split]
y_train = y[:split]
  
# Test data set
X_test = X[split:]
y_test = y[split:]


Python3
# Support vector classifier
cls = SVC().fit(X_train, y_train)


Python3
df['Predicted_Signal'] = cls.predict(X)


Python3
# Calculate daily returns
df['Return'] = df.Close.pct_change()


Python3
# Calculate strategy returns
df['Strategy_Return'] = df.Return *df.Predicted_Signal.shift(1)


Python3
# Calculate Cumulutive returns
df['Cum_Ret'] = df['Return'].cumsum()
df


Python3
# Plot Strategy Cumulative returns 
df['Cum_Strategy'] = df['Strategy_Return'].cumsum()
df


Python3
import matplotlib.pyplot as plt
%matplotlib inline
  
plt.plot(Df['Cum_Ret'],color='red')
plt.plot(Df['Cum_Strategy'],color='blue')


第 2 步:读取股票数据

我们将阅读从雅虎财经网站下载的股票数据。数据以 OHLC(开盘价、最高价、最低价、收盘价)格式存储在 CSV 文件中。要读取 CSV 文件,您可以使用 pandas 的 read_csv() 方法。

句法 :

pd.read_csv(filename, index_col)

注:我们从雅虎财经网站下载了过去 1 年的 Reliance Industries Trading In NSE 数据。



使用的文件:

蟒蛇3

# Read the csv file using read_csv 
# method of pandas
df = pd.read_csv('RELIANCE.csv')
df

输出:

第 3 步:数据准备

使用前需要处理的数据,以便日期列应作为索引来执行此操作

蟒蛇3

# Changes The Date column as index columns
df.index = pd.to_datetime(df['Date'])
df
  
# drop The original date column
df = df.drop(['Date'], axis='columns')
df

输出:



步骤 4:定义解释变量

解释变量或自变量用于预测值响应变量。 X 是一个包含用于预测的变量的数据集。 X 由变量组成,例如“开盘价 - 收盘价”和“最高价 - 最低价”。这些可以理解为算法预测明天趋势的指标。随意添加更多指标并查看性能

蟒蛇3

# Create predictor variables
df['Open-Close'] = df.Open - df.Close
df['High-Low'] = df.High - df.Low
  
# Store all predictor variables in a variable X
X = df[['Open-Close', 'High-Low']]
X.head()

输出:

步骤 5:定义目标变量

目标变量是机器学习模型将根据解释变量预测的结果。 y 是一个目标数据集,存储机器学习算法将尝试预测的正确交易信号。如果明天的价格高于今天的价格,那么我们将购买特定的股票,否则我们将没有头寸。我们将在 y 中存储 +1 表示买入信号和 0 表示无头寸。我们将使用 NumPy 中的 where()函数来做到这一点。

句法:

np.where(condition,value_if_true,value_if_false)

蟒蛇3

# Target variables
y = np.where(df['Close'].shift(-1) > df['Close'], 1, 0)
y

输出:

第 6 步:将数据拆分为训练和测试

我们将数据拆分为训练和测试数据集。这样做是为了我们可以评估模型在测试数据集中的有效性



蟒蛇3

split_percentage = 0.8
split = int(split_percentage*len(df))
  
# Train data set
X_train = X[:split]
y_train = y[:split]
  
# Test data set
X_test = X[split:]
y_test = y[split:]

第 7 步:支持向量分类器 (SVC)

我们将使用sklearn.svm.SVC库中的 SVC()函数在训练数据集上使用 fit() 方法创建我们的分类器模型。

蟒蛇3

# Support vector classifier
cls = SVC().fit(X_train, y_train)

第 8 步:分类器准确度

我们将在列车上计算算法的准确性,并通过比较信号的实际值与信号的预测值来测试数据集。函数accuracy_score() 将用于计算准确度。

测试数据中 50% 以上的准确率表明分类器模型是有效的。

第九步:战略实施

我们将使用 cls.predict()函数预测信号(买入或卖出)。

蟒蛇3

df['Predicted_Signal'] = cls.predict(X)

计算每日回报

蟒蛇3



# Calculate daily returns
df['Return'] = df.Close.pct_change()

计算策略回报

蟒蛇3

# Calculate strategy returns
df['Strategy_Return'] = df.Return *df.Predicted_Signal.shift(1)

计算累积回报

蟒蛇3

# Calculate Cumulutive returns
df['Cum_Ret'] = df['Return'].cumsum()
df

计算策略累积回报

蟒蛇3

# Plot Strategy Cumulative returns 
df['Cum_Strategy'] = df['Strategy_Return'].cumsum()
df

绘制策略回报与原始回报

蟒蛇3

import matplotlib.pyplot as plt
%matplotlib inline
  
plt.plot(Df['Cum_Ret'],color='red')
plt.plot(Df['Cum_Strategy'],color='blue')

输出:

如您所见,我们的策略似乎完全优于 Reliance 股票的表现。我们的策略(蓝线)在过去 1 年的回报率为18.87% ,而 Reliance Industries (红线)的股票在过去 1 年的回报率仅为5.97%



回测结果

1. TCS

Stock Return Over Last 1 year -  48%
Strategy result - 48.9 %

2.ICICI银行

Stock Return Over Last 1 year -  48%
Strategy result - 48.9 %

部署战略到活市场

编码策略可以轻松部署在实时市场中,也可以在整个交易所中对任意数量的数据进行回溯测试。使用 BlueShift 平台可以轻松完成部署。它是一个交互式平台,具有实时数据馈送和通过各种经纪人的连接。您可以使用来自不同交易所的数据在 BlueShift 平台上进行任意次数的回溯测试。

结论

  • 策略提供者在实时市场中获得可观的回报。目前,我刚刚根据前一天的水平训练了模型,但是为了提高模型的准确性,我们还添加了各种技术指标来训练模型,例如 RSI、ADX、ATR、MACD、随机指标等等。
  • 在实时市场中获得更高的准确性 深度学习被证明在实时市场交易中非常有效。我们可以使用强化学习来自动化我们的交易,也可以使用 Stacked LSTM 来使我们的策略回报呈指数增长。

注意:在完成对策略的回溯测试之前不应部署真钱,并且在纸交易期间没有策略的承诺回报