Python数据处理相关语法整理

Python数据处理相关语法整理

简介

本篇博文主要是自己在处理金融类数据、编写金融类代码的时候的总结

Email: 6763624736@qq.com



Python自身特性总结

  1. python的所有类,都是type这个类的实例
  2. metaclass可以允许父类对子类进行修改
  3. variable_name : DataType
    python可以以这样的方式指定变量的类型
  4. 目录下如果有__init__.py,那么这个目录就会被当成一个包,当import这个目录的时候,会先执行__init__里面的语句
  5. a[::-1],表示把a的数组里的元素倒序输出,但是只限制在一维里的元素
    第三个-1其实是表示步长
  6. 一些pip不能安装的,需要下载轮子的包的下载网址
    python包下载网址


编程Tips

  1. 一般修改dataframe或者Series要重新赋值,比如 df = df.concat([df1,df2],axis=1)
  2. np.isnan 不能识别None,而pd.isnull 适用范围比较广
  3. 读取数据设定index后,可以使用 drop_duplicate 一下
  4. 如果Series的index是整数的话,索引 s[-1]会报没有-1这个key的错误
  5. 如果对dataframe或者Series的行进行筛选,并且要更改的话
    记得使用df.loc[ ] 而不是直接 df[ ]
  6. Pandas和Numpy常用库


拿到新电脑配环境时做的事:

  1. 关闭自动重启
    我的电脑->管理->设置,windows update禁用,并且选项上面选择不操作

    点击windows图标,进入设置,设置电源选项

    点击windows图标,进入设置,关闭windows更新


一些加速python代码的技巧

  1. 使用numba
  2. 尽量在循环内少用Series和Dataframe的loc进行索引,这样会造成速度下降
  3. 少用dataframe的loc和append来往里面加元素,最好是先在python原生的列表里操作
  4. numpy,dataframe,series只有在统计分析的时候才比较快(就是数据不变了已经),如果要往里面加元素,最好是原生的列表操作比较快
  5. 你对列表直接遍历进行操作 比 你把列表变成Series再进行apply操作要快


Python项目代码结构

python项目代码架构



量化策略指标计算

策略指标计算公式


指标公式:

  1. Calmar(卡玛比率)= 超额收益 / 最大回撤

绝对收益率

给定收益率序列(pd.Series),计算绝对收益率

def get_absolute_return(return_s):
    return ((return_s+1).cumprod().iloc[-1]-1)

最大回撤

给定累积收益率序列计算最大回撤

def compute_portfolio_max_dawdown(strategy_cumu_return_list):
    # 计算最大回撤
    i = int(np.argmax((np.maximum.accumulate(strategy_cumu_return_list) - strategy_cumu_return_list) /
                      np.maximum.accumulate(strategy_cumu_return_list)))
    if i == 0:
        return 0
    j = int(np.argmax(strategy_cumu_return_list[:i]))  # 开始位置

    max_drawdown = (strategy_cumu_return_list[j] - strategy_cumu_return_list[i]) / strategy_cumu_return_list[j]
    return max_drawdown

其中

np.maximum.accumulate(arr)-arr # 计算每个点的回撤绝对值
(np.maximum.accumulate(arr)-arr) /np.maximum.accumulate(arr) # 计算每个点的回撤比例

给定收益率序列计算最大回撤

def compute_portfolio_max_dawdown(portfolio_return_array):
    strategy_cumu_return_list = (np.array(portfolio_return_array) + 1).cumprod()
    # 计算最大回撤
    i = int(np.argmax((np.maximum.accumulate(strategy_cumu_return_list) - strategy_cumu_return_list) /
                      np.maximum.accumulate(strategy_cumu_return_list)))
    if i == 0:
        return 0
    j = int(np.argmax(strategy_cumu_return_list[:i]))  # 开始位置

    max_drawdown = (strategy_cumu_return_list[j] - strategy_cumu_return_list[i]) / strategy_cumu_return_list[j]
    return max_drawdown

给定累计收益率序列计算收益率序列

def compute_return(cumu_return_lst):
    shift_return_lst = [1] + list(cumu_return_lst)[:-1]
    return_lst = np.array(cumu_return_lst)/np.array(shift_return_lst) - 1
    return_lst[0] = 0
    return return_lst

年化收益率

给定累计收益率序列,计算年化收益率

# day_num是回测天数
def compute_annual_yield(cumu_return_lst):
    day_num = len(cumu_return_lst)
    annual_return = cumu_return_lst[-1]**(252/day_num) - 1
    return annual_return

年化波动率

给定收益率序列,计算年化波动率

def compute_annual_std(return_lst, daily_data_cnt):
    annual_std = np.std(return_lst)*math.sqrt(252*daily_data_cnt)
    return annual_std

夏普比率

给定收益率序列,计算夏普

def compute_portfolio_sharpe_ratio(portfolio_return_array, day_num, daily_data_cnt):
    strategy_cumu_return_list = (np.array(portfolio_return_array) + 1).cumprod()
    annual_yield = strategy_cumu_return_list[-1] ** (252 / day_num) - 1
    annual_std = np.std(portfolio_return_array) * math.sqrt(252 * daily_data_cnt)
    return (annual_yield - 0.04) / annual_std

-----------------------------------------------------

------------------- 分割线 -------------------------

------------------------------------------------------



  1. repr
    是print(class)显示的内容)

  2. 在函数前面加@property,这个函数就编程了属性


字符串

  1. 字符串大小写转换
    字符串大小写转换

字典

字典取数

d.get(key, default)
key是键值,若不存在,则返回default



Datetime库

字符串和日期相互转换

startDate = "2018-10-01"
endDate = "2018-10-31"

###字符转化为日期
startTime = datetime.datetime.strptime(startDate, '%Y-%m-%d').time()
endTime = datetime.datetime.strptime(endDate, '%Y-%m-%d').time()

now = datetime.datetime.now()
print(now)

###日期转化为字符串
print("--1---:" + datetime.datetime.strftime(startTime, "%Y-%m-%d"))
print("--2---:" + datetime.datetime.strftime(endTime, "%Y-%m-%d"))

天数之间的加减

两个日期直接加减可以获得天数

timedelta().days可获得天数

datetime.timedelta(days = XX)是间隔的天数


Scipy.stats

简介:scipy.stats是和数据统计相关的包,有各种统计函数

  1. scipy.stats.rankdata()
    可对数组中的数据进行排序
    例子


Numpy 库

数学函数

>>> from numpy import cov
>>> cov([1, 2, 3], [2, 12, 14])
array([[  1.        ,   6.        ],
       [  6.        ,  41.33333333]])

正态分布取样 / 多元正态分布取样

正态分布取样

import numpy as np

np.random.normal(loc=mean, scale=std, size=(,))

多元正态分布取样

import numpy as np
sample = np.random.multivariate_normal(mean=[0,0], cov=[[1,0.5],[0.5,1.5]],size=200)

多元正态分布可以设置协方差矩阵


排名

降序排名:np.argsort(-arr).argsort()
升序排名:np.argsort(arr).argsort()


数组/矩阵的堆叠

  • np.vstack
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
X = np.vstack((T, S, M))
print(X)
# result
[[ 9 15 25 14 10 18  0 16  5 19 16 20]
 [39 56 93 61 50 75 32 85 42 70 66 80]
 [38 56 90 63 56 77 30 80 41 79 64 88]]
  • np.hstack
T = np.array([9, 15, 25, 14, 10, 18, 0, 16, 5, 19, 16, 20])
S = np.array([39, 56, 93, 61, 50, 75, 32, 85, 42, 70, 66, 80])
M = np.asarray([38, 56, 90, 63, 56, 77, 30, 80, 41, 79, 64, 88])
X = np.hstack((T, S, M))
print(X)
# result
[ 9 15 25 14 10 18  0 16  5 19 16 20 39 56 93 61 50 75 32 85 42 70 66 80
 38 56 90 63 56 77 30 80 41 79 64 88]

矩阵(matrix)相关操作

  • 将列表转换成矩阵
print(np.matrix([1,3,2]))
# result
[[1 3 2]]
  • 矩阵对应位置相乘:np.multiply()
    np.multiply(), np.dot(), * 的区别博客

    np.dot():对于秩为1的数组,执行对应位置相乘,然后再相加;
    对于秩不为1的二维数组,执行矩阵乘法运算;超过二维的可以参考numpy库介绍。

    * 星号乘法 : 对数组执行对应位置相乘,对矩阵执行矩阵乘法运算


广播机制

numpy中的广播机制


生成固定的随机数

为了生成固定的随机数,我们需要使用种子(seed)
相同的种子会生成相同的随机数
用法:

randomState = np.random.RandomState(0) 
a = randomState.randint(10, size=(5,6))
# 这里的randomState其实就是在前面加了 np.random.seed(0)的 np.random, 后面可以调用randint等随机数生成方法

如果是使用np.random.seed(0)再使用np.random.randint调用,每次调用之前都要加np.random.seed(0)

排序

  1. ndarray.sort()

np.nan的处理

np.nan其实是个float,

但是如果数组里有np.nan,在进行诸如np.argmax(),np.max()之类的统计计算的时候会反正nan

正负无穷

正无穷:np.inf
负无穷: -np.inf




Pandas库

计算相关性

# 较慢
df.corr()

# 较快
pd.DataFrame(np.corrcoef(df.values, rowvar=False), index = df.index, columns=df.columns)

统计频数

统计频数


描述性统计describe

  1. 注意如果不是数值类型的进行describe, 会出现 count unique freq这些。
    可以注意一些是否需要进行astype一下

  2. 如果想把Series横着加到Dataframe里出现错误,
    要先把Series转换成Dataframe

多层索引Multiindex

m_index1=pd.Index([("A","x1"),("A","x2"),("B","y1"),("B","y2"),("B","y3")],names=['class1', 'class2'])
df1=pd.DataFrame(np.random.randint(1,10,(5,3)),index=m_index1)
  • df.index.names = […]

  • index.get_level_values(level)
    获取多重索引第N曾的索引值

  • index.tolist()

dataframe的整合与形变

dataframe的整合与形变
注意* 要设置stack(dropna=False), dropna默认为False了

数学函数

数学函数集合:
Series及Dataframe数值计算和统计基础函数应用总结

count(),min(),quantile(),sum(),mean(),median(),std(),skew(),kurt()

cumsum(),cumprod()

value_counts(),unique()

print(df.count(),'→ count统计非Na值的数量\n')
print(df.min()
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值