python量化交易:Joinquant_量化交易基础【三】:python基
本语法与变量
本⽂是量化交易零基础⼊门教程的第三篇。
摘要
python是什么
python的基础语法
变量与赋值
Python 保留字符
打印 print
全局变量
基本数据类型-数字与字符串
算术运算
查看数据类型 type
数据类型-列表与字典
⾃测与⾃学
前⽂讲解了量化交易中策略运⾏的基本框架以及实现⽅法,其中虽然给出⼀个简单策略的完整代码,但只是初步认识,想完全看懂并⾃⼰写需要掌握python这门编程语⾔。
⼀般常见的python教程都是针对程序员的,所以很多内容在做量化写策略时都往往⽤不到。⽽本教程则是以量化的情景从零讲解python编程,所以将更适合想学做量化策略的⼈。
当然,对如果想更完备⽽全⾯的学习python语⾔的⼈,不妨看下这个⽂章(可能会繁杂些,也可能更适合你):
我们将以前⽂策略代码为例进⾏讲解,如下:
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
def period(context):
order(g.security, 100)
python是什么
python是与计算机交流的⼀种语⾔。我们把想让计算机做的事情⽤python写出来,就如同前⽂那样的⼀⾏⾏代码,从⽽,计算机才能理解并去按我们的想法去做。这是⼀种通俗易懂的理解,但已经⾜够了。想了解更多专业⾓度的介绍就⾃⾏搜索了解吧。
Python2与Python3
Python语⾔本⾝也是如同⾃然语⾔般在不断变化的,升级到python3.0版本时出现了较⼤的变化,以⾄于python分为了python2与python3两个不互相兼容的版本。
由于世界上有很多流⾏功能函数库对python3的⽀持并⾮很好,⽽有些量化过程中策略或系统可能会⽤
到,所以我们⽤python2来写策略,⽽且聚宽做策略回测代码也只⽀持python2。(聚宽投资研究功能中⽀持使⽤python3)
不过对写策略来说,python2与python3的区别并不明显。具体区别见。
python的基础语法
⼤⼩写敏感
⽐较容易理解,就是字母的⼤写与⼩写是区分的,所以如果你把前⽂例⼦的代码中的若⼲个字母从⼩写变成⼤写,系统会报错。要⽤英⽂符号
之前讲过,冒号、逗号、分号、括号、引号等各种符号必须⽤英⽂的,中⽂的会不识别⽽报错。
注释
为了让代码的便于交流理解,通常都会在代码中写⼊注释⽤以说明代码,注释是给⼈看的,所以计算机会忽略(顺便提下,空⾏也会被忽略),⽤中⽂记录思路也没关系。强烈建议养成写注释的好习惯。注释的⽅法有⼆:
(#)会把所在⾏的其后的所有内容设定为注释,如下
# 注释样例
# 这是⼀⼀个每天买平安银⾏的策略
# 初始化
def initialize(context):
run_daily(period,time='every_bar')
# 设定要买⼊的股票是平安银⾏
g.security = '000001.XSHE'
# 周期循环
def period(context):
#买⼊100股平安银⾏
order(g.security, 100)
三个单引号(''')或三个双引号(""")会把之间的内容设定为注释,以单引号为例如下:
'''
注释样例
这是⼀⼀个每天买平安银⾏的策略
是我写的:)
'''
'''初始化'''
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
'''周期循环'''
def period(context):
'''买⼊100股平安银⾏'''
order(g.security, 100)
⾏与缩进
之前讲过,代码缩进的时候要对齐,缩进⽅法是四个空格或⼀个tab键(推荐⽤tab),不要混着⽤。⽐如例⼦中周期循环部分除第⼀句都是要缩进的。
缩进的含义是这样的,有些语句是要包含其他连续若⼲条语句才成⽴的,这些语句通过缩进表⽰这种被包含的关系。如下:
# initialize这条语句包含了其下的两条语句
def initialize(context):
# 这两条语句是要被其上的initialize包含的,要缩进
run_daily(period,time='every_bar')
g.security = '000001.XSHE'
⼀⾏写多条语句
⼀般习惯是⼀⾏只写⼀条语句,如果要⼀⾏写多条语句要⽤分号隔开,不常⽤但要认识,如下,我把例⼦中原本的第⼆⾏与第三⾏写在⼀⾏了(⽐较长排版可能会⾃动换⾏显⽰)。
def initialize(context):
run_daily(period,time='every_bar');g.security = '000001.XSHE'
⼀条语句写在多⾏
有时⼀条语句可能就会很长,为了便于阅读会⽤斜杠(不是除号,是从左上到右下的)分隔后写在多⾏。如下,例⼦的第⼆⾏代码被斜杠分隔后写在两⾏。
def initialize(context):
run_daily(period,\
time='every_bar')
python是做什么的通俗易懂的g.security = '000001.XSHE'
变量与赋值
我们在之前的例⼦中见过这样⼀⾏语句
g.security = '000001.XSHE'
当时没细讲,含义是把'000001.XSHE'这个字符串赋值给名为g.security的变量(security是英⽂证券的意思)。
变量通俗的理解是,计算机中存放数据的有名字的盒⼦。另外变量名字是在赋值语句中定义的。
赋值,即赋予变量数据,写法是等号,含义是把等号右边的数据(或变量⾥的数据)放⼊左边的变量中去。⽤法如下:
# ⽤法:变量名 = 数据或变量
a=1
b='你好'
# 把a中的数据1赋值给了c
c=a
# 把b中的数据'你好'赋值给了a,此时a中的1被替换了
a=b
Python 保留字符
有些名字被系统所占⽤不能⽤作变量名,或任何其他标识符名称,如下:
and        exec    not    assert    finally    continue
break    for        pass    class    from    print
or      global    raise  def        if        return
del        import    try    elif    in        while
else    is        with    except    lambda    yield
打印 print
print是⾮常常⽤⽽重要的语句,它能把变量⾥的内容在⽇志中打印输出出来,通过它我们能了解程序运⾏的细节。 ⽤法如下:
# ⽤法: print(变量名)
a=1
print(a)
b='你好'
print(b)
如下图,把代码放到周期循环⾥后,点编译运⾏执⾏代码,每个交易⽇都打印了a、b,因为运⾏了两个交易⽇,所以打印了2组a、b。
注意,后⾯的例⼦都可以这个⽅法来执⾏。
print也可以直接打印数据,如下
# ⽤法: print(数据)
print(1)
print('你好')
为了能在⽇志中看出打印内容的含义,可以采⽤如下⽅法,此⽅法经常⽤于记录策略的运⾏情况。
# ⽤法:print("说明、解释等,⽤%s表⽰变量的位置" % (变量或数据))
a=1
b='hello'
print("a=%s" % (a))
print("b=%s" % (b))
print("%s是你好的意思" % (b))
#\n是在所在位置换⾏的意思,能让⽇志在⽇期信息的下⼀⾏开始打印
print("\na=%s" % (a))
# ⽤之前的⽅法执⾏后结果如下:
2016-06-01 09:30:00 - INFO  - a=1
2016-06-01 09:30:00 - INFO  - b=hello
2016-06-01 09:30:00 - INFO  - hello是你好的意思
2016-06-01 09:30:00 - INFO  -
a=1
全局变量
你可能会发现初始化⾥的变量与周期循环⾥的变量是不通的,⽐如你运⾏如下的代码会报错:
def initialize(context):
run_daily(period,time='every_bar')
a=1
def period(context):
print(a)
报错信息如下,含义是a没有被定义
NameError: global name 'a' is not defined
为了让变量能在全局被使⽤,需要在变量前加'g.',使之成为全局变量。所以,把刚刚的代码中的a改为全局变量就能正确运⾏了。
def initialize(context):
run_daily(period,time='every_bar')
g.a=1
def period(context):
print(g.a)
基本数据类型-数字与字符串
对计算机来说,不同的数据往往需要不同的操作与存储要求,因此在赋值时python会⾃动为数据分类,从⽽对不同的数据采取不同的应对⽅法。⽐如,数字可以数学运算,但⽂本就不可以,字母可以转换⼤⼩写,数字不⾏。
数字(Number)
数字就是数字,可以做诸如加减乘除的计算操作,具体可分为多种类型,⽐如股价⼀般就是浮点数型。因为在赋值变量的时
候,python会⾃动调整变量类型。所以需要关注数字类型的时候并不多。
数字具体分为int(整数)、float(浮点数,即 包含⼩数位)、bool(布尔值,即True和False,True是1,False是0)等。
a = 3      # 整数
b = 3.1415 # 浮点数
c = True  # 布尔值
字符串(String)
字符串可以理解为⽂本或⽂字,不能像数字进⾏数学运算,有其特别的操作,⽐如股票代码、股票名称⼀般都是字符串。
Python 可使⽤引号( ' )、双引号( " )、三引号( ''' 或 """ ) 来表⽰字符串,引号的开始与结束必须的相同类型的。如下,不妨⽤刚讲的print打印下看看。
# 其中三引号可以由多⾏组成来编写多⾏⽂本
a = '九歌'
b = "袅袅兮秋风"
c ="""袅袅兮秋风,
洞庭波兮⽊叶下。
——屈原《九歌》"""
算术运算
数字变量之间是可以进⾏算术运算的,如下: