本文是课程《金融数据分析》的学习笔记(一),该系列笔记分为基础篇、Numpy、Pandas和Matplotlib等,本系列用于对知识点总结和代码练习,Q&A为问题及解决方案,参考书籍为《利用Python进行数据分析》。
往期回顾:
博文 | 内容 |
---|---|
【Python】【课程笔记】金融数据分析(一) | Python基础、Numpy |
【Python】【课程笔记】金融数据分析(二) | Pandas |
前言:Python基础
1、python基本元素:数字、字符串和变量
类型转换:int()、float()、str()
(1)使用[start: end: step]
分片
[start: end: step] 从start 提取到 end-1, 每step个字符提取一个
(2)使用split()
分割
(3)使用join()
合并
2、python容器:列表、元组、字典、集合
-
列表
(1)切片提取元素
(2)使用append()
添加元素至末尾
(3)使用extend()
或+=合并列表
(4)使用insert()
在指定为止插入元素
(5)使用del 删除指定位置的元素
(6)使用pop()
获取并删除指定位置的元素
(7)使用index()
查询具有特定值的元素位置
(8)使用in判断值是否存在
(9)使用count()记录特定值出现的次数
(10)使用sort()重新排列元素
列表方法sort()
会对原列表进行排序,改变原列表的内容
通用函数sorted()
则会返回排好序的列表副本,原列表内容不变
(11)使用 = 赋值,使用copy()
复制 -
元组:无法进行增加、删除和修改操作
-
字典:其中元素的顺序无关紧要,每个元素拥有与之对应的互不相同的键(key),需要通过键来访问元素,键通常为字符串。
(1)使用[key]添加或修改元素,如:dict['A']=a
(2)使用update()
合并字典
(3)使用del删除具有指定键的元素
(4)使用keys()获取所有键
(5)使用values()获取所有值
-
集合:像“舍弃了值,仅剩下键的字典”,键与键之间不允许重复
3、python外壳:代码结构
(1)使用if,elif和else进行比较
(2)使用while进行循环
(3)使用for迭代
⭐⭐(4)推导式
⭐⭐(5)函数
lambda:匿名函数
4、迭代器[1]
iter()
、next()
:方法
Iterator
、Iterable
:迭代器、可迭代的对象
isinstance()
:判断一个对象是否是一个已知的类型(语法)
例:先检查对象是否是一个列表,如果不是将它转换未列表:
if not isinstance(x, list) and isiterable(x):
x = list(x)
第一部分:Numpy(数组)
1、向量的加法
例:输入n,输出:
n
2
+
n
3
n^2 + n^3
n2+n3
def numpysum(n):
a = np.arange(n)**2
b = np.arange(n)**3
return a+b
numpysum(10)
2、数组对象:np.arange()
、np.array()
多维数组
a =np.arange(5)
b = np.array([np.arange(2), np.arange(2)])
3、数组属性[1]:b.ndim
、b.shape
、b.size
等
4、取数、索引切片
- 使用[start: end: step]分片
[start: end: step] 从start 提取到 end-1, 每step个字符提取一个
(1)一维数组:[]与冒号的搭配
取其中一部分,隔几个数取,逆序取数
(2)多维数组:[]与冒号、逗号的搭配
5、改变数组的维度
- 将多维数组降为一维,默认是行序优先,传入’F’参数表示列序优先[2]:
b.ravel()
、b.flatten()
区别:flatten()返回的是拷贝。 - 改变维数:
b.reshape()
用法:当参数只有一个-1时表示将数组降为一维。 - 改变维数,会改变原数组[3]:
np.resize(b,())
- 转置:
b.transpose()
b = np.arange(24).reshape(2,3,4)
b.reshape(2,12)
np.resize(b,(2,12))
6、数组的组合
-
元素:使用
join()
合并
-
数组:堆叠[4]
np.hstack((a,b))
:在第一维进行堆叠(即最外层的方括号)
np.vstack((a,b))
:将数组在第二维进行堆叠(即第二层方括号)
np.dstack((a,b))
:将数组在第三维进行堆叠(即第三层方括号) -
np.concatenate((a,b), axis=1)
[5]:axis=1表示对应行的数组进行拼接,默认axis=0(按列)。
7、数组的分割 -
使用split()分割
-
np.split(a,3,axis=1)
、np.split(a,3,axis=0)
-
np.hsplit(c,3)
、np.vsplit(c,3)
、np.dsplit(c,3)
案例:股价
- 数据集:data.csv
1、计算成交量价权平均价格
- 函数:
(1)np.loadtxt()
参数:usecols:选取数据的列。
(2)np.average()
参数:weights:加权重
2、计算时间加权平均价格
c,v = np.loadtxt('data.csv', delimiter=',', usecols =(5,6), unpack=True)
# 成交量加权
vwap = np.average(c,weights=v)
print ("VWAP=", vwap)
print ("mean=", np.mean(c))
# 时间加权
t = np.arange(len(c))
twap = np.average(c,weights=t)
print("TWAP=",twap)
3、统计量
- 函数
(1)np.max()、np.median()、np.var()、np.std()
:最大值、中位数、方差、标准差
(2)np.msort()
:数组按第一个轴排序,返回排序后的数组副本,等价于 np.sort(a, axis=0)。
#中位数
sorted_close = np.msort(c)
N = len(c)
print ("middle = ", sorted_close[np.int((N-1)/2)])
4、股票收益率
- 收益率:
returns = np.diff(c)/c[:-1]
- 对数收益率:
logreturns = np.diff(np.log(c))
- 年化波动率:
annual_volatility = np.std(logreturns)/np.sqrt(1.0/242)
5、简单移动平均线、指数移动平均线
-
等权表示:
weights = np.ones(N)/N
-
卷积函数[6]:
numpy.convolve(a, v, mode=‘full')
参数:
a:(N,)输入的一维数组
v:(M,)输入的第二个一维数组
mode:{‘full’, ‘valid’, ‘same’}参数可选
①‘full’ 默认值,返回每一个卷积值,长度是N+M-1,在卷积的边缘处,信号不重叠,存在边际效应。
②‘same’ 返回的数组长度为max(M, N),边际效应依旧存在。
③‘valid’ 返回的数组长度为max(M,N)-min(M,N)+1,此时返回的是完全重叠的点。边缘的点无效。 -
创建等差数组[7]:
np.arange([start, ]stop, [step, ]dtype=None)
用法:指定开始值,终值和步长生成等差数列的一维数组。
参数:
start:可忽略不写,默认从0开始;起始值
stop:结束值;生成的元素不包括结束值
step:可忽略不写,默认步长为1;步长
dtype:默认为None,设置显示元素的数据类型 -
创建等差数列[8]:
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
用法:指定开始值,终值和元素个数生成等差数列的一维数组。
#简单移动平均线
N=20
weights = np.ones(N)/N
sma = np.convolve(weights,c)[N-1:-N+1]
#从第N-1个数,到倒数N-1个数为止
#指数移动平均线
N=5
weights = np.exp(np.linspace(-1.,0.,N))
weights = weights/weights.sum()
ema = np.convolve(weights,c)[N-1:-N+1]
import matplotlib.pyplot as plt
t=np.arange(N-1, len(c))
plt.plot(t,c[N-1:], lw=1.0)
plt.plot(t,sma,lw=2.0)
plt.show()