金融量化分析NumPy、pandas、Matplotlib介绍
一、股票入门知识
二、影响股价的因素
1、内部驱动因素
2、外部环境状况 经济形势严峻
3、直接影响 交易规模或参与度可能受到影响
4、心理预期 部分股东基于预期抛售股份。
5、经济环境变化 资金流向银行的可能性显著增加。
6、政治风险上升
三、金融分析
- 基础面上的评估
- 宏观层面的经济状况评估
- 行业动态的深入解析
- 公司财务状况及业绩数据解读
- 技术层面的支持与应用
- K线图中红阳阴线与均值线的关系
四、金融量化投资
量化投资:通过计算机技术运用一定的数学模型去达成投资理念的同时制定并执行投资策略
五、量化投资与Python
量化投资本质上说就是对数据进行分析并据此做出决策的过程
六、numpy简介
NumPy是支持高效科学计算与数据分析的核心库。它通过提供丰富且高效的模块来实现这一目标,并且在各个领域中都发挥着关键作用
例子:
print(np.zeros(10))
print(np.zeros(10,dtype=int))
print(np.ones(10,dtype=int))
print(np.empty(10,dtype=int)) #随机值
print(np.arange(10)) #类似于range
print(np.arange(1,10,0.3)) #步长可以是小数
print(np.linspace(1,10,5)) #第三个参数是分数,步长仍然是一样的,前包后也包
print(np.eye(10)) #线性代数
9、数组运算
数组大小一致,对应位置进行运算
a = np.arange(10)
b = np.arange(10,20)
print(a,b)
print(a+b)
print(a*b)
print(a>b)
10、数组索引
一维数组 a[0]
切片 a[2:]
一维数组的索引和切片
a = np.arange(10)
b = list(range(10))
a1 = a[5:]
b1 = b[5:]
a1[0] = 20 #numpy数组为浅拷贝
b1[0] = 20
print(a,b)
c = np.arange(10)
c1 = a[5:].copy() #copy()后为深拷贝
c1[0] = 20
print(c)
#布尔切片
a = [random.randint(0,10) for i in range(10)]
print(a)
b = np.array(a)
print(b>5) #对b中的每一个元素进行判断,返回一个布尔数组
print(b[b>5]) #布尔切片,将true位置上的数字返回,中括号内的布尔数组要与切片的数组长度一致
print(b[(b > 5) & (b % 2 == 0)]) #返回大于5的偶数用 & 符号 &运算级别高,所以前后的运算要加括号
print(b[(b > 5) | (b % 2 == 0)]) #返回大于5的数 和所有的偶数
#花式索引
print(b[[1,3,4,6,7]]) #花式索引 里面列表中的元素代表的是b元组的索引位置。
二维数组 a[0][0] 或 a[0,0]
a = np.arange(15)
print(a)
b = a.reshape(3,5) #变换型,生成二维数组
print(b)
print(b[2,3])
#切片
a = np.arange(15).reshape(3,5) #变换型,生成二维数组
print(a)
print(a[0:2,0:2]) #取前两行的前两列,左边切行,右边切列
print(a[ , ]) #逗号左右两边可以是普通索引,布尔索引,花式索引,。但两边不能同时为花式索引
#两边都是花式索引的话,要有两个中括号,前面中括号切行,右边中括号切列,而且必须要有冒号
a1 = a[[1,2],:][:,[2,4]]
print(a1)
numpy提供的通用函数库包含一系列基本的数值计算功能。这些功能主要分为两类:一类是一元算术函数(Unary arithmetic functions),包括绝对值计算(absolute value)、平方根(square root)、指数(exponential)、对数(logarithm)、天花板(ceiling)操作、地板(floor)操作、四舍五入(rounding)以及截断(truncation)。另一类是二元算术函数(Binary arithmetic functions),涉及加法、减法、乘法、除法以及幂运算等基本运算。
12、numpy中的数学与统计功能
(1)求总值
(2)计算数组的均值
(3)计算数组的最小值与最大值及其索引
(4)求最小元素及其索引并同时求最大元素及其索引
(5)计算标准差
(6)计算方差
13、numpy随机数生成
随机数函数在np.random的子包内
#随机生成数组
a = np.random.randint(0,10,10) #随机生成长度为10,范围在0~10的一组数组
print(a)
b = np.random.randint(0,10,(3,5)) #随机生成一个3行5列的数组
print(b)
c = np.random.randint(0,10,(3,5,4)) #随机生成一个3页行每页5行,每行4个字的三维的数组
print(c)
d = np.random.rand(10) #长度为10,每个数的范围为0~1的数组
print(d)
e = np.random.choice([1,2,3,4],10) #随机从列表中取10次数
print(e)
f = np.random.uniform(2.0,4.0,10) #随机从2~4取十次浮点数
print(f)
七、pandas简介
1、pandas作为功能强大的Python数据分析库构建于numpy之上
2、pandas的主要分析功能包括:
(1)提供dataframes和series数据结构
(2)集成时间序列分析功能
(3)具备丰富的数学运算能力
(4)支持灵活处理缺失数据
3、安装与导入方法:
通过运行命令pip install pandas即可完成安装
然后使用import pandas as pd导入库
一、series作为一维数据对象:
1、series是由一组数值及其对应的索引标签共同组成的复合数据结构
2、创建一个series可以通过多种方式实现
s1 = pd.Series([4,7,-5,3])
print(s1)
s2 = pd.Series([4,3,6,2],index=['a','b','c','d'])
print(s2)
s3 = pd.Series({'a':1,'b':2})
print(s3)
s4 = pd.Series(0,index=['a','b','c','d'])
print(s4)
3、获取值数组和索引数组:values属性和index属性
s1 = pd.Series([4,7,-5,3])
print(s1.values)
print(s1.index)
4、Series比较像列表数组和字典的结合体
5、Series支持array的特性
(1)从ndarray创建Series
(2)与标量运算
(3)两个Series运算 s1+s2
(4)索引 支持数字索引和标记索引
(5)切片
(6)通用函数
(7)布尔值过滤
(8)‘a’ in s1 返回布尔
6、Series整数索引
loc和iloc的用法
a = pd.Series(np.arange(10,21))
print(a)
print(a.loc[3]) #括号内解释为标签索引
print(a.iloc[5]) #括号内解释为下表索引
7、Series数据对齐
s1 = pd.Series([1,2,3,4],index=['a','b','c','d'])
s2 = pd.Series([1,2,3,4],index=['d','c','b','a'])
print(s1+s2)
s3 = pd.Series([1,2,3,4],index=['a','b','c','d'])
s4 = pd.Series([1,2,3,4,5],index=['d','c','b','a','e']) #长度不相同也可以加
print(s3+s4)
a = s3.add(s4,fill_value=0) #如果对不齐,用fill_value=0默认对不齐的数为0
print(a)
8、灵活的算术方法
add , sub , div , mul
9、Series处理缺省值
两种方法
s3 = pd.Series([1,2,3,4],index=['a','b','c','d'])
s4 = pd.Series([1,2,3,4,5],index=['d','c','b','a','e']) #长度不相同也可以加
s = s3+s4
print(s)
print(s.isnull()) #返回布尔,是nan的为True
print(s.notnull()) #返回布尔,不是nan的为True
print(s[s.notnull()]) #通过布尔值切片,把是nan的过滤掉
print(s.dropna()) #过滤nan第二种方法,直接dropna()
print(s.fillna(0)) #给nan赋值为0
print(s.fillna(s.mean())) #给nan赋值为平均值
1、DataFrame 是一种表格数据结构。
它由一系列有序的列构成。
2、创建方式:
DataFrame 可以被看作是一种字典的集合,
它共享一个统一的索引系统。
d1 = pd.DataFrame({'one':[1,2,3,4],'two':[5,6,7,8]},index=['a','b','c','d'])
print(d1)
d2 = pd.DataFrame({'one':pd.Series([1,2,3,],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['d','c','b','a'])})
print(d2)
d2.to_csv('test1.csv') #保存csv
3、DateFrame常用属性
df = pd.DataFrame({'one':pd.Series([1,2,3,],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['d','c','b','a'])})
print(df)
#nan是一个浮点值,一个数组只能是一个数据类型,所以有nan的这一列都变成浮点值
print(df.index) #获得行的索引数组
print(df.values) #获得二维数组
print(df.T) #转置,行变成列,列变成行,
print(df.columns) #获取列的索引属猪
print(df.describe()) #t每一列的一些统计信息
4、DateFrame的索引和切片
df = pd.DataFrame({'one':pd.Series([1,2,3,],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['d','c','b','a'])})
print(df)
print(df['one']['a']) #先切列,再切行,一般不用这个
print(df.loc['a','one']) #用标签loc ,左边是行,右边是列 ,可以切片,布尔值索引,花式索引任意搭配
print(df.loc['a',:]) #取a这一行的切片,逗号和冒号可以省略
当DataFrame执行运算时, 其行索引和列索引会分别实现数据对齐
6、DateFrame处理数据缺失
df = pd.DataFrame({'one':pd.Series([1,2,3,],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['d','c','b','a'])})
print(df)
print(df.fillna(0)) #给nan赋值为0
print(df.dropna()) #一行中如果有一个nan,使用dropna这一行会全部去掉
df.loc['e'] = np.nan
print(df)
print(df.dropna(how='all')) #如果一行全部是nan,才把这一行去掉
df = df.dropna(how='all')
print(df.dropna(axis=1)) #如果一列中有一个nan,把这一列去掉
三、pandas常用函数
numpy通用函数同样适用于pandas
df = pd.DataFrame({'one':pd.Series([1,2,3,],index=['a','b','c']),'two':pd.Series([1,2,3,4],index=['d','c','b','a'])})
print(df)
print(df.mean()) #,求df每一列的平均值,返回一个长度为2的Series对象
print(df.mean(axis=1)) #求df每一行的平均值
print(df.sum()) #按列求和
print(df.sum(axis=1)) #按行求和
print(df.sort_values(by='two')) #指定一列,从小到大排序
print(df.sort_values(by='two',ascending=False)) #倒序,有nan的不参与排序,统一放到最后
print(df.sort_values(by='a',ascending=False,axis=1)) #按行排序
print(df.sort_index(ascending=False)) #按列索引进行排序
print(df.sort_index(ascending=False,axis=1)) #按行索引进行排序
四、时间处理对象
1、将时间字符串转化为datetime对象
t = pd.to_datetime(['2018-01-01','2018/Feb/01'])
print(t)
通过调用date_range函数生成一个时间序列数组,在该数组中包含从起始时刻到终止时刻的时间点,并根据指定的时间间隔划分区间跨度。该函数允许设置不同的时间频率(freq),其中D代表天数间隔、H表示小时间隔、W为周频次、B为工作日周期、SM为半个月跨度、T为分钟粒度、S为秒频次以及A代表年份间隔,默认情况下freq设为D天。
t = pd.to_datetime(['2018-01-01','2018/Feb/01']) #生成时间对象
print(t)
a = pd.date_range('2018-01-01',periods=10) #生成时间范围,periods指定多少天,也就是长度
print(a)
b = pd.date_range('2018-01-01',periods=10,freq='H') #freq指定步长,默认为D
print(b) #H为小时,W为周,B为工作日,SM为半个月,T是分,S是秒,A是年
c = pd.date_range('2018-01-01',periods=10,freq='1H20min')
print(c)
3、时间对象数组可被用作Series或DataFrame的时间轴(index),该种方式在切片操作中表现出较好的实用性
当使用datetime对象作为索引时,则储存在DateTimeIndex对象中
切片方式包括:指定年月字段以及设定时间段
sr = pd.Series(np.arange(1000),index=pd.date_range('2016-01-01',periods=1000))
print(sr)
print(sr.index)
print(sr['2018-1'])
print(sr['2017-1':'2018-1']) #切片前后都包括
print(sr.resample('M').sum()) #计算一段时间的和
print(sr.resample('M').mean()) #计算一段时间的平均
print(sr.truncate(before='2018-01')) #truncate截断一段时间
四、文件处理
1、csv文件的读写
#读取csv
a = pd.read_csv('ceshi.csv',index_col='time',parse_dates=True,na_values=['None'])
print(a)
print(a.index)
写入csv
a.to_csv('test2.csv',header=False,index=False,na_rep='null')
2、其他文件的读写
pd.read_excel()
pd.read_json()
pd.read_html()
pd.read_sql()
八、Matplotlib简介
1、折线图
x = np.linspace(-100,100,10000)
y1 = x.copy()
y2 = x *
y3 = x**3+5*x**2+2*x+1
plt.plot(x,y1,color='r',label='y=x')
plt.plot(x,y2,color='b',label='y=x^2')
plt.plot(x,y3,color='y',label='y=x^3+5*x^2+2*x+1')
plt.ylim(-1000,1000)
plt.legend()
plt.show()
2、画布与子画
#创建画布
fig = plt.figure()
#创建一个子画
ax1 = fig.add_subplot(2,1,1) #两行一列的第一个位置
# ax1.subplots_adjust(left=1,buttom=1,right=1,top=1,wspace=1,hspace=1) 调节距离
ax1.plot([1,3,5,7],[1,8,3,4],'v-',color='b',label='Line A')
ax2 = fig.add_subplot(2,1,2)
ax2.plot([1,3,5,7],[1,8,3,4],'v-',color='b',label='Line A')
plt.show()
3、条形图
data = [32,48,21,100]
label = ['Jan','Feb','Mar','Apr']
plt.bar(np.arange(len(data)),data,color='r',width=0.3)
plt.xticks(np.arange(len(data)),labels=label)
plt.show()
4、饼图
a = plt.pie([1,2,3,4],labels=['a','b','c','d'],autopct='%.0f%%',explode=[0,0,0.1,0])
plt.axis('equal')
plt.show()
