您的位置:首页 > 编程语言 > Python开发

根据股票涨跌用KMeans进行分类

2016-09-28 15:25 274 查看
今早刚得到一份2890支股票2013年9月30日至今的交易数据,数据量还行,共有170m左右。趁着热乎劲,想做一些分析。

分析思路很简单,就是通过股票的涨跌情况,进行聚类分析。看看哪些股票种类是相似的,对于一些异常的股票,可以进一步挖掘分析。这里用到的算法是KMeans。

KMeans的原理很简单,这里就不详述了,不清楚的同学请使劲戳这里

KMeans主要的参数主要有这几个:k(中心点的个数),iter(迭代次数,也就是选择中心点的次数),thresh(算法在计算时变化的值域,如果小于或等于thresh,则停止迭代,这个可设可不设。)

在pyhon的scipy模块里面,KMeans方法返回的值是一些重心点,之后需要再用vq根据这些重心点来进行分类。

原文解释在这里,本人英语还在学习当中,就不在这里翻译出洋相了:

vq(obs, code_book[, check_finite])  Assign codes from a code book to observations.
kmeans(obs, k_or_guess[, iter, thresh, ...])    Performs k-means on a set of observation vectors forming k clusters.


原理清楚之后就可以直接上代码啦:

# -*- coding: utf-8 -*-
"""
Created on Wed Sep 28 11:36:29 2016
@author: Sunnyin
"""

import numpy as np
import pandas as pd
from scipy.cluster.vq import kmeans,vq
import os,copy

os.chdir('E:\\PythonWorkSpace\\data\\data\\data')
path = 'E:\\PythonWorkSpace\\data\\data\\data'

for root,dirs,files in os.walk(path):
fileNames = files

fileNum = np.random.random_integers(2890,size = 100)
useFiles = []
for i in fileNum:
useFiles.append(fileNames[i])

stocks = []
change = []
useFileTrue = copy.deepcopy(useFiles)
stocksName = {}
for index in range(len(useFiles)):
info = pd.read_csv(useFiles[index])
if len(info) > 100:
stocks.append(info.close.values[:100])
else:
useFileTrue.pop(index)

print("Now,we will analysis the data of "+ str(len(stocks))+ " stocks...")
for _ in range(len(stocks)):
change.append(np.sign(np.diff(stocks[_])))

data = np.vstack(change)
centroids,_= kmeans(data,5)
result,_ = vq(data,centroids)

for num in range(len(result)):
stocksName[useFileTrue[num]] = result[num]
print(stocksName)


这里面有几个需要注意的地方:

我在2890支股票中只是随机选择了100支股票进行分析。并且由于有的股票并不是3年前就存在的。所以我在这100只股票中又过滤了一遍,选择了最近100次交易都有数据的股票。

由于在进行聚类分析时,分析字段的长度必须一致,所以我分析的股票规律也是根据最近100次交易的涨跌规律。当然,这个算法比较粗糙,因为有的股票中间也许会暂停交易几天,所以最好是根据时间来过滤,有兴趣的可以尝试一下。

从代码中可以看到用了好几个循环,当然处理这100支股票速度很快,但是数据量大了也许就会看到弊端,所以可以试着利用numpy来优化代码。这个需要不断尝试。

代码运行效果如下:

Now,we will analysis the data of 98 stocks...
{'000514.csv': 2, '600064.csv': 1, '000572.csv': 2, '002144.csv': 2, '600792.csv': 2, '002302.csv': 1, '600645.csv': 4, '600163.csv': 2, '603012.csv': 4, '002663.csv': 0, '600673.csv': 1, '300390.csv': 4, '600303.csv': 4, '600533.csv': 1, '002373.csv': 0, '300453.csv': 4, '600139.csv': 3, '600288.csv': 4, '000550.csv': 2, '600030.csv': 3, '300308.csv': 3, '002753.csv': 4, '600563.csv': 2, '002038.csv': 2, '603189.csv': 1, '601789.csv': 0, '600864.csv': 2, '002187.csv': 2, '000617.csv': 0, '600870.csv': 1, '300492.csv': 2, '002426.csv': 4, '600624.csv': 0, '600999.csv': 3, '601106.csv': 0, '002107.csv': 1, '002585.csv': 2, '002600.csv': 4, '603778.csv': 1, '000561.csv': 2, '600723.csv': 1, '002489.csv': 4, '300505.csv': 2, '002061.csv': 0, '002175.csv': 0, '000811.csv': 4, '002395.csv': 4, '603601.csv': 4, '300307.csv': 1, '600876.csv': 0, '000856.csv': 2, '300055.csv': 2, '000528.csv': 1, '300153.csv': 4, '300068.csv': 4, '600808.csv': 2, '600315.csv': 0, '600736.csv': 1, '600580.csv': 4, '600308.csv': 2, '600217.csv': 1, '002656.csv': 0, '603123.csv': 2, '002336.csv': 2, '600575.csv': 1, '600322.csv': 2, '300338.csv': 0, '002417.csv': 1, '000598.csv': 1, '002404.csv': 0, '601800.csv': 1, '000571.csv': 0, '601555.csv': 3, '002074.csv': 4, '603788.csv': 3, '000975.csv': 0, '000983.csv': 1, '600016.csv': 3, '600565.csv': 1, '002216.csv': 2, '600850.csv': 4, '002442.csv': 4, '000913.csv': 2, '300247.csv': 2, '300018.csv': 4, '600605.csv': 1, '600150.csv': 2, '600843.csv': 0, '600479.csv': 1, '300270.csv': 4, '600115.csv': 1, '000733.csv': 4, '600069.csv': 2, '002482.csv': 1, '603001.csv': 2, '000153.csv': 2}


可以看出,我一共将股票分了5个类别,并且每个类别所对应的股票代码都存在了字典里。

当然,虽说KMeans算法很高效,但是我这些结果我还没有验证,具体优化还需要继续研究。

这仅仅是一个简单的分类,剩下的神奇事情还有很多很多,在于你怎么挖掘咯。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python