零基础搭建量化投资系统:以Python为工具
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.3 数值运算

1.常量和变量

常量是不会变化的量。Python 3并没有命名常量,也就是说不能像C语言那样给常量起名字,只能以具体数值来代表常量。例如,整数常量12,字符串常量’abc’等。

Python 3的常量包括数字、字符串、布尔值(True, False)、空值(None)。

变量是可以通过变量名访问的计算机内存中的一块区域,它可以存储规定范围内的值,而且值可以改变。基于变量的数据类型,Python 3解释器会分配指定内存,并决定不同的数据在内存中的存储形式。

变量的命名前面已经介绍过。

del语句可以删除不再使用的变量,并释放变量所占的内存资源。

见示例3-19。

        var1=10                  #创建变量var1
        var2='hello'             #创建变量var2
        print('var1=', var1)
        print('var2=', var2)
        del var1, var2           #删除掉var1和var2变量,以后再引用就会出错
        print('var1=', var1)

程序运行结果:

        var1= 10
        var2= hello
            print('var1=', var1)
        NameError: name 'var1' is not defined

2.变量赋值

Python中的每个变量必须赋值才会被创建,赋值不需要先做类型声明,变量的类型就是赋值的数据类型或表达式运算结果的数据类型。

等号“=”用来给变量赋值,其左边是一个变量名,右边是存储在变量中的值。

见示例3-20。

        n=20                     #n是整型变量,值为20
        miles = 1000.0           #miles是浮点型变量,值为1000.0
        name = "John"            #name是字符串变量,值为John
        print(n, miles, name)
        n=35.5                   #n的值由20变为35.5,变为浮点类型
        miles = miles*2         #miles是浮点型变量,值变为2000.0
        name = "Tom"             #name是字符串变量,值变为Tom
        print(n, miles, name)

程序运行结果:

        201000.0 John
        35.52000.0 Tom

3.数值类型转换

当Python表达式中包含不同数据类型时,如同时包含浮点数和整数,为了提高精度或者取整数,就需要使用类型转换函数。

int(x)是将x转换为纯整数。

float(x)是将x转换为浮点数。

round(x[, n])是改变浮点数小数点后的位数,带四舍五入进位,如round(10.456,2)返回10.46。

complex(x)是将x转换成实数部分为x和虚数部分为零的复数。

complex(x, y)是将x和y转换成一个实数部分是x和虚数部分是y的复数。

见示例3-21。

        x=12.88
        a=int(x)
        b=float(a)
        c=complex(x)
        print('x=', x, type(x))
        print('a=', a, type(a))
        print('b=', b, type(b))
        print('c=', c, type(c))

程序运行结果:

        x= 12.88 <class 'float'>
        a= 12 <class 'int'>
        b= 12.0 <class 'float'>
        c=(12.88+0j)<class 'complex'>

4.数学函数

Python的标准数学函数分为内置函数和math数学库。

(1)表3-10中的是内置函数,其不需要引入库。

表3-10 内置函数

示例3-22:对于炒股的小王来说,假如每周能赚5%,1万元本金到年底会有多少资金,获利率达到多少?(除去节假日,1年按35周计算。)

通过分析,我们确定可以利用次幂函数进行计算。下面直接给出Python程序:

        wealth=10000*pow((1+0.05),35)
        print(’小王到年底有’, round(wealth,2), ’元资金。')
        proportion=(wealth-10000)/10000*100
        print(’获利率为:', round(proportion,2), '%')

程序运行结果:

        小王到年底有 55160.15 元资金。
        获利率为: 451.6 %

示例3-23:小红有10万元,三年内暂不使用。假定银行1年定期利息为10%,买货币基金年化收益也为10%,其按日结息。假设三年内银行定期利息和货币基金年化收益不会改变,问小红买货币基金的收益比存银行多多少元?

解题思路:银行是定期,3年是3年复利,货币基金是日复利。下面给出程序代码。

        Y1=100000*(1+0.1)**3            #Y1银行3年定期本金加收益
        Y2=100000*(1+0.1/365)**(365*3)#Y2货币基金按日结息本金加收益Y3=Y2-Y1
        Y3=Y2-Y1                             #差额
        print(’小红买货币基金比存银行的收益多’, round(Y3,2))

程序运行结果:

        小红买货币基金比存银行的收益多 1880.33

(2)Python有math数学库,在引入数学库后就可以使用更多的数学函数了。

引入数学模块的语句:

    import math

查看math库帮助:

    help('math')

数学库的常量见表3-11。

表3-11 math数学库的常量

数学库的函数见表3-12。

表3-12 数学库的函数

示例3-24:有一个三位的数字,其数字从0~9中随机选取,可重复取数,问每组号码的概率是多少?

解题思路:位置A, B, C可选取的数字都是0~9,有10种取法,因此全部组合P为10*10*10=1000。这实际上就是福利3D彩票每注奖号的中奖概率。

        #三位数字ABC,每个位置有10种选号方法。
        A=10
        B=10
        C=10
        D=A*B*C     #D是全部组合数
        P=1/D         #P是每组号码的概率
        print(’三位数字ABC每组号码的概率:', round(P,3))

程序运行结果:

        三位数字ABC每组号码的概率:0.001

示例3-25:有一个五位的数字,数字从0~9中随机选取,不可重复取数,问五位数字的组合有多少种?

解题思路:从题意中可以看出,这是一个排列问题,我们可以直接使用排列公式进行计算。

排列P,从n个元素中取r个进行排列,排列有顺序。排列P的组合数为n! /(n-r)!,其中感叹号“!”表示阶乘。我们可以用math.factorial(x)函数来计算阶乘。程序代码如下:

        import math
        P5=math.factorial(10)/math.factorial(10-5) #P5五位数字组合数
        print(’五位数字的组合有’, int(P5), ’种。')

程序运行结果:

        五位数字的组合有 30240 种。

示例3-26:福利双色球彩票有红球33个,蓝球16个,每注彩票号码由6个红球和1个蓝球构成,号码没有顺序,问所有双色球组合数是多少?

解题思路:这是一个组合问题,我们可以直接代入组合公式。组合C,从n个元素中取r个元素,不进行排列,组合数为C=n! /(r! *(n-r)!),程序如下:

        import math
        R6=math.factorial(33)/(math.factorial(6)*math.factorial(33-6))
                    #红球组合数
        B1=16       #蓝球取法16选1
        C=R6*B1
        print(’所有双色球组合数是’, int(C), ’种。')

程序运行结果:

        所有双色球组合数是 17721088 种。

5.随机函数

随机函数包括基本随机数函数和扩展随机数函数,需要使用Python标准库——random。

引入随机数库语句:

        import random

查看随机数库帮助信息:

        help(' random ')

random库中的函数见表3-13。

表3-13 random库中的函数

随机函数的用处很多,特别是在电子游戏和仿真领域。如果我们想实现一些功能,利用其他语言需要自己写程序,而利用Python语言就可以直接使用现成的函数。

示例3-27:用Python实现机选5注福利彩票双色球的号码。要想实现这一功能,其他编程语言需要写很多行代码,而Python只需要下面几行代码。

        """
        模拟双色球开奖程序
        """
        import random
        print()
        rb=[x for x in range(1,34)]     #建立一个1~33的数字列表rb
        lb=[x for x in range(1,17)]     #建立一个1~16的数字列表lb
        random.seed()                  #初始化随机种子
        print(’机选五注双色球彩票号码:')
        for i in range(5):              #我们用Pyhton选5注号
        random.shuffle(rb)             #用函数random.shuffle打乱列表顺序
        random.shuffle(lb)             #用函数random.shuffle打乱列表顺序
        hh=[rb[0], rb[1], rb[2], rb[3], rb[4], rb[5]]
        hh.sort()                      #对选中红号排序
        print(hh[0], hh[1], hh[2], hh[3], hh[4], hh[5], ' + ', lb[0])

程序运行结果:

        机选五注双色球彩票号码:
        6 9 18 20 25 27  +  14
        3 7 16 19 24 31  +  9
        1 7 8 25 28 31  +  15
        2 3 6 23 28 32  +  2
        3 11 14 20 22 26  +  1

上面例子使用了列表数据类型。