根据股票涨跌用KMeans进行分类
2016-09-28 15:25
274 查看
今早刚得到一份2890支股票2013年9月30日至今的交易数据,数据量还行,共有170m左右。趁着热乎劲,想做一些分析。
分析思路很简单,就是通过股票的涨跌情况,进行聚类分析。看看哪些股票种类是相似的,对于一些异常的股票,可以进一步挖掘分析。这里用到的算法是KMeans。
KMeans的原理很简单,这里就不详述了,不清楚的同学请使劲戳这里
KMeans主要的参数主要有这几个:k(中心点的个数),iter(迭代次数,也就是选择中心点的次数),thresh(算法在计算时变化的值域,如果小于或等于thresh,则停止迭代,这个可设可不设。)
在pyhon的scipy模块里面,KMeans方法返回的值是一些重心点,之后需要再用vq根据这些重心点来进行分类。
原文解释在这里,本人英语还在学习当中,就不在这里翻译出洋相了:
原理清楚之后就可以直接上代码啦:
这里面有几个需要注意的地方:
我在2890支股票中只是随机选择了100支股票进行分析。并且由于有的股票并不是3年前就存在的。所以我在这100只股票中又过滤了一遍,选择了最近100次交易都有数据的股票。
由于在进行聚类分析时,分析字段的长度必须一致,所以我分析的股票规律也是根据最近100次交易的涨跌规律。当然,这个算法比较粗糙,因为有的股票中间也许会暂停交易几天,所以最好是根据时间来过滤,有兴趣的可以尝试一下。
从代码中可以看到用了好几个循环,当然处理这100支股票速度很快,但是数据量大了也许就会看到弊端,所以可以试着利用numpy来优化代码。这个需要不断尝试。
代码运行效果如下:
可以看出,我一共将股票分了5个类别,并且每个类别所对应的股票代码都存在了字典里。
当然,虽说KMeans算法很高效,但是我这些结果我还没有验证,具体优化还需要继续研究。
这仅仅是一个简单的分类,剩下的神奇事情还有很多很多,在于你怎么挖掘咯。
分析思路很简单,就是通过股票的涨跌情况,进行聚类分析。看看哪些股票种类是相似的,对于一些异常的股票,可以进一步挖掘分析。这里用到的算法是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算法很高效,但是我这些结果我还没有验证,具体优化还需要继续研究。
这仅仅是一个简单的分类,剩下的神奇事情还有很多很多,在于你怎么挖掘咯。
相关文章推荐
- 一种根据关键字进行分类的文本分类算法
- 如何根据给一个字段的值分类进行样式设计
- 数字图像处理---根据K均值聚类方法对图像灰度值进行分类和阈值化操作
- 根据照片拍摄地点对照片进行自动分类
- 怎样用excel按进行分类求和,最后再根据一列对其他列进行排序
- Android 7.0 Gallery图库源码分析7 - ActionBar下拉导航及根据标签进行分类
- 利用kmeans分类对重庆经济进行分析
- 根据某列值进行样本的分类
- 根据表中某个字段的首字母进行分类查询
- 查询出来的结果根据某一字段进行分类
- 冒泡排序是选择排序的退化版,再就是一组数中求几个最小的数选择什么方法要根据不同情况进行分类
- 分类:决策树—— 对连续属性进行“二元转化”划分,根据增益量公式求最佳划分点
- 根据CAP原理对NoSQL产品进行分类
- 将文件根据不同日期进行分类(文件归档)
- 根据txt文件中指定的文件名进行文件分类
- 一种根据关键字进行分类的文本分类算法
- Opencv 根据照片名字进行分类
- 根据城市首字母进行分类,区分多音字,获取城市首字母
- ORACLE 对一个表进行循环查数,再根据MO供给数量写入另一个新表
- php根据某字段对多维数组进行排序的方法