【量化投资】Python 入门
一、为什么使用 python二、我们需要学些什么三、Python 基础
1、输入输出2、数据转换3、导包4、数据类型
1)数字2)字符串3)列表4)元组5)集合6)字典 5、函数
1)函数格式2)参数2)全局变量的使用
普通函数高阶函数 6、文件 *** 作
1)基本文件读写2)使用 wity 语句 7、异常处理
1)异常类型2)异常捕获与处理3)手动抛出异常4)finally 8、获取命令行参数9、类
1)构造函数2)类的继承3)对象删除 四、小结
【量化投资】Python 入门 一、为什么使用 python说起Web领域 你立马会想到 Java 和 Javascript语言,它们在Web领域不可撼动;Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现。
在量化投资(证券和比特币)开源项目里,全球star数排名前10位里面,有7个是用Python实现的。从数据获取到策略回测再到交易,覆盖了整个业务链,还是很厉害的!
因此,堪称入门免费、简单、可移植性、解释性、 丰富的库、 面向对象的Python语言,便就是它了!
其实,我认为,不管做不做量化分析,或者你是不是程序员,都应该学习 python ,数学专业可以用它建模,白领可以用它批量处理 excel,初高中生可以通过 python 入门编程,总之,这真的是一门简单强大的语言
我找了半天找不到那个 xx编程的洗脑广告,不过我估计有不少人看过
其实有很多人不知道 dokidoki 就是用 python 写的:
之前那个火爆全网的武汉加油,也是 python 写的:
之前很火的词云,也是 python 写的
当然,python 最火的还是爬虫:
总之,就算你对量化投资不感兴趣,我也建议你学学 python ,毕竟艺多不压身嘛,同时也可以把春节假期长肉的时间利用起来
二、我们需要学些什么除了语言基础之外,对于量化投资,我们还要学什么额外的 python 知识?
1、图形库
人脑对图形是最敏感的,除了机器分析数据外,我们还要将数据绘制成图形,方便我们去分析,所以一个简洁方便的图形库是必不可少的
2、爬虫
量化分析中有个概念是回测,其作用是将我们设计好的程序,用以前的数据跑一下,观察其盈利情况如何,只有在程序可靠的情况下,我们才真的会让其上线进行交易
而回测使用的数据,就需要我们从金融网站中爬取使用了
3、数据存储与处理
在爬到数据之后,我们还要对数据做基本的清洗与处理,以方便程序使用
4、自动交易
作为业余理财人,我们还要腾出时间,做自己本职的工作,不可能天天盯着股票看,所以,程序自动买卖交易是不可少的,这个也需要我们去考虑
python 可做的还有很多很多,但是对于量化投资,我们还是着重考虑上面几个点。
三、Python 基础 1、输入输出我们有时需要通过输出判断模型数据的
python 输入输出代码如下:
print("hello world") # hello world 输出 input("please input:") # 执行后。会输出 please input 然后阻塞等待输入2、数据转换
python 没有显示的数据类型, 其数据类型的定义在赋值时就确定了
3、导包python 原sdk中可能没有我们要用的函数,所以需要导入其他的包使用
python 导包和 java 一样,使用 import 语句
除了基础的导包方式外,我们还可以为导入的包起别名,或者直接导入方法
为导入的包起别名:
import math as m # 为 math 包起别名为 m print(m.pi)
只导入方法:
这里的 import * 表示导入 math 类中的所有方法,这样,我们在使用 math 的方法的时候就不用带上 math 了
from math import * ceil(3.14) # 4.04、数据类型 1)数字
数字包含 int,float,boolean 和 complex(复数)
这里要注意,python 中没有显示的数据类型定义,数据类型是在初始化的时候就决定好的:
int,float 可以通过 float(),int() 相互转换:
True 和 False 其实对应的是数字 1 和 2(这点其实有够奇葩的):
复数用 a+bj 的形式表示,a代表实部,b代表虚部,同时,也可以用 complex(a,b) 的形式声明复数:
2)字符串字符串用 ‘’ 或者 “” 声明
3)列表列表是 java 中数组,ArrayList 甚至 Stack Queue 的集合体
用中括号[]声明,可以使用下标访问
列表切片:
切片的访问方式如下 [start:end:step]
其中的 -1,表示访问倒数第一个元素,要注意,切片的访问是左闭右开的,即上面的例子范围为 [0,6)步长为2
start end 不写,默认从头到尾:
也可以用切片的方式,对列表进行倒序访问([::-1]):
列表可以使用 append() 添加元素,几个列表也可以通过 + 进行拼接:
栈式访问:
栈是先进后出的数据结构,列表同样支持这样的访问方式,使用 pop() 函数即可d出列表末尾元素
队列式访问:
队列是先进先出的数据结构,使用 pop(0) 可以d出列表头部的元素
4)元组元组类似于列表,但是元组一旦定义,就无法修改
元组使用 小括号() 声明
和列表不用,因为 元组不可变,所以其可以作为字典的 key,同时,元组也可以作为函数的不可变返回值,确保返回值的数据安全性
5)集合集合类似 java 中的 HashSet,同样的,集合中的元素不可重复,并且会默认进行排序
其用 大括号{}声明
删除元素,判断元素是否存在使用的语法如下:
6)字典字典类似于 java 的 HashMap,用大括号 {} 声明
字典的 key 不可以重复,如果出现相同的 key ,那么最新的 key 对应的 value 替代原 value
遍历 map 可以使用 items() 方法:
5、函数 1)函数格式python 中定义函数的格式如下:
def funcName(args): # logic return res
不需要显示的注明返回值类型
2)参数我们可以对函数参数添加默认值:
def funcWithDefaultVal(num1,num2=123): return num1+num2 print(funcWithDefaultVal(1)) # 124
在传参的时候,也可以指定对某个参数赋值:
这种方式类似于 map 中的 key-value 方式
def funcWithDefaultVal(num1,num2): return num1-num2 print(funcWithDefaultVal(num2=100,num1=0)) # -1002)全局变量的使用 普通函数
函数内与函数外同名的参数,默认情况下不是同一个:
a = 100 def changeA(): a=0 changeA() print(a) # 100
如果想在函数内使用全局变量,需要提前声明 global:
a = 100 def changeA(): global a a=0 changeA() print(a) # 0高阶函数
高阶函数(Higher-order function)或仿函数(functor)是可以接受函数作为参数的函数:
使用一个或多个函数作为参数返回另一个函数作为输出
Python 里的任何函数都可以作为高阶函数,下面举一个简单的例子:
# 创建一个函数,将参数列表中每个元素都变成全大写 def high(l): return [i.upper() for i in l] # 创建高阶函数,接受一个函数和一个列表作为参数 def test(h, l): return h(l) l = ['python', 'Linux', 'Git'] # 运行高阶函数,返回预期的结果 test(high, l) # ['PYTHON', 'LINUX', 'GIT']
python 中最常用的高阶函数就是 map() 了
map 是一个在 Python 里非常有用的高阶函数。它接受一个函数和一个序列(迭代器)作为输入,然后对序列(迭代器)的每一个值应用这个函数,返回一个序列(迭代器),其包含应用函数后的结果。
lst = [1, 2, 3, 4, 5] def square(num): "返回所给数字的平方." return num * num list(map(square, lst)) # [1, 4, 9, 16, 25]6、文件 *** 作
文件读取在 java 中可以说是一个不痛不痒的功能了,因为实际项目中很少用,web 项目中的 orm 层一般都用 mybatis 这样的框架,存储媒介都是数据库
但是在 python 中,有时我们的信息都存储在 csv 或者 txt 里,这时候,文件读取就显得至关重要了
1)基本文件读写文件读写的流程
**1、**打开文件,获取文件对象
**2、**对文件对象进行 读/写 *** 作
**3、**关闭文件对象
获取文件使用 open(参数1,参数2) 函数
open(参数1,参数2) 函数有两个参数,参数1是文件所在路径,参数2是文件 *** 作权限
文件 *** 作权限有下面三个:
**r:**只读
**w:**文件覆写,会覆盖源文件的所有内容
**a:**文件内容添加,会在源文件的末尾添加指定内容
fObj = open(, )
这里,我们先在本地磁盘下准备数据集
读取文件:
fObj = open("/Users/faro_z/CodePath/python/data.txt","r") str = fObj.read() fObj.close() # 无论什么时候,都必须记得文件 *** 作结束后关闭文件,避免出现线程阻塞 print(str)
写入文件信息:
如果指定文件不存在,会自动创建新的文件
fObj = open("/Users/faro_z/CodePath/python/new_file.txt","w") fObj.writelines("I am faroz n I like coding") fObj.close()2)使用 wity 语句
对于文件 *** 作,python 中建议使用 with 语句,因为 with 语句会自动关闭,就算读取过程中报错了,也会自动执行 close
其作用,类似于 try - finally
str = "" with open("/Users/faro_z/CodePath/python/data.txt","r") as fObj: str = fObj.read() fObj.close() print(str)7、异常处理 1)异常类型
在抛出异常、处理异常之前,我们要了解 python 中有哪些异常
**TypeError:**类型异常,一般出现在进行该类型不支持的 *** 作上
>>> print(1 + "kushal") Traceback (most recent call last): File "", line 1, in TypeError: unsupported operand type(s) for +: 'int' and 'str'
**NameError:**访问未定义的变量
>>> print(kushal) Traceback (most recent call last): File "", line 1, in NameError: name 'kushal' is not defined
**baseException:**所有异常的基类
对所有异常感兴趣的同学,可以查阅这篇文章:https://www.cnblogs.com/zln1021/p/6106185.html
2)异常捕获与处理try: statements to be inside try clause statement2 statement3 ... except ExceptionName: statements to evaluated in case of ExceptionName happens3)手动抛出异常
抛出异常,我们使用 raise 语句
>>> raise ValueError("A value error happened.") Traceback (most recent call last): File "", line 1, in ValueError: A value error happened.
>>> try: ... raise ValueError("A value error happened.") ... except ValueError: ... print("ValueError in our code.") ... ValueError in our code.4)finally
finally 是无论如何都会执行的
在 JDBC 中,我们一般会把关闭数据库连接的 *** 作,写在 finally 块中,这样,就算前面的业务代码出现错误,导致程序中断,也不会影响我们的数据库连接关闭 *** 作
同理,我们上文中讲到的文件 *** 作,其close()函数,我们也可以写在 finally 中,保证文件关闭 *** 作一定会执行
>>> try: ... raise KeyboardInterrupt ... finally: ... print('Goodbye, world!') ... Goodbye, world! KeyboardInterrupt Traceback (most recent call last): File "8、获取命令行参数", line 2, in ?
python 作为脚本语言,是可以用来写脚本的
执行脚本,必然需要程序能够获取命令行参数,那怎么使用 python 获取命令行参数呢?
这里,我们需要导入 sys 库,使用 sys.argv 获取参数
sys.argv 是一个列表,其第一个元素表示文件自身,其他位置的元素就是我们当前行的命令行参数
import sys print(sys.argv) # 打印出命令行参数
可以看到,命令行参数被成功打印:
9、类python 中类的写法如下:
class nameoftheclass(parent_class): statement1 statement2 statement3
类中,我们可以声明方法:
class MyClass(object): """A simple example class""" i = 12345 # python 类方法必须传入 self ,表示对象中的方法 # 但是在调用方法的时候,这个 self 是省略的 def f(self): return 'hello world'1)构造函数
构造函数写法如下:
python 中,可以不用显示的定义成员变量,但是这种方法设置的变量,子类是无法访问的
def __init__(self): self.data = []2)类的继承
当一个类继承另一个类时,它将继承父类的所有功能(如变量和方法)。这有助于重用代码。
class Person(object): # 成员变量 space ,只有显示的声明子类才能使用 space = "" def __init__(self): self.space="human" def printSpace(self): print(self.space) class Student(Person): def __init__(self,name="default"): Person.__init__(self) self.name=name stu = Student("FARO_Z") print(stu.name) stu.printSpace()
和 java 不同,python 是支持多继承的:
class MyClass(Parentclass1, Parentclass2,...): def __init__(self): Parentclass1.__init__(self) Parentclass2.__init__(self) ... ...3)对象删除
现在我们已经知道怎样创建对象,现在我们来看看怎样删除一个对象。我们使用关键字 del 来做到这个。
>>> s = "I love you" >>> del s >>> s Traceback (most recent call last): File "", line 1, in NameError: name 's' is not defined
del 实际上使对象的引用计数减少一,当对象的引用计数变成零的时候,垃圾回收器会删除这个对象。
四、小结也许你发现,学完今天这些知识,你还是写不出一个像样的程序
确实,今天介绍的只是 python 的基础语法,并且还是建立在读者已经掌握其他语言的情况下进行的简单介绍
python 的强大之处在于,有大量的第三方库可以使用,借助这些库,我们可以编写爬虫,绘制图形,甚至有专门针对 python 的 web 框架
在后面几天,我会一次介绍 python 中的数据处理、图像绘制、爬虫等库,逐步为我们的量化投资程序添砖加瓦
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)