机器学习方法是计算机科学的一个分支,它借助于计算机算法,对数据进行分析后,实现模式识别,进而实现对未来数据的预测。
机器学习方法可以分为以下几个类别:
1.监督学习:
训练的输出分类是预先设定好的,根据输入和输出,算法的目标在于寻找其中的对应函数。
2.无监督学习:
训练的输出分类是预先不知道的。算法的目标在于发现数据中的结构,如聚类分析。
3.半监督学习:
介于监督学习和无监督学习之间。
4.增强学习:
算法通过执行一系列的动作,影响环境中的可观察变量,从而得到环境对动作反应的规律。最后根据这个规律,判断该采取何种行动以最大化 某种回报。
监督式学习是机器学习的一个分支,可以通过训练样本而建立起一个输入和输出之间的函数,并以此对新的事件进行预测。
典型的监督学习流程如下:
支持向量机
是监督学习中一种常用的学习方法。
支持向量机( Support Vector Machines SVM )是一种比较好的实现了结构风险最小化思想的方法。它的机器学习策略是结构风险最小化原则 为了最小化期望风险,应同时最小化经验风险和置信范围)。具体就不详细介绍了,百度有很多资料。
http://scikit-learn.org/stable/modules/svm.html#svm 中是SVM函数和简单介绍。
from sklearn.svm import SVR 可以构造支持向量回归(Support Vector Regression)模型
from sklearn.svm import SVC 可以用于分类(Support Vector Classification)
首先来看支持向量回归(Support Vector Regression)模型如何使用,下面是官网的一个简单例子。
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
import time
# 产生数据
X = np.sort(5 * np.random.rand(40, 1), axis=0)
y = np.sin(X).ravel()
# 添加噪声
y[::5] += 3 * (0.5 - np.random.rand(8))
# 拟合回归模型,不同的核函数
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
svr_lin = SVR(kernel='linear', C=1e3)
svr_poly = SVR(kernel='poly', C=1e3, degree=2)
y_rbf = svr_rbf.fit(X, y).predict(X)
y_lin = svr_lin.fit(X, y).predict(X)
y_poly = svr_poly.fit(X, y).predict(X)
# 画图展示结果
plt.scatter(X, y, c='k', label='data')
plt.plot(X, y_rbf, c='g', label='RBF model')
plt.plot(X, y_lin, c='r', label='Linear model')
plt.plot(X, y_poly, c='b', label='Polynomial model')
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()
从回归的角度,我们可以根据之前的历史数据,预测下一个时间点的股价;分类的角度,我们可以根据历史数据,预测下一个时间点股价的正负。下面对股票数据进行回归建模
df.index
import numpy as np
from sklearn.svm import SVR
import matplotlib.pyplot as plt
import time
start_date = '2015-01-01'
df = get_price('000423.XSHE', fields='price', start_date=start_date,
end_date=time.strftime('%Y-%m-%d', time.localtime()))
X = mat(range(1,len(df['price'].values)+1)).T
y = df['price'].values
# 拟合回归模型
svr_rbf = SVR(kernel='rbf', C=1e3, gamma=0.1)
# 注意这里对数据建模完了还是预测的该数据
y_rbf = svr_rbf.fit(X, y).predict(X)
# 画图展示结果
_, ax = plt.subplots(figsize = [18,8])
dates = df.index
ax.scatter(X, y, c='k', label='data')
ax.plot(X,y_rbf, c='g', label='RBF model')
ticks = ax.get_xticks()
ax.set_xticklabels([dates[i].date() for i in ticks[:-1]])
plt.xlabel('data')
plt.ylabel('target')
plt.title('Support Vector Regression')
plt.legend()
plt.show()
那么如何在策略中使用呢?一个暴力的方法就是预测未来股价,如果涨了就买入,跌了就卖出。使用SVR进行回归预测,需要预测中未来股价,那么学习这种非平稳、噪声的股价序列难度是很大的。
下面是个人想法,作为引子,欢迎大家一起讨论
特征选择
查阅文献发现有各种因子应用到其中,
基本面因子:PE,PB,ROE等
技术指标因子:RSI、KDJ、MA、MACD等
蜡烛图形态因子:三乌鸦、锤子线等
输出辨识
涨跌分类
未来一段时间收益率
还有一类用法是利用非监督学习甚至深度学习找到特征
比如找到大涨的股票,然后看大涨前一段时间的形态有没有相似的,利用非监督学习的方法
统计套利方法是看股价的相关性,比如A和B两只股票价差一向稳定在10块钱,某天价差突然跌倒5块钱,统计套利就假设,这个价差会恢复到10块钱,那么我们就可以就此设计交易策略。如果股价价差真的恢复了,那么就可以实现套利。但是显然,这样的关系可能不是那么明显地存在于股票的价格中,可能存在于收益曲线中或者方差曲线中,甚至更高复杂度的统计量中。DL提供了将原数据投影到另一个特征空间中的方法,而且是高度非线性的。那么,原数据中没有体现出来的相关性,会不会在这种高度非线性的投影空间中体现出来呢