完成一个量化策略的研发过程,包括对于数据的处理,因子的提取,这里介绍一些关于Python常用的数据处理模块,看这一篇就够啦!
Numpy提供了对于向量和矩阵的运算,用于实现快速计算,下面从一个简单的数组例子入手。
import numpy as np
a=np.array([1,2,3,4],dtype=np.int64)
print(type(a)) #输出numpy对象类型
print(a.dtype) #输出numpy数组中元素的类型
print(a) #输出numpy对象实例
print(a.reshape(2,2)) #改变数组的维度
输出如下
<class 'numpy.ndarray'>
int64
[1 2 3 4]
[[1. 2.]
[3. 4.]]
这里a使用Python列表创建numpy.ndarray对象,可以简单认为a是Numpy中对应的数组,dtype指定了数组中元素的类型,比如np.int32,np.float64。
import numpy as np
a=np.array([[1,0],
[0,1]])
b=np.array([[2,3],
[4,5]])
print(a*b)#矩阵a×b
print(a+b)#矩阵a+b
print(np.linalg.inv(b))#矩阵b的逆
输出如下
[[2 0]
[0 5]]
[[3 3]
[4 6]]
[[-2.5 1.5]
[ 2. -1. ]]
import numpy as np
np.random.seed(999)
a=np.random.rand(9,3) #生成一个9行3列的二维数组
print(a)
print(a[:,0]) #筛选第1列
print(a[0,:]) #筛选第1行
print(a[1,2]) #筛选第2行,第3列的元素
print(np.mean(a,0)) #从第1维度(行)对数组求平均,最后得到每一列的平均数
print(np.mean(a,1)) #从第2维度(列)对数组求平均,最后得到每一行的平均数
import pandas as pd
a=pd.DataFrame([1,2,3,4],columns=["number"]) #创建一个DataFrame对象
print(a)
a.to_csv("test.csv") #将该对象保存至当前目录下test.csv文件中
data=pd.read_csv("test.csv",index_col=0) #读取当前目录下test.csv文件到data,data为DataFrame对象
print(data.head()) #输出data的前5行
输出如下
number
0 1
1 2
2 3
3 4
4 5
5 6
number
0 1
1 2
2 3
3 4
4 5
首先使用pd.DataFrame将列表转化为DataFrame对象,并设置该列的列名,调用to_csv和read_csv可以保存读写csv文件,也可以使用to_excel(“test.xlsx”)和read_excel(“test.xlsx”)保存。
import pandas as pd
columns=["name","id"]
a=pd.DataFrame()
a["name"]=["A","B","C"]
a["id"]=[1,2,3]
print(a)
print(a[a["name"]=="B"])#筛选其中name列等于B的行
print(a[a["id"]>=2])#筛选其中id列数字大于等于2的行
输出如下
name id
0 A 1
1 B 2
2 C 3
name id
1 B 2
name id
1 B 2
2 C 3
可以使用df[df[“列名”]+条件]的方法筛选出想要的行,其原理是df[“列名”]+条件会生成一个行数与原DataFrame相同的True和False的列,再次使用df则会去除其中为False的行,保留True的行,得到筛选后的结果。
如果想要访问或修改表格中某个位置的数据,可以使用如下方法进行筛选:
import pandas as pd
columns=["name","id"]
a=pd.DataFrame()
a["name"]=["A","B","C"]
a["id"]=[1,2,3]
print(a)
print(a["name"].iloc[1])#筛选表格中name列的第2行的元素
print(a.iloc[1]["name"])#筛选表格中第2行元素中name列的元素
输出如下
name id
0 A 1
1 B 2
2 C 3
B
B
上面已经介绍了如何从python自带的列表list生成numpy和pandas中的数据类型,下面展示了其他转化方式。
import pandas as pd
import numpy as np
columns=["name","id"]
a=pd.DataFrame()
a["name"]=["A","B","C"]
a["id"]=[1,2,3]
print(type(a))
a_list=a.values.tolist() #将DataFrame转化为list
#a_list=a["name"].tolist()
print(type(a_list))
print(a_list)
a_numpy=np.array(a) #将DataFrame转化为numpy.ndarray
print(type(a_numpy))
print(a_numpy)
a_list_from_numpy=a_numpy.tolist() #将numpy.ndarray转化为list
print(type(a_list_from_numpy))
print(a_list_from_numpy)
输出如下
<class 'pandas.core.frame.DataFrame'>
<class 'list'>
[['A', 1], ['B', 2], ['C', 3]]
<class 'numpy.ndarray'>
[['A' 1] ['B' 2]
['C' 3]]
<class 'list'>
[['A', 1], ['B', 2], ['C', 3]]
常见的Python画图工具有Matplotlib、Seaborn、Pyecharts、Plotly等。这里介绍Matplotlib,基本可以实现可视化功能。
import matplotlib.pyplot as plt
a=[1,2,3,4]
b=[2,4,6,8]
plt.plot(a,b)#将a,b对应铧画到x,y轴上,折线图
plt.show()#显示当前图片,如果不加则不显示
import matplotlib.pyplot as plt
a=[i for i in range(20)]
b=[20-i for i in range(20)]
plt.scatter(a,b,color="red")
plt.title("a~b")
plt.xlabel("x/a")
plt.ylabel("y/b")
plt.savefig("a.jpg")
量化策略的回测过程中可以将相关数据导入到数据库中,这里以Sqlite3为例,简单阐述Python对数据库的调用。
import sqlite3 as sql
def create():
con=sql.connect("database.db")#会在当前目录下生成database.db文件
c=con.cursor()
c.execute('''CREATE TABLE TEST
(ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL)
''')#创建一个表
con.commit()
con.close()
def insert():
con=sql.connect("database.db")
c=con.cursor()
c.execute("INSERT INTO TEST (ID,NAME) VALUES (3, 'APPLE')")#插入数据
con.commit()
con.close()
def select():
con=sql.connect("database.db")
c=con.cursor()
c.execute("SELECT * FROM TEST")#筛选表中所有数据
for data in c:
print(data)
con.commit()
con.close()
if __name__=="__main__":
create()
select()
insert()
select()
输出如下
(3, 'APPLE')
Python中与数据库交互操作过程包括连接数据库,执行相关数据库的命令并commit,最后关闭数据库。
Talib(Technical Analysis Library)提供了对于量化策略中技术指标的计算函数。以移动平均线(Moving Average)为例,使用talib完成相关指标计算。
import talib
import numpy as np
import matplotlib.pyplot as plt
data=np.random.random(50) #生成一个长度为50的随机序列代表时序数据
MA=talib.MA(data,10) #计算10个单位的移动平均线
plt.plot(data,label="close")
plt.plot(MA,label="MA")
plt.legend()
plt.show()