基于Spark MLlib的证券账户行为模式分析
上交所技术公司技术开发总部
黄寅飞
摘要:
本文基于Spark MLlib软件库,对证券账户特征进行K均值和高斯混合模型聚类,并对投影空间进行三维展示。利用距离指标和熵指标,指导K值选择,观察聚类效果和训练时间间的关系,并分析离群点特性。结果表明,开源机器学习工具在分布式环境可获得良好计算效果。
1 概述
互联网发展引发信息数据不断膨胀,传统单机机器学习无法满足海量数据和大规模模型需要,随之带来分布式机器学习技术的蓬勃发展。
上海证券市场拥有1076支股票产品(2015年8月时点),日交易峰值达13072亿元,活跃账户数5239万个(参考2015年6月至8月间数据)。在海量交易历史数据基础上,研究分析账户交易行为,有助于维护市场秩序、保证市场公平。在前期使用Spark分析交易数据的基础上[1],本文进一步分析账户行为特征,使用Spark MLLib进行账户聚类,以期更好地了解证券账户行为模式。[1]
1.1 产品概述
Apache Spark是一个分布式计算框架,在其核心引擎之上,提供了面向结构化数据、实时计算、机器学习和图计算的统一软件栈[2]。Spark SQL是操作结构化数据的组件,可使用SQL访问分布式数据仓库。Spark Streaming是对实时数据进行流式计算的组件,适合分布式环境数据采集和分析。MLlib是机器学习程序库,提供分类、回归、聚类、协同过滤、模型评估等一系列算法实现[3][4]。GraphX是图计算程序库,适合于社交网络关系计算。
Spark提供三套访问结构化数据的接口:RDD接口、SQL接口和DataFrame接口。RDD(弹性分布式数据集,Resilient Distributed Dataset)是Spark的原生数据模型,RDD接口可直接对数据进行转化、聚合、汇总等操作。SQL接口将传统SQL语法自动映射到RDD操作,进而提供对分布式数据的高速处理能力。DataFrame接口介乎RDD接口和SQL接口之间,提供关系表数据模型,比SQL接口计算效率高,比RDD接口编程可读性强。三套接口可以很容易地相互转换,实际使用中可以根据需要灵活选择。
1.2 技术概述
机器学习是人工智能领域的一个分支,目的是从数据中自动分析获得规律,并利用规律对未知数据进行预测[5]。机器学习可以分为监督学习、无监督学习和增强学习等类别。监督学习通过给定的训练数据进行集中学习,从而在面对新数据时进行预测。无监督学习的训练集没有人为标注的结果,根据数据特征进行自动聚类。增强学习的训练集不需要精确标注,可在奖励反馈下,通过规划校正获得优化规则。
聚类算法属于无监督学习。K均值(K-means)是基于质心的聚类算法,其原理是将数据点分割为K个不同的簇,令所有簇中数据点与质心距离方差之和最小。此外还有基于分布的高斯混合模型(GMM, Gaussian mixture model)聚类算法和基于密度的DBScan聚类算法等。
聚类评估通常分为两部分:内部评估和外部评估。内部评估基于无标注数据,外部评估则使用部分带标注数据。内部评估指标希望簇内部数据点距离尽可能接近,不同簇间的数据点相对较远。外部评估指标利用带标注数据,使用分类算法评估预测误差。
本文分析证券账户行为特征,利用Spark SQL作维度聚合以抽取特征,利用MLlib进行聚类。通过聚类评估和离群点评估,分析特征参数、聚类模型的效果,并试图对聚类结果的物理意义进行解读。
2 账户行为分析
2.1环境参数
试验环境为6台PC服务器(DL380,32核,128GB内存,1TB本地硬盘)构成的千兆网络集群。操作系统为64位RHEL 6.3,安装CDH 5.4.5(Hadoop 2.6.0),单独安装Spark 1.6.1,共用同一套HDFS文件系统,基于YARN集群调度。数据源为2015年6月至8月间上海证券市场的脱敏交易日志,共30.6亿条订单记录,38.1亿条成交记录。
试验所依据的数据仅为原始的订单和成交记录,不包含对账户的先验知识,也不包含账户持仓记录。活跃账户总数超过5千万,无法人为分辨出账户分类的规则。因此,首先需要用统计方法寻找账户的行为特征。
2.2 行为特征分析
特征之一是交易金额,取三个月交易总金额。机构投资者、大户、散户通常用交易金额加以区分,对应差异化的行为特征。从统计看,交易金额均值179万元,交易金额最高值达到6694亿元,账户的交易金额特征分布不均匀,95%的账户交易金额在495万元以内,99%的账户交易金额在2090万元以内,图1b中表现为靠近边缘的直线。对交易金额取对数后,接近正态分布,具有更好的统计特性,见图1d。
图1 交易金额;1a(左上):账户-金额分布;1b(右上):金额-账户分布;1c(左下):账户-对数金额分布;1d(右下):对数金额-账户分布
特征之二是日峰值比例,为日交易金额峰值与日均交易金额间的比例。日峰值比例反映出用户的交易手法,是频繁买进卖出,还是买入后持有一段时间。基于日峰值比例的账户数分布见图2,可以看到一个峰值点出现在65,代表这些账户只交易了一天,第二个峰值点出现在7附近,代表这些账户日峰值是日均值的7倍左右,第三个峰值点出现在33附近,代表这些账户交易了两天。将日峰值比例取倒数,推算交易天数均值,接近指数分布,说明市场主体呈现散户特征,见图2。从统计看,全市场账户平均交易5.40天,95%的账户交易天数均值少于14天,99%的账户交易天数均值少于20天。
图2 日峰值比例;2a(左上):账户-日峰值比例分布;2b(右上):日峰值比例-账户分布;2c(左下):账户-交易天数分布;2d(右下):交易天数-账户分布
特征之三是单笔金额。单笔金额反映出用户倾向于输入小额订单还是大额订单。假如交易金额很高,单笔金额较低,说明用户很可能使用算法交易执行订单。基于单笔金额的账户数分布不均匀,见图3b。同样对单笔金额取对数后,接近正态分布,见图3d。单笔金额均值为14.99万元,单笔金额对数均值为3.94,对应的单笔金额8897元是数量级意义上的均值。
图3 单笔金额;3a(左上):账户-单笔金额分布;3b(右上):单笔金额-账户分布;3c(左下):账户-对数单笔金额分布;3d(右下):对数单笔金额-账户分布
特征之四是产品数。用户买卖涉及的产品数反映出用户的交易策略,专业投资者往往关注更多的产品,普通投资者往往关注产品较少。此外,一户多人的账户涉及产品数会比较多。从统计看,只交易一支股票的账户有812万个,占账户总数的15.5%,95%的账户交易产品数少于19个,99%的账户交易产品数少于33个。基于产品数的账户数分布不均匀,见图4b。对产品数取对数后,分布见图4d。
图4 产品数;4a(左上):账户-产品数分布;4b(右上):产品数-账户分布;4c(左下):账户-对数产品数分布;4d(右下):对数产品数-账户分布
特征之五是买卖差比例,取买入卖出差与交易金额的比例。在三个月周期内用户是净买入还是净卖出,反映出用户的多空倾向。基于买卖差比例的账户数分布见图5。可以看到有三个峰值,分别对应全部买入、全部卖出和买卖均衡,其中6.95%的账户只有买入,4.58%的账户只有卖出。
图5 买卖差比例;5a(左):账户-买卖差比例分布;5b(右):买卖差比例-账户分布
特征之六是撤单比。程序化交易策略为了寻找最优价格,往往出现不断申报撤单的现象,在单边上涨或下跌的市场尤为频繁。基于撤单比的账户数分布见图6。可以看到20.8%的账户从不撤单,统计发现撤单比超过50%的账户占比为6.29%。
图6 撤单比;6a(左):账户-撤单比分布;6b(右):撤单比-账户分布
特征之七是日频度峰值。每日交易次数代表了用户的活跃程度。基于日频度峰值的账户数分布见图7b。从统计看,95%的账户日交易少于17次,99%的账户日交易少于31次。每日交易次数达到上千次甚至数十万次的用户,基本可以判断使用计算机算法辅助下单。对日频度峰值取对数后,分布见图7d。
图7 日频度峰值;7a(左上):账户-日频度峰值分布;7b(右上):日频度峰值-账户分布;7c(左下):账户-对数日频度峰值分布;7d(右下):对数日频度峰值-账户分布
2.3特征抽取与归一化
订单日志和成交日志为结构化数据,按照交易日期分区,以Parquet列存压缩格式存于HDFS分布式文件系统中。使用Spark SQL从订单表和成交表聚合查询,获得包含交易金额(amt)、日峰值比例(daily)、单笔金额(single)、产品数(sec)、买卖差比例(buysell)、撤单比(withdraw)和日频度峰值(hf)等特征的若干表,并连接成为特征表。对特征表进行归一化,得到归一化特征集合。
3 聚类试验
试验环境为6台PC服务器构成的千兆网络集群。活跃账户总计52395034个,每个账户取7个特征。采用无监督聚类算法,对账户行为特征进行机器学习。
3.1聚类模型
分别选择基于质心的 K均值模型和基于分布的高斯混合模型,对账户特征进行聚类,观察聚类效果并进行比较。
3.1.1 K均值模型
K均值模型将数据点分割成K个簇,通过训练,令所有簇中数据点与质心距离方差之和最小。
设数据集合T包含N个数据点:x0, x1, ……, xN-1。每个点由M维特征构成,xi=[x(i,0),x(i,1),……,x(i,M-1)]。两点间的距离采用欧式距离计算,公式如下:
训练获得K个簇质心:c0,c1,……,cK-1。每个质心由M维特征构成,cq=[c(q,0),c(q,1),……,c(q,M-1)]。设数据点x对应簇q的质心cq的映射函数为c(x)。数据点与对应簇质心间距离,计算公式如下:
寻找簇质心集合,令如下目标函数最小:
使用Spark MLlib中的KMeans类作K均值建模,设置最大迭代次数为20,设置两次迭代目标函数差阈值为1e-6,设置每次迭代跑5遍以避免陷入局部最优。
3.1.2高斯混合模型
高斯混合模型将数据点分割成K个簇,每个簇对应一个高斯分布,数据点属于某一簇的概率由该簇的高斯分布来决定,概率最大的簇即判定为数据点所属簇。 设簇s的高斯分布为F(x|ms,ss),权重为ws,则数据点xi属于各簇的概率计算公式如下:
寻找簇分布参数,令如下目标函数最大化:
使用Spark MLlib中的GaussianMixture类作高斯混合模型建模,使用缺省参数设置。
3.2参数试验
K值无法通过先验知识进行选择,需要通过试验确定合适的簇的数量。聚类效果可通过指标进行评估。距离指标D定义为各数据点与对应簇质心间距离的均值。距离指标对应于空间距离意义上簇的集中度。公式如下:
熵指标E定义为所有数据点携带信息熵的总和。熵指标对应于簇划分的拓扑结构。设K类每个簇s包含的数据点个数为Ns。公式如下:
从2、3、……、600中依次取23个K值,进行K值选择试验。随着K值增大,模型训练时间从42秒逐步增长到2674秒,见图8。
图8 K均值训练效果vs训练时间,score曲线对应距离指标D
从图9评估曲线可以看到,一开始K值从2增加到100期间,指标提升比较明显,随着K值超过100越来越大,指标提升相对平缓,而训练时间依然是线性上升。尽管增大K值能提升聚类效果,但K值大到一定程度后提升效果已相当有限,考虑到计算资源消耗,模型经济性已大幅下降。
图9 K均值评估:score曲线对应距离指标D,entropy曲线对应熵指标E
3.3效果评估
从5000余万账户数据中取5000个采样点,随机选择3个特征维度,将特征空间投影到三维空间,进行可视化展现。使用plot3D绘制散点图,将不同类别标注不同颜色,以观察聚类效果[6]。通过鼠标拖动改变观察视角,以更好地选择类与类的区分边界。图10为K均值(K=10)聚类效果,投影到amt -daily-buysell特征空间。图11为高斯混合模型聚类效果,投影到amt -daily-buysell特征空间。
图10 K均值聚类投影图
图11 高斯混合模型聚类投影图
从投影效果看,同种颜色的点基本聚集在接近的空间内,不同颜色的簇间形成边界,由于三维空间只是七维特征空间的投影和近似,簇边界存在一定混杂。基于质心的K均值聚类边界相对清晰些,基于概率分布的高斯混合模型聚类边界相对模糊些。
3.4离群点检测
在将数据集合聚为若干簇后,各个簇内仍然会有少数数据点距离质心很远。将数据点根据与对应簇质心间距离L(x,c(x))进行排序,设置阀值比例r,定义超出阀值比例r的数据点为离群点。对于证券账户数据来说,离群点相当于对异常行为账户进行了量化,而对这些离群点的观察则有助于加强对异常行为的理解。
对账户数据进行K均值聚类(K=10)后,取r=0.99,发现离群点与对应簇质心间距离超出3.28,取r=0.9993,发现离群点与对应簇质心间距离超出7,总数为 3868个。
观察这些离群点,发现具备一定的相似性。取某一离群点,与类中心距离为11.6,交易金额594亿元,交易50.7天,单笔金额861万元,交易产品992支,买单比例近乎100%,撤单比例近乎100%,日频度峰值660万笔。这是一个明显的程序化交易账户。
4 小结
在前文[1]对证券交易数据在产品、时间和账户维度上进行统计汇总的基础上,本文进一步利用机器学习算法进行聚类,分析聚类效果和离群点特性。下一步可结合具体的业务实践,从产品板块、时间序列等角度进行相关度分析。
本文使用的是账户的简单统计特征,下一步可抽取账户的盈亏点、持仓周期等分布特征,以期更深层地挖掘账户行为模式。
参考文献
[1] 黄寅飞. 基于Hadoop和Spark的证券交易数据分析. 交易技术前沿. 2015:第4期.
[2] H. Karau, A. Konwinski, P. Wendell and M. Zaharia 著,王道远 译. Spark快速大数据分析. 人民邮电出版社. 2015
[3] Nick Pentreath著,蔡立宇等译. Spark机器学习. 人民邮电出版社. 2015
[4] S. Ryza, U. Laserson, S. Owen, J. Wills著,龚少成 译. Spark高级数据分析. 人民邮电出版社. 2015
[5] 李航. 统计学习方法. 清华大学出版社. 2012
[6] Wes McKinney著,唐学韬等译. 利用Python进行数据分析. 机械工业出版社. 2014
声明: 此文观点不代表本站立场;转载须要保留原文链接;版权疑问请联系我们。