文章目录
- 【量化投资】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.0
4、数据类型
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()
函数即可弹出列表末尾元素
- 队列式访问:
队列是先进先出的数据结构,使用 pop(0)
可以弹出列表头部的元素
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)) # -100
2)全局变量的使用
普通函数
函数内与函数外同名的参数,默认情况下不是同一个:
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(<file path>,<op>)
这里,我们先在本地磁盘下准备数据集
- 读取文件:
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 "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'str'
**NameError:**访问未定义的变量
>>> print(kushal)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'kushal' is not defined
**BaseException:**所有异常的基类
对所有异常感兴趣的同学,可以查阅这篇文章:https://wwwblogs/zln1021/p/6106185.html
2)异常捕获与处理
try:
statements to be inside try clause
statement2
statement3
...
except ExceptionName:
statements to evaluated in case of ExceptionName happens
3)手动抛出异常
抛出异常,我们使用 raise 语句
>>> raise ValueError("A value error happened.")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
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 "<stdin>", line 2, in ?
8、获取命令行参数
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 "<stdin>", line 1, in <module>
NameError: name 's' is not defined
del 实际上使对象的引用计数减少一,当对象的引用计数变成零的时候,垃圾回收器会删除这个对象。
四、小结
也许你发现,学完今天这些知识,你还是写不出一个像样的程序
确实,今天介绍的只是 python 的基础语法,并且还是建立在读者已经掌握其他语言的情况下进行的简单介绍
python 的强大之处在于,有大量的第三方库可以使用,借助这些库,我们可以编写爬虫,绘制图形,甚至有专门针对 python 的 web 框架
在后面几天,我会一次介绍 python 中的数据处理、图像绘制、爬虫等库,逐步为我们的量化投资程序添砖加瓦
更多推荐
【量化投资】量化投资技术基础 ---- Python 急速入门
发布评论