class: center, middle, inverse, title-slide .title[ # 财务管理理论与实务 ] .subtitle[ ## Financial Data Mining ] .author[ ### 唐润宇 ] .date[ ### 2023-10-10 ] --- # 数据挖掘 Data mining 数据挖掘(Data Mining)就是从大量的数据中,提取隐藏在其中的,事先不知道的、但潜在有用的信息的过程。 常见任务 <https://en.wikipedia.org/wiki/Data_mining> - 异常检测: 识别不寻常的数据记录,错误数据需要进一步调查。 - 关联规则学习: 搜索变量之间的关系。 - 聚类: 是在未知数据的结构下,发现数据的类别与结构。 - 分类: 是对新的数据推广已知的结构的任务。 - 回归: 试图找到能够以最小误差对该数据建模的函数。 - 汇总: 提供了一个更紧凑的数据集表示。 Ref: Data mining in R: <https://www.rdatamining.com/> --- ## 数据降维 > Human minds are good at recognizing patterns in two dimensions and to some extent in three, but are essentially useless in higher dimensions. 常见方法: - PCA 主成分分析 - ICA 独立分量分析 - kPCA 核主成分分析 - MDS 多维标度分析 Ref: Hastie, T., Tibshirani, R., Friedman, J. H., & Friedman, J. H. (2009). _The elements of statistical learning: data mining, inference, and prediction_ (Vol. 2, pp. 1-758). New York: springer. --- ## PCA 主成分分析是一种通过降维技术把多个变量化为少数几个主成分(综合变量)的统计分析方法。 这些主成分能够反映原始变量的绝大部分信息,它们通常表示为原始变量的某种**线性组合,且彼此不相关**。 1901年由 Karl Pearson发明。 常用的科学手段:2020年Nature中有124篇文章使用了该方法。<https://mathvoices.ams.org/featurecolumn/2021/08/01/principal-component-analysis/> --- ## PCA - 每一个主成分都是各原始变量的线性组合 - 主成分的数目大大少于原始变量的数目 - 主成分保留了原始变量的绝大数**信息** - 各个主成分之间互不相关。 -- 什么是信息?Or 什么样的变量信息量更大? .pull-left[ ![](Figs/PCA1.png) ] .pull-right[ ![](Figs/PCA2.png) ] --- ## PCA .pull-left[ - 从不同视角观测弹簧拉长变化 - 选择最优的视角? ] .pull-right[ ![](Figs/PCA_spring.png) ] --- ## PCA的数学定义 假设数据有p维特征 `\(\mathbf{x}=[𝑥_1,𝑥_2,…,𝑥_𝑝]′\)`, 假设我们知道其协方差矩阵为 `\(\Sigma\)`. 考虑线性组合 `$$𝑦_1=𝒂_𝟏^′ 𝒙=𝑎_{11} 𝑥_1+𝑎_{21} 𝑥_2+…+𝑎_{𝑝1} 𝑥_𝑝$$` `$$y _2=𝒂_𝟐^′ 𝒙=𝑎_{12} 𝑥_1+𝑎_{22} 𝑥_2+…+𝑎_{𝑝2} 𝑥_𝑝$$` `$$…$$` `$$𝑦_𝑝=𝒂_𝒑^′ 𝒙=𝑎_{1𝑝} 𝑥_1+𝑎_{2𝑝} 𝑥_2+…+𝑎_{𝑝𝑝} 𝑥_𝑝$$` 我们有 `\(Var(𝑦_𝒊 )=𝒂_𝒊^′ 𝚺𝒂_𝒊, Cov(𝑦_𝑖,𝑦_𝑗 )=𝒂_𝒊^′ 𝚺𝒂_𝒋\)`。 **主成分**:使得 `\(Var(𝑦_𝑖 )\)` 尽可能大的线性无关的 `\(𝑦_𝑖\)` 其中 `\((𝒂_𝒊^′ 𝒂_𝒊=𝟏)\)` 。 -- 假设p维随机向量 `\(\mathbf{x}\)` 的协方差矩阵 `\(\mathbf{\Sigma}\)` 的特征值和特征向量为 `\((\lambda_1, 𝒆_𝟏 ),(\lambda_2, 𝒆_𝟐 ),…,(\lambda_𝑝, 𝒆_𝒑 )\)`, 其中 `\(𝜆_1≥𝜆_2≥…≥𝜆_𝑝≥0\)`, 则第 `\(i\)`个主成分为 `$$𝒚_𝒊=𝒆_𝒊^′ 𝒙=𝑒_{𝑖1} 𝑥_1+𝑒_{𝑖2} 𝑥_2+…+𝑒_{𝑖𝑝} 𝑥_𝑝, \quad 𝑖=1,2,…,𝑝$$` --- ## 一些基础知识回顾 - 协方差矩阵: 是一个方阵,其 `\(i,j\)` 位置的元素是第 `\(i\)` 个与第 `\(j\)` 个随机变量之间的协方差。 $$ \Sigma_{ij} = cov(x_i, x_j) = E[(x_i - \mu_i)(x_j - \mu_j)] $$ - 有的时候我们会给数据标准化,此时对应着相关系数矩阵 `\(R\)`。 $$ R_{ij} = corr(x_i, x_j) = \frac{cov(x_i, x_j)}{\sigma_i \sigma_j}. $$ - (对称)矩阵的特征值分解(Eigendecomposition) $$ A = Q \Lambda Q^\top $$ ![](Figs/EigenDecomp.png) --- ## PCA 例子 CSMAR数据库 -> 财务指标分析 -> 偿债能力 时间跨度: 2022/01/01-2023/06/30 ```r library(tidyverse) library(readxl) setwd("~/XJTU/课程/财务管理理论与实务/Codes") data = read_xlsx("../Data/FI_T1.xlsx", skip = 1) str(data) ``` ``` ## tibble [50,254 × 35] (S3: tbl_df/tbl/data.frame) ## $ 股票代码 : chr [1:50254] "没有单位" "000001" "000001" "000001" ... ## $ 股票简称 : chr [1:50254] "没有单位" "平安银行" "平安银行" "平安银行" ... ## $ 统计截止日期 : chr [1:50254] "没有单位" "2022-03-31" "2022-03-31" "2022-06-30" ... ## $ 报表类型编码 : chr [1:50254] "没有单位" "A" "B" "A" ... ## $ 行业代码 : chr [1:50254] "没有单位" "J66" "J66" "J66" ... ## $ 行业名称 : chr [1:50254] NA "货币金融服务" "货币金融服务" "货币金融服务" ... ## $ 公告来源 : chr [1:50254] "没有单位" "0.0" "0.0" "0.0" ... ## $ 流动比率 : chr [1:50254] "没有单位" NA NA NA ... ## $ 速动比率 : chr [1:50254] "没有单位" NA NA NA ... ## $ 保守速动比率 : chr [1:50254] "没有单位" NA NA NA ... ## $ 现金比率 : chr [1:50254] "没有单位" NA NA NA ... ## $ 营运资金与借款比 : chr [1:50254] "没有单位" NA NA NA ... ## $ 营运资金 : chr [1:50254] "元" NA NA NA ... ## $ 利息保障倍数A : chr [1:50254] "没有单位" NA NA NA ... ## $ 利息保障倍数B : chr [1:50254] "没有单位" NA NA NA ... ## $ 经营活动产生的现金流量净额/流动负债: chr [1:50254] "没有单位" NA NA NA ... ## $ 现金流利息保障倍数 : chr [1:50254] "没有单位" NA NA NA ... ## $ 现金流到期债务保障倍数 : chr [1:50254] "没有单位" NA NA NA ... ## $ 资产负债率 : chr [1:50254] "没有单位" "0.920637" "0.921012" "0.919335" ... ## $ 长期借款与总资产比 : chr [1:50254] "没有单位" "0.0" "0.0" "0.0" ... ## $ 有形资产负债率 : chr [1:50254] "没有单位" "0.92302" "0.923397" "0.921696" ... ## $ 有形资产带息债务比 : chr [1:50254] "没有单位" "0.0" "0.0" "0.0" ... ## $ 权益乘数 : chr [1:50254] "没有单位" "12.600355" "12.660201" "12.396993" ... ## $ 产权比率 : chr [1:50254] "没有单位" "11.600355" "11.660201" "11.396993" ... ## $ 权益对负债比率 : chr [1:50254] "没有单位" "0.086204" "0.085762" "0.087742" ... ## $ 长期资本负债率 : chr [1:50254] "没有单位" "0.0" "0.0" "0.0" ... ## $ 长期负债权益比率 : chr [1:50254] "没有单位" "0.0" "0.0" "0.0" ... ## $ 长期债务与营运资金比率 : chr [1:50254] "没有单位" NA NA NA ... ## $ 息税折旧摊销前利润/负债合计 : chr [1:50254] "没有单位" NA NA NA ... ## $ 经营活动产生的现金流量净额/负债合计: chr [1:50254] "没有单位" "0.031854" "0.03166" "0.032633" ... ## $ 经营活动产生的现金流量净额/带息债务: chr [1:50254] "没有单位" NA NA NA ... ## $ 负债与权益市价比率 : chr [1:50254] "没有单位" "0.940429" "0.940577" "0.941712" ... ## $ 有形净值债务率 : chr [1:50254] "没有单位" "11.763819" "11.825342" "11.551613" ... ## $ 固定支出偿付倍数 : chr [1:50254] "没有单位" NA NA "18.13942" ... ## $ 权益乘数2 : num [1:50254] NA 12.5 12.6 12.4 12.5 ... ``` --- ## PCA 例子 整理数据: - 选取每个公司最新的数据 - 转换数据格式 - 删掉非数字的变量 - 删掉NA的公司 ```r PCA_data <- data |> group_by(股票代码) |> slice(which.max(as.Date(统计截止日期, '%Y-%m-%d'))) |> ungroup() |> type_convert() |> select(-c(1:7)) |> drop_na() # str(PCA_data) ``` --- ## PCA 例子 在做PCA之前,我们可以观察一下我们的数据的相关系数矩阵 ```r names(PCA_data) <- c(1:length(PCA_data)) cor.mat <- cor(PCA_data) library("corrplot") corrplot(cor.mat, type="upper", order="hclust", tl.col="black") ``` <img src="lecture2_files/figure-html/unnamed-chunk-3-1.png" style="display: block; margin: auto;" /> --- ## PCA 例子 我们使用**FactoMineR**帮助我们做PCA ```r library(FactoMineR) pca.res <- PCA(PCA_data) ``` ![](lecture2_files/figure-html/unnamed-chunk-4-1.png)<!-- -->![](lecture2_files/figure-html/unnamed-chunk-4-2.png)<!-- --> --- ## PCA 例子 ```r library(factoextra) fviz_screeplot(pca.res) ``` ![](lecture2_files/figure-html/unnamed-chunk-5-1.png)<!-- --> --- ## PCA 例子 PCA的结果里面有很多东西,比如我们通常比较关注的特征值和特征向量。 ```r pca.res <- PCA(PCA_data, ncp=5, graph=FALSE) round(pca.res$eig, 3) ``` ``` ## eigenvalue percentage of variance cumulative percentage of variance ## comp 1 7.732 27.614 27.614 ## comp 2 3.324 11.870 39.484 ## comp 3 2.889 10.319 49.803 ## comp 4 2.163 7.726 57.529 ## comp 5 1.999 7.139 64.669 ## comp 6 1.174 4.193 68.862 ## comp 7 1.059 3.782 72.643 ## comp 8 1.001 3.576 76.220 ## comp 9 0.996 3.559 79.779 ## comp 10 0.976 3.487 83.265 ## comp 11 0.866 3.094 86.359 ## comp 12 0.834 2.978 89.337 ## comp 13 0.520 1.856 91.193 ## comp 14 0.434 1.548 92.742 ## comp 15 0.385 1.375 94.117 ## comp 16 0.329 1.174 95.291 ## comp 17 0.302 1.080 96.371 ## comp 18 0.270 0.965 97.335 ## comp 19 0.223 0.796 98.131 ## comp 20 0.148 0.530 98.661 ## comp 21 0.126 0.450 99.112 ## comp 22 0.075 0.270 99.381 ## comp 23 0.062 0.222 99.603 ## comp 24 0.058 0.209 99.812 ## comp 25 0.031 0.112 99.923 ## comp 26 0.019 0.068 99.991 ## comp 27 0.003 0.009 100.000 ## comp 28 0.000 0.000 100.000 ``` --- ## PCA的应用 --- 图片压缩 .pull-left[ 一张图片是由三原色(RGB)叠加出来的。 每个颜色下面都是一个矩阵,矩阵的维度就是我们常说的像素数。 例: 某遥遥领先品牌新机: <https://consumer.huawei.com/cn/phones/mate60-pro/specs/> - 后置摄像头: 5000 万像素超光变摄像头 - 后置摄像头照片分辨率: 最大可支持 8192 × 6144 像素 ] .pull-right[ <img src="Figs/RGB.png" width="1371" /> ] --- ## PCA的应用 --- 图片压缩 .pull-left[ <img src="Figs/xjtu_lib.png" width="951" /> ] .pull-right[ 我们尝试着压缩一张钱学森图书馆的图片。 ```r library(png) image <-readPNG("../Data/xjtu.png") str(image) ``` ``` ## num [1:535, 1:713, 1:3] 0.886 0.886 0.886 0.886 0.886 ... ``` 原图的大小为535*713. ] --- ## PCA的应用 --- 图片压缩 .pull-left[ <img src="xjtu_10.png" width="951" /> 主成分数量 = 10 ] .pull-right[ <img src="xjtu_50.png" width="951" /> 主成分数量 = 50 ] --- ## PCA的应用 .pull-left[ - 78000岁的尸骨墓穴 - 如何确定是“墓穴”呢? - 骨头周围的泥土成分和周围成分泥土成分显著不同! - 80 个土壤样本 - 每个样本中13维信息(Si, K, Ca, Ti, Mn, Fe, Zn, Ga, As, Rb, Y, Zr and Ba) .foot[Earliest known human burial in Africa,published in _Nature_ on May 5, 2021] ] .pull-right[ <img src="Figs/PCA_burial.png" width="1133" /> ] --- ## PCA的应用 <img src="Figs/FirmPCA.png" width="1605" height="280px" /> > 白重恩等. 中国上市公司治理结构的实证研究[J]. 经济研究 , 2005, 11. > 张学勇,廖理.股权分置改革、自愿性信息披露与公司治理[J].经济研究, 2010, 45(04): 28-39+53. > 胡楠,薛付婧,王昊楠.管理者短视主义影响企业长期投资吗?——基于文本分析和机器学习[J].管理世界, 2021, 37(05):139-156+11+19-21 --- ## PCA 的局限性 ![](Figs/PCA_fail.png) --- ## 其他数据降维方法 - kPCA: 将线型函数使用核函数(kernal)变成非线性,可以描述更加复杂的关系 kernlab::kpca - ICA: 放松PCA中的不同主成分需要线性无关的假设 ica::ica - MDS: Multidimensional scaling 我们有n个观测值 `\(x_1, \ldots, x_n \in \mathbb{R}^p\)`, 每个观测值是 p 维的,那么MDS需要找到一组投影 `\(z_1, \ldots, z_n \in \mathbb{R}^k\)`, `\(k<p\)` 使得下面的stress function取得最小。 `$$\min_{z_1, \ldots, z_n} \ \sum_{i \neq j} (d_{ij} - \Vert z_i-z_j \Vert)^2.$$` 实际上就是找一个低维的投影,但是能够维持原数据之间的间隔。 如果我们取 `\(d_{ij} = \langle x_i -\mu_i, x_j - \mu_j \rangle\)`, 那么此时MDS就与PCA一样了。 我们可以使用R语言中的**cmdscale**函数实现MDS. --- ## 聚类分析 - 分类: 有监督学习 - 聚类: 无监督学习 All relate to grouping or segmenting a collection of objects into subsets or "clusters", such that those within each cluster are more closely related to one another than objects assigned to different clusters. 常见的聚类方法: > K-means: 基于距离的聚类 > DBSCAN: 基于密度的聚类 > Hierachical Clustering: 层次化聚类方法 --- ## K means ![](Figs/kmeans.gif) --- ## DBSCAN ![](Figs/DBSCAN.gif) ??? 需要两个参数, `\(\epsilon\)` 半径大小 和 minpts 每个簇里面点个数 - Find core samples of high density - Expand clusters from core samples - Assign noise samples to nearest cluster 不用给类别数量 --- ## Agglomerative 层次聚类 .pull-left[ ![](Figs/Clusters.png) ] .pull-right[ ![](Figs/Hierarchical_clustering_simple_diagram.png) ] ??? Dendrogram: a tree-like diagram used to illustrate the arrangement of the clusters produced by hierarchical clustering. - Agglomerative: bottom-up approach, each observation starts in its own cluster, and clusters are successively merged together. - Divisive: top-down approach --- ## 常见聚类算法比较 上述常见的聚类算法有着不同的优缺点,我们需要针对数据的不同选择合适的方法。 当然我们也可以都试试看~ | 算法 | 数据类型 | 抗噪点 | 聚类形状|算法效率 | | ------- | -------- | -------- | --------| -------- | | K-means | 混合型 | 较差 | 球形 | 很高| | DBSCAN | 数值型 | 较好 | 任意形状 | 一般| | Agglomerative | 混合型 | 较好 | 任意形状 | 较差| --- ## 例子 K-means 效果 ```r library(cluster) fviz_nbclust(PCA_data, kmeans, method = "wss", k.max=20) km <- kmeans(PCA_data, centers=14) fviz_cluster(km, data = PCA_data) ``` ![](lecture2_files/figure-html/unnamed-chunk-14-1.png)![](lecture2_files/figure-html/unnamed-chunk-14-2.png) --- ## 例子 DBSCAN 效果 ```r library(fpc) db <- dbscan(PCA_data, eps =200000000) fviz_cluster(db, data = PCA_data) ``` ![](lecture2_files/figure-html/unnamed-chunk-15-1.png)<!-- --> --- ## 例子 Agglomeration 效果 ```r distance <- get_dist(PCA_data, stand=TRUE) hcl <- hclust(distance, method = "complete") plot(hcl, labels=FALSE) hc_cut <- hcut(distance, k=10, hc_method = "complete") fviz_cluster(hc_cut, data = PCA_data) ``` ![](lecture2_files/figure-html/unnamed-chunk-16-1.png)![](lecture2_files/figure-html/unnamed-chunk-16-2.png) --- # 文本挖掘 我们的财务数据里面也有很多例如公司简介的文本信息,我们可以使用R对这些文本进行分析。 ![](Figs/textmine.png) ```r data <- read_csv("../Data/IRR_ListedInfo.csv") newdata <- data |> select(ShortName, CompanyProfile) |> drop_na() ``` Ref: <https://www.tidytextmining.com/> --- ```r test <- newdata$CompanyProfile library(jiebaR) library(tm) library(tmcn) library(wordcloud2) cutter = worker() # we can add more options here test_seg = segment(test, cutter) test_df = data.frame(table(test_seg)) new_df <- test_df |> filter(Freq > 1) wordcloud2(new_df) ```
--- Claudia Goldin 发表刊物标题词云 <img src="Goldin.png" width="1147" />