分享

机器学习在证券分析中的应用

 imelee 2016-12-21

Life is Short; I Use Python

人生苦短, 我用大蟒

以数据分析技术为核心的量化投资已经被证实是最有效的技术之一,在华尔街乃至国内的金融机构广泛使用.但那都是金融大鳄或机构们玩的游戏,普通散户无法从中得益.从技术层面来看,主要有两个原因,一是分析工具太复杂,不适合个人使用,二是高质量的数据无法获得.现今这些壁垒都被打破了.个人主机里的Nvidia显卡支持并行运算;最新的数据分析技术,人工智能机器学习都有个人软件支持;开放的高质量金融数据提供优秀的数据接口.这一切都使个人进行金融数据分析成为可能.

 

准备工作

一台性能强劲的个人电脑, 大内存(单一金融分析任务处理的数据通常不超过几个GB), Nvidia显卡

高速宽带Internet接入

Python3.44软件包(包括Numpy1.10.4, Scipy0.17.0, Matplotlib1.5.1, Pandas0.17.1 和 Tushare0.5.0)

TuShare是一个免费的金融数据服务提供商,针对中国证券市场提供非常完整的高质量数据.甚至还提供高频数据(没有测试过实时数据)对于个人量化分析的需求,我想这个网站已经很完美了. 网址(tushare.org)内有详细的说明,组织条理非常清晰.

 

金融数据获取

Yahoo和Google都提供免费的金融数据.Pandas_Datareader.data程序包提供DataReader函数来读取它们.例,

import pandas_datareader.data as web

yahoo = web.DataReader(name='goog', data_source='yahoo', start='2016-1-1', end='2016-7-31')

国内的股市数据也可以通过指定股票代码和后缀获得,'ss'代表沪市,'sz'代表深市

china = web.DataReader(name='600848.ss', data_source='yahoo', start='2016-1-1', end='2016-7-31')

通常返回如下DataFrame格式数据(DatetimeIndex, Open, High, Low, Close, Volume, Adj Close)

Pandas是由大型对冲基金分析师开发的.除了支持Web数据读取以外,还提供了DataFrame对象,支持CSV文件格式和高频数据.是处理金融时间序列数据的有力工具.DataFrame类用来管理具有索引和标签的数据,也支持Numpy的向量运算. DataFrame的shift方法非常有用,它把整个数据列相对于索引向后移动。

例, yahoo['close'].shift(1)

Pandas还支持SQL数据库,可以将整个表读入内存并执行SQL语句

TuShare返回DataFrame格式的数据,但稍稍有一些问题需要处理一下. 1)时间index的顺序是由近到远的.直接拿来画蜡烛图时不符合我们由左向右按时间排列的习惯.可以用sort_index方法重排序并选择参数inplace=True. 2)数据列的排序也有些不一致. Pandas的函数通常要求ohlc或ochl,但TuShare返回的是ohcl.必要的时候可以从DataFrame里提取Series重新排列.

个股历史数据

import tushare as ts

histd = ts.get_hist_data(code='600848', start='2016-01-01', end='2016-07-31', ktype='D')

histd.sort_index(inplace=True)

机器学习在证券分析中的应用 <wbr>- <wbr>Python版

除了ohcl以外还有均线ma5, ma10, ma20等

个股历史分笔

tick = ts.get_tick_data(code='600848', date='2016-08-22')

tick.sort_values('time', inplace=True)
tick.index = tick['time']

返回数据中不是以时间为index的,而且顺序也是由收盘到开盘的.所以需要重新排序和设置time为index


数据展示

import numpy as np
import pandas as pd
import datetime as dt
import matplotlib as mpl
import matplotlib.dates as mdt
import matplotlib.pylab as plt
import matplotlib.finance as mpf
import tushare as ts

Pandas提供matplotlib的一个封装器,专门为DataFrame对象所设计.也就是说DataFrame对象自带了一个plot方法.比如要显示五日,十日,二十日均线可以直接执行如下命令

histd[['ma5', 'ma10', 'ma20']].plot(figsize=(8,5), grid=True, rot=30)

机器学习在证券分析中的应用 <wbr>- <wbr>Python版

用TuShare的数据制作一个蜡烛图.这个有点小复杂.如果哪位高手有更简洁的方法,敬请指教

数据是TuShare的get_hist返回的DataFrame格式的数据,而且次序是ohcl,日期是字符串格式.

蜡烛图函数用的是matplotlib.finance的candlestick.问题是candlestick不直接支持DataFrame格式的数据

步骤如下

1, 获取数据

histd = ts.get_hist_data(code='600848', start='2016-01-01', end='2016-07-31', ktype='D',)

2, 调整次序到ohlc

collist = list(histd)
collist.insert(2, collist.pop(collist.index('low')))
histd = histd.ix[:, collist]

3, 调整DateTime格式到float(网上有类似的转换方法,可能基于不同的版本,在我的环境下没有成功)

histd.reset_index(inplace=True)  # drop the date index
histd['date']= pd.to_datetime(histd['date']) # convert str to date
histd['date'] = mdt.date2num(histd['date'].astype(dt.date))  #convert date to float days

4, 转换DataFrame为Numpy.Array(网上有重新构建tuple的方法,我觉得转换成Numpy Array更直接)

hista = np.array(histd)

5, 利用hista画出蜡烛图

fig, (ax1, ax2) = plt.subplots(2, sharex=True, figsize=(8, 5))
fig.subplots_adjust(bottom=0.2)
mpf.candlestick_ohlc(ax1, hista, width=0.5, colorup='r', colordown='g')
ax1.xaxis_date()
ax1.grid(True)
plt.bar(hista[:,0]-0.25, hista[:, 5], width=0.5)
ax2.grid(True)
plt.setp(plt.gca().get_xticklabels(), rotation=30)

plt.show()

机器学习在证券分析中的应用 <wbr>- <wbr>Python版

数据探索

在选定机器学习算法之前对数据进行初步研究是很有必要的.比如说数据是不是存在明显的相关性,是不是线性可分数据集等等

衍生变量,在股票市场里得到的原始变量是日期,开盘价,最高价,最低价,收盘价,成交量和复权价.对原始变量通过不同形式的组合而成衍生变量. 机构常用的多因子模型就是基于各自设计的衍生变量.(小技巧,分母加0.01)

dv1:当日涨幅,(TuShare已经提供了精确的数值histd['p_change'])

histd['dv1'] = (histd['close'] - histd.shift(1)['close'])

dv2:10日涨幅

histd['dv10'] = (histd['close'] - histd.shift(10)['close'])

dv3:10日涨跌比率ADR

dv4:10日相对强弱指标RSI

dv5:当日K线

histd['dv5'] = (histd['close'] - histd['open']) / (histd['high'] - histd['low'])

dv6:5日K线均值

dv6 = pd.rolling_mean(histd['dv5'], window=5) (利用了当日K线值dv5)

dv7:10日乖离率BIAS

histd['dv7'] = (histd['close']-histd['ma10'])/histd['ma10'] (利用了TuShare的10日均值)

dv8:10日RSV

histd['dv8'] = (histd['close']-pd.rolling_min(histd['close'], window=10))/(pd.rolling_max(histd['close'], window=10)-pd.rolling_min(histd['close'], window=10))

dv9:30日RSV(略)

dv10:OBV量比

histd['dv10'] = np.sign(histd['p_change']) * histd['volume'] / pd.rolling_mean(histd['volume'], window=5)

手工实现以上股票衍生指标是一个很好的熟悉Pandas的过程.这些指标的可视化直接用plot就行,不再演示了.可能有些理解上的错误,敬请方家斧正. 

基本描述性统计,用describe()函数可以获得一些

表示位置的统计量:平均值和中位数

histd.median()

表示数据散度的统计量:标准差,方差和极差

np.ptp(histd['open']) DataFrame不支持ptp()

histd.var()

表示分布形状的统计量: 偏度和峰度

histd.skew()

histd.kurt()

分布描述性统计(由概率分布函数和概率密度函数描述)

分布可视化,用hist方法,用法和plot一样

histd['p_change'].hist(figsize=(8, 5), grid=True) 要注意不能有'nan'值,否则报错

关联可视化,用matpltlib.scatter方法对两组数据进行plot,看是否由明显线性关系.

plt.scatter(histd['close'], histd['volume'])

分组可视化 

histd.boxplot() 

散点矩阵

对于多维数据可以两两配对组成散点图矩阵非常直观的展示数据之间的相关性.现成方法是引入seaborn库

import seaborn as sns

sns.set()

df = sns.load_dataset("iris")   # df 是Pandas的DataFrame格式的数据

sns.pairplot(df, hue="species")   #species是用来分类的列

机器学习在证券分析中的应用 <wbr>- <wbr>Python版
Pandas的tools.plotting也有sactter_matrix函数可以实现相同功能,但设置颜色比较麻烦,效果也不及seaborn.
 

数据降维, 主成分分析PCA法和相关系数法.网上能公开获取的数据越来越多,质量也越来越高,其维度也越来越高.高维度的数据会导致计算量和计算复杂度加大.特别是有些维度之间是强相关的,这些冗余数据对算法有害无益.所以数据降维是数据准备工作中不可或缺的步骤.PCA的原理网上有很多高质量的讲解.这里仅以调用scikit-learn中成熟库来举例,对Tushare提供的企业盈利能力数据进行处理

import tushare as ts

import sklearn.decomposition as skd

profit = ts.get_profit_data(2016,2) 

profit.drop('code', axis=1, inplace=True) 显然数据中的公司代码和公司名称不该参加计算

profit.drop('name', axis=1, inplace=True)

profit.dropna(inplace=True) 数据中的空值需要事先清除

pca = skd.PCA(n_components='mle')  目标维数可以让算法自己确定,故先设为mle

newprofit = pca.fit_transform(profit)  把降维结果输出到新的变量里. 这里有两个概念需要理解清楚,1是用profit数据对pca这个类进行降维训练,2是用pca对profit进行降维.

pca.explained_variance_ratio_   显示新维度的贡献率.本例中前三维的贡献率就达到99%了

至此数据准备工作告一段落

思考

向量空间的构成: 价格波动, 成交量波动, 买卖盘的对比

用分类的方法找到价格大涨或大跌前的波动模式,以此定位买入卖出点

用一年的历史数据来模拟投资回报率,

回归,分类, 聚类

统计套利策略,配对交易策略

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多