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

2024-08-25 08:04

本文主要是介绍通过主成分分析实现检测金融中的异常交易模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主成分分析(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.chinasem.cn/article/1104995

相关文章

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount