通过主成分分析实现检测金融中的异常交易模式

news2024/11/15 17:31:39

主成分分析(PCA)是一种在机器学习和数据科学中广泛使用的降维技术。它的主要目的是将高维数据转换为低维数据,同时尽可能保留原始数据中的信息。以下是PCA的一些关键点:
1. 基本概念:PCA的核心思想是将n维特征映射到k维上,这k维是在原有n维特征的基础上重新构造出来的,它们被称为主成分。这些主成分是相互正交的,即彼此之间没有相关性。
2. 工作原理:
   - 标准化数据:首先对数据进行标准化处理,确保每个特征具有相同的量纲。
   - 计算协方差矩阵:计算标准化数据的协方差矩阵,该矩阵反映了原始数据各维度之间的相关性。
   - 特征值分解:对协方差矩阵进行特征值分解,得到特征值和对应的特征向量。
   - 选择主成分:选择前k个最大的特征值对应的特征向量,它们构成了新的坐标轴,即主成分。
   - 降维:将原始数据投影到这k个主成分上,得到降维后的数据。
3. 实际应用:PCA在多个领域都有应用,包括数据降维、特征提取、数据压缩和异常检测等。例如,在图像处理中,PCA可以用于降维和特征提取,帮助识别和分类图像;在金融领域,它可以用于检测异常交易模式。
总的来说,PCA是一种强大的数据分析工具,能够帮助我们从复杂数据中提取关键信息,简化数据结构,而不会显著损害原始数据的完整性。

以下是一个简化的示例,展示如何使用Python和PCA来识别潜在的异常交易。通过这个例子了解主成分分析的使用方法。

首先,你需要准备交易数据,这里假设我们有一组股票的交易数据,包括交易量、价格波动等特征。

以下是使用Python实现PCA进行异常检测的基本步骤:

  1. 数据预处理:包括数据清洗、标准化。
  2. 应用PCA:计算主成分并选择最重要的几个。
  3. 异常检测:基于主成分得分来识别异常。

Step1:构建符合有异常交易的数据

先导入库

import pandas as pd
import numpy as np

这里,我们导入了pandasnumpy库,它们是Python中进行数据处理和数值计算的常用库。

设置随机种子

np.random.seed(42)

通过设置随机种子,我们确保每次运行代码时生成的随机数序列都是相同的,这有助于代码的可复现性。

定义交易记录数量

num_transactions = 100

这里定义了模拟数据集中交易记录的数量,即100条。

生成模拟数据

# 创建一些模拟的特征:交易量(volume),价格变动(price_change),交易次数(trade_count)
volume = np.random.normal(loc=1000, scale=200, size=num_transactions)
price_change = np.random.normal(loc=0, scale=5, size=num_transactions)
trade_count = np.random.poisson(lam=5, size=num_transactions)

交易量:使用numpyrandom.normal函数生成正态分布的随机数,代表交易量。loc=1000是均值,scale=200是标准差,size=num_transactions指定生成的随机数的数量。

价格变动:同样,这里生成代表价格变动的正态分布随机数,均值为0,标准差为5。

交易次数:使用numpyrandom.poisson函数生成泊松分布的随机数,代表交易次数。lam=5是泊松分布的参数,表示事件的平均发生率。

再创建DataFrame:

# 将这些特征放入一个DataFrame中
df = pd.DataFrame({
    'volume': volume,
    'price_change': price_change,
    'trade_count': trade_count
})

使用pandasDataFrame创建一个数据框,将生成的交易量、价格变动和交易次数数据放入其中。

再添加异常值

# 为了演示异常检测,我们手动添加一些异常值
# 假设有5个异常交易
num_outliers = 5
outlier_indices = np.random.choice(num_transactions, num_outliers, replace=False)

# 在这些异常交易中,我们增加交易量和价格变动
df.loc[outlier_indices, 'volume'] *= 5
df.loc[outlier_indices, 'price_change'] *= 5

设定要添加的异常交易数量为5。使用numpyrandom.choice函数随机选择5个不重复的索引作为异常交易的索引。

显示前10条记录

df.head(10)

使用DataFramehead方法显示数据框的前10条记录,以检查数据的样式和异常值是否成功添加。

这样就构建一个包含正常交易和异常交易的数据集。数据前10行如下:

Step2:主成分分析(PCA)实现与结果可视化

先导入库:

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline

sklearn库中的PCAStandardScalermake_pipeline用于执行主成分分析和数据标准化。

再进行数据预处理:

scaler = StandardScaler()
df_scaled = scaler.fit_transform(df)

使用StandardScaler对交易数据进行标准化处理,即转换数据以具有0均值和单位方差。这是PCA之前的一个重要步骤,因为PCA对数据的尺度敏感。

应用主成分分析(PCA)

# 应用PCA
pca = PCA(n_components=2)  # 假设我们保留2个主成分
pca.fit(df_scaled)
components = pca.transform(df_scaled)
  • 初始化PCA对象,设置保留的主成分数量为2,即我们希望将数据投影到2维空间。

  • 使用标准化后的数据拟合PCA模型

  • 使用PCA模型转换原始数据,得到主成分得分。

解释方差比例

explained_variance_ratio = pca.explained_variance_ratio_

获取每个主成分解释的方差比例,这可以帮助我们了解每个主成分捕获了多少原始数据的方差信息。

异常检测:

# 异常检测
# 基于主成分得分来识别异常
# 这里我们使用一个简单的阈值方法,实际应用中可能需要更复杂的方法
threshold = 3  # 设定一个阈值,例如3个标准差
outliers = np.abs(components) > threshold

# 找出异常交易的索引
outlier_indices = np.where(outliers.any(axis=1))[0]
  • 设定一个阈值,这里设为3个标准差,用于识别异常值,在统计学中,要确定三个标准差具体是多少,我们需要知道数据集的平均值(mean)和标准差(standard deviation,σ)。一个数据点如果其值超过平均值加上或减去三个标准差(3σ),则通常被认为是一个异常值或离群值。

  • 通过比较主成分得分与阈值,创建一个布尔数组,标记出哪些交易是异常的。

  • 使用np.whereany函数找出标记为异常的交易索引。

打印异常交易的详细信息:

print("异常交易的索引:", outlier_indices)
for index in outlier_indices:
    print(f"交易ID: {index}, 主成分得分: {components[index]}")

结果如下:

可视化主成分,帮助理解异常:

# 可视化主成分,帮助理解异常
import matplotlib.pyplot as plt
from matplotlib.font_manager import FontProperties
# 设置支持中文的字体
plt.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体为黑体
plt.rcParams['axes.unicode_minus'] = False  # 确保负号'-'可以正常显示

plt.scatter(components[:, 0], components[:, 1])
plt.xlabel('主成分1')
plt.ylabel('主成分2')
plt.title('交易数据的主成分分析')
plt.grid(True)
plt.show()

显示异常结果如下:

以上就是使用Python实现PCA进行金融交易数据中的异常检测的基本步骤。

点下关注,分享更多有关AI,数据分析和量化金融相关的实用教程和项目。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2072032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5步实现猫眼电影爬虫与k-means算法可视化分析

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

C#二叉搜索树算法

二叉搜索树算法实现原理 二叉搜索树(Binary Search Tree,简称BST)是一种节点有序排列的二叉树数据结构。它具有以下性质: 每个节点最多有两个子节点。 对于每个节点,其左子树的所有节点值都小于该节点值,…

MySQL数据库连接超时问题排查报告

1、问题描述 边端设备访问云端过程中有概率出现MySQL数据库连接超时报错,具体报错代码如下: [2024-08-13 13:47:44,036] ERROR in app: Exception on /est-tasks/start [POST] Traceback (most recent call last): File "/usr/local/lib/python3.1…

Java 入门指南:Map 接口

Map 接口是 Java 集合框架中的一个接口,它表示了一种键值对的映射关系。Map 接口提供了一种以键为索引的数据结构,通过键可以快速查找对应的值。在 Map 中,每个键只能对应一个值,键是唯一的,但值可以重复。 常用的实现…

在vscode上便捷运行php文件

目录 前言 1. 准备工作 2. 创建文件 3. 下载插件 4.设置访问配置文件 5. 配置默认浏览器 6. 进行验证 前言 对于学习安全的我们来说,部署环境,靶场,和配置环境都是习以为常的一件事情,平时访问靶场都是通过小皮来,今天突想着最近需要对一些漏洞的原理进行研究,所以需要能够…

ESP-WHO C++程序分析基础(七)

以按键部分的程序做为分析基础 先看app_button.hpp文件,文件的路径如下 examples/esp32-s3-eye/main/include/app_button.hpp // AppButton 类,继承自 Subject 类,表示应用程序按钮 首先是先定义了一个 appbutton的按键类,这个…

【计算机组成原理】汇总三、存储系统

三、存储系统(存储器层次结构) 文章目录 三、存储系统(存储器层次结构)1.存储器的分类1.1按在计算机中的作用(层次)❗多级存储结构(层次化结构)1.2按存储介质1.3按存取方式1.4按信息…

抢单源码修正版,带教程,自动抓取订单,十几种语言可自动切换

亚马逊抢单源码自动抓取订单任务邀请英文,西班牙语可自动切换语言亲测修正版。带完整开源的前后台。 西班牙,英文,巴西,中文,德国,拉法兰西,荷兰,缅甸,Sverige,日本,Trk…

C_02基础学习

c 语言 基础 gcc编译器 作用: 将代码文件编译为可执行文件 分类: 一步到位gcc 要编译的代码文件 -o 生成的可执行文件注意:要编译的代码文件可以是多个-o 生成的可执行文件:可以忽略不写,默认生成a.out文件 分步实现预编译:头文件展示,宏替换,选择型编译gcc -E 要编译的代码…

VMware NET Service在虚拟机关闭后仍然占用CPU - 解决方案

问题 VMware NET Service(即vmnat.exe)在虚拟机关闭后仍然占用CPU,这是VM 17.5.0 和 VM 17.5.1 软件本身存在的Bug,此问题已在 VM 17.5.2 版本修复,下文介绍解决方案。 时间:2024年8月 解决方案 临时方…

百度网盘网页提示页面过期请刷新 - 解决方案

问题 当打开百度网盘网页的分享链接后,点击下载会提示页面过期请刷新,点击保存到网盘没有响应,刷新后存在同样问题。 原因 这通常是因为浏览器中安装了屏蔽广告的插件,此插件不只拦截了百度网盘的广告,还拦截了一部…

零基础构建 AI 大模型数字人:开启智能交互新时代

人工智能技术的飞速发展,数字人正逐渐成为连接虚拟与现实世界的桥梁。无论是作为客户服务代表、教育助手还是娱乐伙伴,数字人都以其独特的方式丰富着我们的生活。今天,我们将介绍一个基于Dify生态系统的开源数字人技术框架——awesome-digita…

iis部署服务时,发现只能进行get请求,无法发起post、put请求

问题描述: iis部署服务时,发现只能进行get请求,无法发起post、put请求 问题原因: iis部署时,webDAV模块限制 解决方法: 1.搜索【服务器管理器】 2.点击【删除角色功能】 3.选中WebDAV,点…

MinIO实战攻略:轻松构建私有云存储解决方案

OSS 简介 OSS(Object Storage Service)通常指的是对象存储服务,它是一种数据存储架构,用于存储和检索非结构化数据,如图片、视频、文档和备份等。对象存储服务与传统的块存储和文件存储不同,它将数据作为对…

用户画像标签服务设计

背景 用户画像中不论是实时标签还是离线标签,对需要对外提供查询服务,以便外部接口可以重新用户的标签,本文就来看一下用户标签服务的设计 用户标签服务设计 不论是离线标签还是实时标签,我们都需要先把他们从hive表或者实时re…

OpenCV(第二关--读取图片和摄像头)实例+代码

以下内容,皆为原创,制作不易,感谢大家的关注和点赞。 一.读取图片 我们来读取图片,当你用代码读取后,可能会发现。怎么跟上传的图片颜色有些许的不一样。因为OpenCV的颜色通道是BGR,而我们平常用的matplotl…

华为云通过自定义域名访问桶内对象

问题:通过将自定义域名绑定至OBS桶实现在线预览文件 例如index.html入口文件 且记 自定义域名绑定暂时不支持HTTPS访问方式,只支持HTTP访问方式 自定义域名就先不用部署https证书。 配置完毕之后,将obs桶设置为公开的即可访问 如何在浏览…

若依代码生成器生成的界面查询和导出突然报错了

之前用的好好的,查询的时候也有数据,但是把参数给分页插件的时候就报错了,我忘了啥错误了,很奇怪。 ha在对应Mapper上加上:CacheNamespace注解,完。 Mapper CacheNamespace public interface BaseGoodsMa…

使用Python做一个脚本自动化机器人(二)

刚发现一个好用的Python库DrissionPage,使用该库不区分浏览器,也无需下载driver文件。 import logging from DrissionPage import WebPage from DrissionPage import ChromiumPage,ChromiumOptionsclass BaiduPage():# 创建对象page ChromiumPage()# 访…

SpringBoot项目定义Bean常见方式

1. spring原生的xml 配置bean 现在几乎淘汰,忽略!! 2. Component 及其衍生注解 (Controller、Service、Repository) Component public class Cat { }3. Configuration Bean Configuration public class AnimalConf…