非负矩阵分解(NMF)本身是一个降维算法,在量化中可以用来识别市场驱动因素以及相应的个股。不过需要说明的一点是,本人目前还处于探索阶段,还没写出相应策略,因此也不敢肯定他的效果。有兴趣的可以讨论一下。

首先我们获取一个矩阵,行为时间,列为股票代码,值为相应的成交量,代码如下:

import pandas as pd
import numpy as np
from sklearn.decomposition import NMF
from sklearn import preprocessing
min_max_scaler = preprocessing.MinMaxScaler()
date0='2016-07-01'
date='2016-09-01'
l=get_index_constituents('000300.SH')
data=get_price(l, start_date= date0, end_date= date, frequency='1d', fields='volume')
d=data['volume']
d=d.dropna(axis=1)
d_scaled= min_max_scaler.fit_transform(d.values)

然后,将该矩阵分解,需要指定特征数量,这里用的是5

model = NMF(n_components=5, init='random', random_state=0)
w=model.fit_transform(d_scaled)
f=model.components_
pw=pd.DataFrame(w,d.index)
pf=pd.DataFrame(f,columns=d.columns)

这样上述矩阵就分解为了 pw,pf两个矩阵。pw叫做权重矩阵,pf叫做特征矩阵。

pw可以看出驱动市场的主要因素是什么;pf可以看出哪只个股受该驱动因素影响最大

这是pw矩阵最后15行

Image 1.png

可以看出从8月18日开始,第二个特征(即第二列)权重高于其他特征

通过pf矩阵第二行,可查到首次特征影响最大的个股。

def sq(d,p):
    x=[d.index[0]]
    index=(d[1:][d[1:]>(d[0]*p)]).index
    x.extend(index)
    return x
    
m=pf.iloc[1,]
m.sort(ascending=False)
sq(m,0.9)

返回值为 ['000826.SZ', '300002.SZ']。说明这两只个股走势具有一定相关性

这两个股票和沪深300在2016-8-18到2016-9-1走势如下:

Image 2.png

Image 3.png

Image 4.png

可以看出在大盘下跌的趋势下,这两只股都保持了向上的趋势,说明是具有一定相关性的。

但是也带来了一个问题,既然特征二是主要影响市场的因素,为什么受该特征影响的个股和大盘走势不一致呢?现在我也不知道

5条回复 添加回复
小鹏北京

多谢,正在好好研读中。


2016-12-15 16:39:37
小鹏北京

l=get_index_cget_price(l, start_date= date0, end_date= date, frequency='1d', fields='volume')
这两句是在做什么



2016-12-15 17:00:51
金魂

之所以出现这样的 逆势走势。主要还是源于个股层面的因素变化。


2017-02-12 22:04:53
剑_雪

不错,值得学习,顶一下。


2017-02-14 18:19:35
小鹏北京

没有看明白。555


2017-02-15 15:39:30
1
提交
Copyright © 2004-2017 京东JD.com 版权所有 | 投资有风险,购买需谨慎