python做量化交易干货分享,python可以做量化交易吗

大家好,小编来为大家解答以下问题,python学到什么程度可以做量化考核,学量化投资和python能赚钱吗?,现在让我们一起来看看吧!

【量化投资】Python 入门

一、为什么使用 python

说起Web领域 你立马会想到 Java 和 JavaScript语言,它们在Web领域不可撼动;Python也已经在金融量化投资领域占据了重要位置,从各个业务链条都能找到相应的框架实现。

在量化投资(证券和比特币)开源项目里,全球star数排名前10位里面,有7个是用Python实现的简单编程代码python。从数据获取到策略回测再到交易,覆盖了整个业务链,还是很厉害的!

因此,堪称入门免费、简单、可移植性、解释性、 丰富的库、 面向对象的Python语言,便就是它了!

python x 量化投资

其实,我认为,不管做不做量化分析,或者你是不是程序员,都应该学习 python ,数学专业可以用它建模,白领可以用它批量处理 excel,初高中生可以通过 python 入门编程,总之,这真的是一门简单强大的语言

  • 我找了半天找不到那个 xx编程的洗脑广告,不过我估计有不少人看过

image-20220108091558877

  • 其实有很多人不知道 dokidoki 就是用 python 写的:

dokidoki

  • 之前那个火爆全网的武汉加油,也是 python 写的:

  • 之前很火的词云,也是 python 写的

image-20220108092524711

  • 当然,python 最火的还是爬虫:

爬虫

总之,就算你对量化投资不感兴趣,我也建议你学学 python ,毕竟艺多不压身嘛,同时也可以把春节假期长肉的时间利用起来

二、我们需要学些什么

除了语言基础之外,对于量化投资,我们还要学什么额外的 python 知识?

1、图形库

人脑对图形是最敏感的,除了机器分析数据外,我们还要将数据绘制成图形,方便我们去分析,所以一个简洁方便的图形库是必不可少的

绘图

2、爬虫

量化分析中有个概念是回测,其作用是将我们设计好的程序,用以前的数据跑一下,观察其盈利情况如何,只有在程序可靠的情况下,我们才真的会让其上线进行交易

而回测使用的数据,就需要我们从金融网站中爬取使用了

爬虫

3、数据存储与处理

在爬到数据之后,我们还要对数据做基本的清洗与处理,以方便程序使用

数据处理

4、自动交易

作为业余理财人,我们还要腾出时间,做自己本职的工作,不可能天天盯着股票看,所以,程序自动买卖交易是不可少的,这个也需要我们去考虑

自动交易

python 可做的还有很多很多,但是对于量化投资,我们还是着重考虑上面几个点。

三、Python 基础

1、输入输出

我们有时需要通过输出判断模型数据的

python 输入输出代码如下:

print("hello world")  # hello world  输出
input("please input:") # 执行后。会输出 please input 然后阻塞等待输入

image-20220106024420487

2、数据转换

python 没有显示的数据类型, 其数据类型的定义在赋值时就确定了

数据类型

3、导包

python 原sdk中可能没有我们要用的函数,所以需要导入其他的包使用

python 导包和 java 一样,使用 import 语句

导入 math 包

除了基础的导包方式外,我们还可以为导入的包起别名,或者直接导入方法

  • 为导入的包起别名:
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,booleancomplex(复数)

这里要注意,python 中没有显示的数据类型定义,数据类型是在初始化的时候就决定好的:

对应的数据类型

int,float 可以通过 float(),int() 相互转换:

相互转换

TrueFalse 其实对应的是数字 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) 可以弹出列表头部的元素

image-20220108090925939

4)元组

元组类似于列表,但是元组一旦定义,就无法修改

元组使用 小括号() 声明

元组

和列表不用,因为 元组不可变,所以其可以作为字典的 key,同时,元组也可以作为函数的不可变返回值,确保返回值的数据安全性

5)集合

集合类似 java 中的 HashSet,同样的,集合中的元素不可重复,并且会默认进行排序

其用 大括号{}声明

set

删除元素,判断元素是否存在使用的语法如下:

set的操作

6)字典

字典类似于 java 的 HashMap,用大括号 {} 声明

字典的 key 不可以重复,如果出现相同的 key ,那么最新的 key 对应的 value 替代原 value

map操作

遍历 map 可以使用 items() 方法:

遍历 map

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://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 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 中的数据处理、图像绘制、爬虫等库,逐步为我们的量化投资程序添砖加瓦

  • 23
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值