
4.1 数据的收集
4.1.1 认识数据
数据是数据挖掘的基础,所以有必要先认识一下数据。关于数据的内容很多,从数据挖掘的角度来讲,分析人员往往关心数据的属性和数据的存在形式。
1. 数据的属性
数据集由数据对象组成,一个数据对象代表一个实体。例如,在销售数据库中,对象可以是顾客、商品或销售记录;在医疗数据库中,对象可以是患者;在大学的数据库中,对象可以是学生、教授和课程。通常,数据对象用属性描述。数据对象又称为样本、实例、数据点或对象。如果数据对象存放在数据库中,则它们是数据元组,也就是说,横向数据库的行对应于数据对象,而列对应于属性。本节,我们定义属性,并且考察各种属性的类型。
属性(Attribute)是一个数据字段,表示数据对象的一个特征。在文献中,属性、维(Dimension)、特征(Feature)和变量(Variable)可以互换地使用。术语“维”一般用在数据仓库中,机器学习文献更倾向于使用术语“特征”,而统计学家则更倾向使用术语“变量”,数据挖掘和数据库的专业人士一般使用术语“属性”,因此这里也使用术语“属性”。例如,描述顾客对象的属性可能包括customer_ID、name和address。给定属性的观测值称为观测,用来描述一个给定对象的一组属性称为属性向量(或特征向量)。
一个属性的类型由该属性可能具有的值的集合决定。属性的描述有多种方法,在数据挖掘领域,一般将属性分为离散和连续两类,每种类型都可以用不同的方法处理。
离散属性具有有限个值或无限可数个值,可以用或不用整数表示。属性hair_color、smoker、medical_test和drink_size都有有限个值,因此是离散的。注意:离散属性可以具有数值型的值,如二元属性取0和1,年龄属性取0~110。如果一个属性可能的值的集合是无限的,但是可以建立一个与自然数一一对应的关系,则这个属性是无限可数的。例如,属性customer_ID是无限可数的。顾客数量是无限增长的,但事实上实际值的集合是可数的(可以建立这些值与自然数集合的一一对应关系)。如果属性不是离散的,则它是连续的。在文献中,术语“数值属性”与“连续属性”通常可以互换地使用(这可能令人困惑,因为在经典意义下,连续值是实数,而数值型的值可以是整数或实数)。在实践中,离散属性用有限位数字表示,连续属性一般用浮点变量表示。
2. 数据的存在形式
要想获取数据,首先要明确数据存在于什么地方,以什么形式存在。一般根据数据的存在形式,将数据分为结构化数据、非结构化数据及半结构化数据。
结构化数据,简单来说就是数据库,结合到典型场景中更容易理解,如ERP系统、财务系统、医疗HIS数据库、教育一卡通、政府行政审批和其他核心数据库等。这些应用需要哪些存储方案呢?基本包括高速存储应用需求、数据备份需求、数据共享需求及数据容灾需求。
非结构化数据,包括视频、音频、图片、图像、文档、文本等形式。典型场景有医疗影像系统、教育视频点播系统、视频监控系统、文件服务器(PDM/FTP)、媒体资源管理等。这些应用对应于数据存储、数据备份及数据共享等存储需求。
半结构化数据,包括邮件、HTML、报表、资源库等,典型场景有邮件系统、Web集群、教学资源库、数据挖掘系统、档案系统等。这些应用对应于数据存储、数据备份、数据共享及数据归档等基本存储需求。
4.1.2 数据挖掘的数据源
良好的数据源是数据挖掘成功的重要保证,那么哪些数据可以作为数据源呢?从广义上说,所有与业务相关的结构化数据、非结构化数据或半结构化数据都可能是数据源,即所谓大数据的概念。但并不是将所有数据,也不可能将所有的数据都拿过来挖掘,而是应选择与数据挖掘目标相关的数据作为某次数据挖掘的数据源。同样是证券公司,如果数据挖掘的目标是研究证券公司的客户分类,以便进行精准营销或服务,那么就要从数据源中选择与客户相关的数据作为该次数据挖掘项目的数据源;但如果是量化投资,则会选择一些交易数据、上市公司信息等作为数据源。数据挖掘的数据源如图4-1所示。

图4-1 数据挖掘的数据源
在实践中,大多数数据存在于数据仓库中,但为了方便,通常要建立某次数据挖掘的数据集市。相对于传统方法,数据仓库提供了一个新的解决方案。数据仓库使用更新驱动的方法,而不是查询驱动的方法。这种方法将来自多个异种数据源的信息预先集成,并存储在数据仓库中供直接查询和分析。与联机事务处理数据库不同,数据仓库不包含最近的信息。然而,数据仓库提高了集成异种数据库的分布式处理能力,这一点在证券业尤为重要。数据被复制、预处理、集成、注释、汇总,并被重新组织到一个语义一致的数据存储中。在数据仓库中进行的查询处理并不影响在局部数据源上进行的数据处理,因此,数据仓库完全可以满足证券行业实时性的要求。关于数据仓库和数据集市的设计与建立的问题,不是数据挖掘的重点,这里仅需略微了解即可。
4.1.3 数据抽样
在收集数据的过程中,宽表数据往往是几十万、上百万级记录的。要对所有数据进行预处理、训练,时间上很难满足要求,因此对数据进行抽样就很有必要。同时,抽样可以作为一种数据归约技术使用,因为它允许用数据量很小的随机样本(子集)代表大型数据集。不同的数据抽样方法对模型的精度有很大影响,可以考虑用一些数据浏览工具、统计工具对数据分布进行一定的探索。在对数据进行充分了解后,再考虑采用合适的抽样方法。对一般的模型,比如客户细分,主要是数据的聚类,在做抽样时可用随机抽样,也可以考虑整群抽样;而建立离网预警模型或者金融欺诈预测模型时,数据分布是严重有偏的,而且这种有偏数据对这类模型来说恰恰是至关重要的,一般采用分层抽样和过度抽样相结合的方法。
选择抽样方法时要注意抽样方法的正确性。抽样方法的正确性是指抽样的代表性和随机性,代表性反映样本与全集的接近程度,随机性反映样品被抽入样本纯属偶然。在对总体样本质量状况一无所知的情况下,显然不能以主观的限制条件去提高抽样的代表性,抽样应当是完全随机的,这时采用简单随机抽样最为合理。在对数据总体质量状况有所了解的情况下,可以采用分层抽样或系统抽样来提高抽样的代表性。在采用简单随机抽样有困难的情况下,可以采用代表性和随机性较差的分段抽样或整群抽样。这些抽样方法除简单随机抽样外,都是带有主观限制条件的随机抽样法。通常只要不是有意识地抽取质量好或坏的产品,尽量从数据源的各部分抽样,就可以近似地认为是随机抽样。
具体的数据抽样方法主要有如下4种。
(1)简单随机抽样(Simple Random Sampling)。将总体的全部观察单位编号,再用抽签法或随机数字表随机抽取部分观察组成样本。该方法的优点是操作简单,标准误差计算简单;缺点是总体较大时,难以一一编号。
(2)系统抽样(Systematic Sampling)。系统抽样又称为机械抽样、等距抽样,即先将总体的观察单位按某一顺序号分成n个部分,再从每个部分各抽取一定数量的观察组成样本。该方法的优点是易于理解、简便易行;缺点是总体有周期或增减趋势时,易产生偏性。
(3)整群抽样(Cluster Sampling)。将总体分为多个群,再随机抽取几个群组成样本,群内全部抽样。该方法的优点是便于组织、节省经费;缺点是抽样误差大于简单随机抽样。
(4)分层抽样(Stratified Sampling)。先按对样本影响较大的某种特征,将总体分为若干层,再从每一层内随机抽取一定数量的观察单位组成样本。该方法的优点是样本代表性好,抽样误差较小。
上述4种基本抽样方法都属于单阶段抽样,在实际应用中常根据实际情况将整个抽样过程分为若干阶段来进行,称为多阶段抽样。在抽样的过程中,往往要紧扣数据挖掘目标。具体的数据抽样过程如图4-2所示。

图4-2 具体的数据抽样过程
4.1.4 量化投资的数据源
长期以来,证券公司的交易系统一直处于中国各行业IT技术应用的领先水平,积累了丰富的数据。整个运营系统产生的数据主要分为两大类:股票行情数据与客户交易数据。股票行情数据由交易产生,广泛分布,是实时共享信息。一些现有的实时行情分析系统都能进行从简单到复杂的分析。客户交易数据在各个证券公司的营业部产生,分布于证券公司的营业部及证券交易所,属于相对私有的数据。这些数据反映了客户的资金状况、交易状况和持仓状况等,对证券公司和交易所而言具有极高的分析价值。
在量化投资领域,根据业务目标的不同,数据挖掘所用的数据源也不同。图4-3为与量化投资相关的结构化数据源的图谱,从中可以看出,对不同的业务目标,可以选择不同的数据,这些数据自己可能有,也可能没有,但从数据挖掘的角度来讲,数据越全越好。

图4-3 与量化投资相关的结构化数据源的图谱
那么,如何选择合适的数据源呢?首先要有一个以数据挖掘目标为导向的方法论,在这个方法论中要大致规划出采用哪些数据源、经过怎样的处理、得到什么样的结果。以量化选股为例,可以先给出一个如图4-4所示的方法论,这样就可以基本锁定所需要的数据源。

图4-4 量化选股数据挖掘方法论示意图
为了进一步确定完成该项数据挖掘任务所需要的数据源,还需要针对方法论中的指标层的指标进行分析,以确定用什么数据源可以得到这些指标。根据指标层的这些指标,可以很容易地确定具体的数据源,如图4-5所示。

图4-5 根据数据挖掘方法论中的指标层的指标确定的数据源
对于专业的量化投资机构,获取这些数据并不难,一般的机构都有比较健全的数据。在这里尽量用一些公开的数据来研究如何利用数据挖掘技术进行量化投资。从技术层面来看,用这些公共数据效果会更好,公共数据包含形形色色的数据,会用到更多的技术。另外,从目标数据来看,其中的宏观经济数据、行业信息数据对股票的影响是普遍的,进行基本面分析即可,量化分析效果不一定显著,而且这两类数据对股票的影响是中长期的,短期内影响并不显著。而客户信息数据,这里不能利用,但我们关注的是股票的市场表现,所有客户的操作会在股票市场上有表现。所以,综合分析下来,交易数据和公司财务数据对研究量化投资更有价值,而且这两类数据都是公共数据,可以用来作为研究对象。数据是数据挖掘的基础,下面就来看看如何获取这两类数据。
4.1.5 从雅虎获取交易数据
首先介绍如何获取交易数据。很多财经网站都有丰富、可靠的交易数据,比如雅虎、新浪、网易、腾讯,其中雅虎与MATLAB有接口,所以可以利用MATLAB从雅虎获得这些交易数据。获取的程序如P4-1所示。运行该程序,可以获得深市主板的数据,对该程序略加修改,即可获得沪市和创业板的数据。这里,作为例子,只用深市的交易数据作为研究对象。

该程序的运行结果是在本地建立一个data文件夹,里面存放着各只股票的交易数据。打开data文件夹中的文件(以sz000001为例),可以看到如表4-1所示的数据,第2~6列分别是日交易的开盘价、最高价、最低价、收盘价、成交量,第7列是收盘价的向前复权价。
表4-1 获得的股票交易数据

这里使用了一个重要的函数fetch,该函数的用法如下。

通过fetch函数可以从雅虎财经数据库中获取指定日期范围内的股票的日线数据,其中参数的含义如下。
• Connect:表示从哪里获取数据,这里是从雅虎财经数据库中获取股票数据,将Connect设置为yahoo。
• Security:表示获取哪一只股票的数据,这里将Security设置为需要获取数据的股票的代码,如果是沪市的股票,在股票代码后面加.ss;如果是深市的股票,在股票代码后面加.sz。例如,想获取沪市浦发银行的股票日交易数据,可将Security设置为600000.ss;想要获取深市万科A的股票日交易数据,可将Security设置为000000.sz。
• FromDate:指定时间范围的开始时间。
• ToDate:指定时间范围的结束时间。
读者可以自己运行该程序获得想要的数据,也可以直接利用已经获取的数据。
4.1.6 从大智慧获取公司财务数据
用MATLAB也可以获得公司财务数据,下面介绍一种用MATLAB获取公司财务数据的方法。先要安装大智慧,并下载数据到本地,然后就可以用MATLAB程序(见P4-2)将数据解析到Excel中。运行程序,打开数据文件,可以获得52列数据,这些数据包含的内容如表4-2所示。

表4-2 上市公司财务数据包含的内容

4.1.7 从Wind中获取高质量数据
Wind(万得)是中国领先的金融数据、信息和软件服务企业。在国内市场,Wind的客户包括超过90%的中国证券公司、基金管理公司、保险公司、银行和投资公司等金融企业;在金融财经数据领域,Wind已建成国内较完整、较准确的以金融证券数据为核心的一流的大型金融工程和财经数据仓库,数据内容涵盖股票、基金、债券、外汇、保险、期货、金融衍生品、现货交易、宏观经济、财经新闻等领域,并且这些数据更新比较及时,这对于量化投资非常有利。
如果已经安装了Wind,那么获取高质量的数据就比较容易,因为Wind提供外部数据接口。目前Wind提供了MATLAB、Excel、R、C/C++、C#等工具的接口,如图4-6所示。

图4-6 Wind数据接口示意图
下面介绍如何用MATLAB获取Wind的数据。在MATLAB命令行窗口中输入如下命令。

在MATLAB窗口右上角就会弹出向导,如图4-7所示。

图4-7 Wind在MATLAB上的数据向导
通过该向导,可以很容易地获取想要的数据。当然也可以通过与向导按钮名称一致的函数来获取数据。在量化投资中,常用的函数如表4-3所示。用户可以通过这些函数自动获取数据,然后利用这些数据进行量化分析。
表4-3 MATLAB与Wind混合使用时常用的函数

比如,可以用如下代码将Wind的数据保存到Excel中。

上述代码中使用的关键函数就是wsd。关于其他函数的具体用法,可以参考Wind提供的用法说明,这里不再赘述。