如何使用Python工具分析风险数据

Python012

如何使用Python工具分析风险数据,第1张

1、引入工具–加载数据分析包

启动IPython notebook,加载运行环境:

%matplotlib inline

import pandas as pd

from datetime import timedelta, datetime

import matplotlib.pyplot as plt

import numpy as np

2、数据准备

俗话说: 巧妇难为无米之炊。小安分析的数据主要是用户使用代理IP访问日志记录信息,要分析的原始数据以CSV的形式存储。这里首先要介绍到pandas.read_csv这个常用的方法,它将数据读入DataFrame

analysis_data = pd.read_csv('./honeypot_data.csv')

对的, 一行代码就可以将全部数据读到一个二维的表结构DataFrame变量,感觉很简单有木有啊!!!当然了用Pandas提供的IO工具你也可以将大文件分块读取,再此小安测试了一下性能,完整加载约21530000万条数据也大概只需要90秒左右,性能还是相当不错。

3、数据管窥

一般来讲,分析数据之前我们首先要对数据有一个大体上的了解,比如数据总量有多少,数据有哪些变量,数据变量的分布情况,数据重复情况,数据缺失情况,数据中异常值初步观测等等。下面小安带小伙伴们一起来管窥管窥这些数据。

使用shape方法查看数据行数及列数

analysis_data.shape

Out: (21524530, 22) #这是有22个维度,共计21524530条数据记的DataFrame

使用head()方法默认查看前5行数据,另外还有tail()方法是默认查看后5行,当然可以输入参数来查看自定义行数

analysis_data.head(10)

这里可以了解到我们数据记录有用户使用代理IP日期,代理header信息,代理访问域名,代理方法,源ip以及蜜罐节点信息等等。在此小安一定一定要告诉你,小安每次做数据分析时必定使用的方法–describe方法。pandas的describe()函数能对数据进行快速统计汇总:

对于数值类型数据,它会计算出每个变量: 总个数,平均值,最大值,最小值,标准差,50%分位数等等

非数值类型数据,该方法会给出变量的: 非空值数量、unique数量(等同于数据库中distinct方法)、最大频数变量和最大频数。

由head()方法我们可以发现数据中包含了数值变量、非数值变量,我们首先可以利用dtypes方法查看DataFrame中各列的数据类型,用select_dtypes方法将数据按数据类型进行分类。然后,利用describe方法返回的统计值对数据有个初步的了解:

df.select_dtypes(include=['O']).describe()

df.select_dtypes(include=['float64']).describe()

简单的观察上面变量每一维度统计结果,我们可以了解到大家获取代理数据的长度平均1670个字节左右。同时,也能发现字段scanossubfp,scanscan_mode等存在空值等等信息。这样我们能对数据整体上有了一个大概了解。

4、数据清洗

由于源数据通常包含一些空值甚至空列,会影响数据分析的时间和效率,在预览了数据摘要后,需要对这些无效数据进行处理。

一般来说,移除一些空值数据可以使用dropna方法, 当你使用该方法后,检查时发现 dropna() 之后几乎移除了所有行的数据,一查Pandas用户手册,原来不加参数的情况下, dropna() 会移除所有包含空值的行。

如果你只想移除全部为空值的列,需要加上 axis 和 how 两个参数:

analysis_data.dropna(axis=1, how='all')

另外,也可以通过dropna的参数subset移除指定列为空的数据,和设置thresh值取移除每非None数据个数小于thresh的行。

analysis_data.dropna(subset=['proxy_host', 'srcip'])

#移除proxy_host字段或srcip字段没有值的行

analysis_data.dropna(thresh=10)

#移除所有行字段中有值属性小于10的行

5、统计分析

再对数据中的一些信息有了初步了解过后,原始数据有22个变量。从分析目的出发,我将从原始数据中挑选出局部变量进行分析。这里就要给大家介绍pandas的数据切片方法loc。

loc([startrowindex:endrowindex,[‘timestampe’, ‘proxy_host’, ‘srcip’]])是pandas重要的切片方法,逗号前面是对行进行切片逗号后的为列切片,也就是挑选要分析的变量。

如下,我这里选出日期,host和源IP字段——

analysis_data = analysis_data.loc([:, [‘timestampe’,'proxy_host','srcip']])

首先让我们来看看蜜罐代理每日使用数据量,我们将数据按日统计,了解每日数据量PV,并将结果画出趋势图。

daily_proxy_data = analysis_data[analysis_data.module=='proxy']

daily_proxy_visited_count = daily_proxy_data.timestamp.value_counts().sort_index()

daily_proxy_visited_count.plot()

对数据列的丢弃,除无效值和需求规定之外,一些表自身的冗余列也需要在这个环节清理,比如说DataFrame中的index号、类型描述等,通过对这些数据的丢弃,从而生成新的数据,能使数据容量得到有效的缩减,进而提高计算效率。

由上图分析可知蜜罐代理使用量在6月5号,19-22号和25号这几天呈爆炸式增长。那么这几天数据有情况,不正常,具体是神马情况,不急,后面小安带大家一起来慢慢揪出来到底是那些人(源ip) 干了什么“坏事”。

进一步分析, 数据有异常后,再让我们来看看每天去重IP数据后量及其增长量。可以按天groupby后通过nunique()方法直接算出来每日去重IP数据量。

daily_proxy_data = analysis_data[analysis_data.module=='proxy']

daily_proxy_visited_count = daily_proxy_data.groupby(['proxy_host']).srcip.nunique()

daily_proxy_visited_count.plot()

究竟大部分人(源ip)在干神马?干神马?干神马?让我们来看看被访问次数最多host的哪些,即同一个host关联的IP个数,为了方便我们只查看前10名热门host。

先选出host和ip字段,能过groupby方法来group 每个域名(host),再对每个域名的ip访问里unique统计。

host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]

grouped_host_ip = host_associate_ip.groupby(['proxy_host']).srcip.nunique()

print(grouped_host_ip.sort_values(ascending=False).head(10))

再细细去看大家到底做了啥——查看日志数据发现原来在收集像二手车价格,工人招聘等等信息。从热门host来看,总得来说大家使用代理主要还是获取百度,qq,Google,Bing这类妇孺皆知网站的信息。

下面再让我们来看看是谁用代理IP“干事”最多,也就是看看谁的IP访问不同host的个数最多。

host_associate_ip = proxy_data.loc[:, ['proxy_host', 'srcip']]

grouped_host_ip = host_associate_ip.groupby(['srcip'_host']).proxy_host.nunique()

print(grouped_host_ip.sort_values(ascending=False).head(10))

哦,发现目标IP为123..*.155的小伙子有大量访问记录, 进而查看日志,原来他在大量收集酒店信息。 好了,这样我们就大概能知道谁在干什么了,再让我们来看看他们使用proxy持续时长,谁在长时间里使用proxy。 代码如下——

这里不给大家细说代码了,只给出如下伪代码。

date_ip = analysis_data.loc[:,['timestamp','srcip']]

grouped_date_ip = date_ip.groupby(['timestamp', 'srcip'])

#计算每个源ip(srcip)的访问日期

all_srcip_duration_times = ...

#算出最长连续日期天数

duration_date_cnt = count_date(all_srcip_duration_times)

好了,到此我也就初略的知道那些人做什么,谁用代理时长最长等等问题额。取出ip = 80...38的用户使用代理ip访问数据日志,发现原来这个小伙子在长时间获取搜狐images。

蜜罐在全国各地部署多个节点,再让我们来看看每个源ip扫描蜜罐节点总个数,了解IP扫描节点覆盖率。结果见如下:

# 每个IP扫描的IP扫描节点总个数

node = df[df.module=='scan']

node = node.loc[:,['srcip','origin_details']]

grouped_node_count = node.groupby(['srcip']).count()

print grouped_node_count.sort_values(['origin_details'], ascending=False).head(10)

由上述两表初步可知,一些结论:如源ip为182...205的用户长时间对蜜罐节点进行扫描,mark危险用户等等。

不存在。

Python语言的使用不需要付费,不存在商业风险。围绕Python3和测试工具的越来越多,公司将一些遗留代码迁移到Python3的风险较小,因为它具有商业意义。

现假设有A, B, C, D, E五只股票的收益率数据((第二日收盘价-第一日收盘价)/第一日收盘价)), 如果投资人的目标是达到20%的年收益率,那么该如何进行资产配置,才能使得投资的风险最低?

更一般的问题,假设现有x 1 ,x 2 ,...,x n , n支风险资产,且收益率已知,如果投资人的预期收益为goalRet,那么该如何进行资产配置,才能使得投资的风险最低?

1952年,芝加哥大学的Markowitz提出现代资产组合理论(Modern Portfolio Theory,简称MPT),为现代西方证券投资理论奠定了基础。其基本思想是,证券投资的风险在于证券投资收益的不确定性。如果将收益率视为一个数学上的随机变量的话,证券的期望收益是该随机变量的数学期望(均值),而风险可以用该随机变量的方差来表示。

对于投资组合而言,如何分配各种证券上的投资比例,从而使风险最小而收益最大?

答案是将投资比例设定为变量,通过数学规划,对每一固定收益率求最小方差,对每一个固定的方差求最大收益率,这个多元方程的解可以决定一条曲线,这条曲线上的每一个点都对应着最优投资组合,即在给定风险水平下,收益率最大,这条曲线称作“有效前沿” (Efficient Frontier)。

对投资者而言,不存在比有效前沿更优的投资组合,只需要根据自己的风险偏好在有效前沿上寻找最优策略。

简化后的公式为:

其中p 为投资人的投资目标,即投资人期待的投资组合的期望值. 目标函数说明投资人资产分配的原则是在达成投资目标 p 的前提下,要将资产组合的风险最小化,这个公式就是Markowitz在1952年发表的'Portfolio Selection'一文的精髓,该文奠定了现代投资组合理论的基础,也为Markowitz赢得了1990年的诺贝尔经济学奖. 公式(1)中的决策变量为w i , i = 1,...,N, 整个数学形式是二次规划(Quadratic Programming)问题,在允许卖空的情况下(即w i 可以为负,只有等式约束)时,可以用拉格朗日(Lagrange)方法求解。

有效前缘曲线如下图:

我们考虑如下的二次规划问题

运用拉格朗日方法求解,可以得到

再看公式(1),则将目标函数由 min W T W 调整为 min 1/2(W T W), 两问题等价,写出的求解矩阵为:

工具包: CVXOPT python凸优化包

函数原型: CVXOPT.solvers.qp(P,q,G,h,A,b)

求解时,将对应的P,q,G,h,A,b写出,带入求解函数即可.值得注意的是输入的矩阵必须使用CVXOPT 中的matrix函数转化,输出的结果要使用 print(CVXOPT.solvers.qp(P,q,G,h,A,b)['x']) 函数才能输出。

这里选取五支股票2014-01-01到2015-01-01的收益率数据进行分析.

选取的五支股票分别为: 白云机场, 华夏银行, 浙能电力, 福建高速, 生益科技

先大体了解一下五支股票的收益率情况:

看来,20%的预期收益是达不到了。

接下来,我们来看五支股票的相关系数矩阵:

可以看出,白云机场和福建高速的相关性较高,因为二者同属于交通版块。在资产配置时,不利于降低非系统性风险。

接下来编写一个MeanVariance类,对于传入的收益率数据,可以进行给定预期收益的最佳持仓配比求解以及有效前缘曲线的绘制。

绘制的有效前缘曲线为:

将数据分为训练集和测试集,并将随机模拟的资产配比求得的累计收益与测试集的数据进行对比,得到:

可以看出,在前半段大部分时间用Markowitz模型计算出的收益率要高于随机模拟的组合,然而在后半段却不如随机模拟的数据,可能是训练的数据不够或者没有动态调仓造成的,在后面写策略的时候,我会加入动态调仓的部分。

股票分析部分:

Markowitz 投资组合模型求解

蔡立专:量化投资——以python为工具. 电子工业出版社