python学习笔记(1)

环境部署
----------------
一、安装Anaconda
1.Anaconda是python的一个科学计算发行版,内置了数百个python经常会使用的库,也包括了机器学习或者数据挖掘的库,如Scikit-learn,Numpy,Scipy和pandas等,其中有一些可能有一些TensorFlow依赖库
2.Anaconda提供了一个编译好的环境可以直接安装
3.Anaconda自动集成了最新吧的MKL(Math Kernel Library)库,加速矩阵运算和线性代数的运算
4.Anaconda https://www.continuum.io/downloads
5.根据操作系统下载对应版本的Python3.5版
二、Python包管理
1.安装:pip install xxx, conda install xxx
卸载:pip uninstall xxx,conda uninstall xxx
升级:pip install -upgrade xxx,conda uodate xxx
详细用法:https://pip.pypa.io/en/stable/reference/

2.Python虚拟环境
(1)Virtualenv:https:virtualenv.pypa.io/en/stable/userguide/
(2)conda虚拟环境:https://conda.io/docs/using/envs.html
3.多版本python管理
conda管理:https://conda.io/docs/py2or3.html
三、IDE
1.Jupyter notebook
(1)Anaconda自带,无需安装
(2)记录思考过程,实时查看运行过程
(3)给予web在线编辑器
(4).ipynb文件分享
(5)可交互式
(6)记录历史运行结果
(7)支持MarkDown ,Latex

2.IPython
(1)Anaconda自带,无需单独安装
(2)Python的交互式命令行Shell
四、Numpy数据结构
Numpy,Numerical Python
1.高性能科学计算与数据分析的基础包,提供多维数组对象
2.ndarray,多维数组(矩阵),具有矢量运算能力,快速、节省空间
3.矩阵运算,无需循环,可以完成类似Matlab中的矢量运算
4.线性代数、随机生成数
5.import numpy as np
6.ndarray,N维数组对象(矩阵)
(1)所有元素都必须是相同类型
(2)ndim属性,维度个数
(3)shape属性,各维度大小
(4)dtype属性,数据类型
7.创建ndarray
(1)np.array(collection),collection为序列性对象(list),嵌套序列(list of list)
(2)np.zeros,np.ones,np.empty指定大小的全0或者全1数组
(3)注意:第一个参数是元祖,用来指定大小,如(3,4)
empty不是总返回全0,有时返回的是为初始的随机值
(4)np.arange()类似range(),注意是arange()而不是arrange
(5)ndarray数据类型
dtype,类型名+位数,如float64,int32
(6)转化数组类型 astype
(7)索引与切片
一维数组的索引与python的列表索引功能类似
多维数组的索引:arr[r1:r2,c1:c2]
arr[1,1]等价于arr[1][1]
[:]代表某个维度的数据
条件索引:布尔值多维数组 arr[condition] condition可以是多个条件的组合
注意:多个条件的组合需要用& | ,而不是and or
8.np.where:矢量版本的三元表达式 x if condition else y
np.where(condition,x,y)
(1)常用的统计方法
np.mean:统计一行的均值
np.sum:统计一行的总和
np.max(min):统计最大值(最小值)
np.std:统计标准差
np.var:统计方差
多维的话要指定统计的维度,否则默认是在全部维度上做统计
五、SciPy
1.在Numpy库的基础上增加了众多的科数学、科学以及工程常用的库函数
2.线性代数、常微分方程求解、信号处理、图像处理、稀疏矩阵等
3.import scipy as sp
六、向量化向量化(vectorization)
1.向量化:
(1).获得执行速度更快更、更加紧凑的代码策略
(2).基本思路:“一次”在一个复杂对象上进行操作,或者向其应用某个函数,而不是通过在对象的某个单元上循环来进行
(3).在python级别上,函数式编程map,filter和reduce提供了向量化的手段
(4).在Numpy的级别上,在ndarray对象上进行的循环由高度优化的代码负责,大部分代码用C语言编写,远远快于纯python
(5).矢量间运算,相同大小的数组间的运算应用在元素上
(6).矢量和标量的运算,"广播"-将标量"广播"到各个元素上
2.通用函数(ufunc):元素级的运算
3.常用的通用函数
(1)ceil 向上取整
(2)floor 向下取整
(3)rint 四舍五入
(4)isnan 判断元素是否为NaN(Not a Number)
(5)multiply 元素相乘
(6)divide 元素相除
七.数据分析建模理论基础
0.数据分为:(1)训练数据;(2)测试数据 要注意训练数据要比测试数据多的
1.任务分类:(1)分类
(2)回归
(3)聚类
(4)时许分析
2.分类与回归:
(1)应用:信用卡申请人风险评估、预测公司业务增长、预测房价等
(2)原理:
分类:将数据映射到预先定义的群组或类。算法要求基于数据属性值来定义类别,把具有某个特征的数据项映射到给定的某个类别上面
回归:用属性的历史数据预测未来趋势,算法首先假设一些已知类型的函数可以拟合目标数据,然后利用某些误差分析确定一个与目标数据拟合程度最好的函数
区别:分类模型采用的是离散预测值,回归采用的是连续的预测值
聚类:根据症状归纳特定疾病、发现信用卡的高级用户、根据上网行为对客户进行分群进而精确营销
原理:在没有给定划分类的情况下,根据信息相似度进行信息聚类
聚类的输入是一组未被标记的数据,根据样本特征的距离或者相似度进行划分。划分的原则是保持最大组内相似性和最小组间的相似性
一个叫监督学习,另外一个叫做非监督学习
3.时序模型
(1)应用:下个季度的商品销量或库存量是多少?明天用电量是多少?
(2)原理:描述基于时间或者其他序列的经常发生的规律或者趋势,并对其建模。
(3)与回归一样,用已知的数据预测未来的至但这些数据的区别是变量所处的时间不同。重点考察数据之间在时间维度上的关联性HMM模型
九:使用python实现蒙特卡洛模拟的期权估值
1.蒙特卡洛模拟:
(1):蒙特卡洛模拟是金融学和数值科学中最重要的算法之一
(2)当这种模式足够精确的时候,能够产生与实际操作中对统一条件相同的反应
(3)传统的经验方法由于补鞥能够逼近真实的物理过程,很难得到比较满意的结果,而蒙特卡洛方法由于能够真实的模拟实际物理过程,故及决问题与实际非常符合,可以得到很满意的结果
(4)基本思想:当所要求解的问题是某种事件出现的概率,或者某个随机变量出现的期望值的时候,可以通过某种"试验"的方法,得到这种事件出现的概率,或者这个随机数的平局值,并用他们作为问题的解
(5)简单表述:通过重复产生大量的随机数模拟可能实现的环境来帮助我们解决不确定情景下的决策问题的方法
例如:圆周率pi的计算

(6)蒙特卡洛模拟在期权定价或者风险管理问题上有很强的能力;仍以处理很高维的问题
(7)缺点:高计算要求,因此必须高效的实现该算法
(8)实现策略:从基础到向量化的两种实现方法
纯python,只使用内建的python功能和标准库实现的蒙特卡洛估值
向量化Nunpy,使用Numpy功能实现更加紧凑高效的版本

2.蒙特卡洛模拟期权估值的步骤:
(1)将时间间隔[0,T]分隔为等距的,长度为t的子时段
(2)开始循环i=1,2,3.....,
1)每个子时间步t

"""
    作者:石则祺
    项目参考:《Python金融大数据分析》
"""
from __future__ import division,print_function
from math import log,sqrt,exp
from scipy import stats

def bsm_call_value(S0,K,T,r,sigma):
    """
    :param S0:初始标的物价格
    :param K:期权行权价格
    :param T:期权到期日
    :param r:固定无风险短期利率
    :param sigma:标的物固定波动率
    :return:返回值
    """
    S0=float(S0)
    d1=(log(S0/K)+(r+0.5*sigma**2)*T)/(sigma*sqrt(T))
    d2=(log(S0/K)+(r-0.5*sigma**2)/(sigma*sqrt(T)))
    value=(S0*stats.norm.cdf(d1,0.0,1.0)-K*exp(-r*T)*stats.norm.cdf(d2,0.0,1.0))
    return value
"""
    作者:石则祺
"""
from __future__ import division,print_function
from bsm_functions import bsm_call_value
from time import time
from math import exp,sqrt,log
from random import gauss,seed
import numpy as np
def run_main():
    """
    主函数
    :return:
    """
    S0=100.
    K=105.
    T=1.
    r=0.05
    sigma=0.2
    init_value=bsm_call_value(S0,K,T,r,sigma)
    print('BSM方法的期权估值:',init_value)

    M=50#子时段的个数
    dt=T/M#子时段时间间隔
    I=250000#迭代次数

    #方法1.纯python,只使用内建的python功能和标准库来实现蒙特卡洛估值
    t0=time()
    S=[]
    for i in range(I):
        path=[]
        for t in range(M+1):
            if t==0:
                path.append(S0)
            else:
                z=gauss(0.,1.)
                S_t=path[t-1]*exp((r-0.5*sigma**2)*dt+sigma*sqrt(dt)*z)
                path.append(S_t)
        S.append(path)
    C_0=exp(-r*T)*sum([max(path[-1]-K,0) for path in S])
    duration=time()-t0
    print('使用纯python实现期权估计的模拟:',C_0)
    print('耗时{}秒'.format(duration))

    #方法2.向量化Numpy,使用Numpy功能实现更加紧凑高效的版本
    t1=time()
    S=np.zeros((M+1,I))
    S[0]=S0
    for t in range(1,M+1):
        z=np.random.standard_normal(I)
        S[t]=S[t-1]*np.sum(np.maximum(S[-1]-K,0))/I
        duration2= time()-t1
        print('使用Nnmpy实现期权估值的模拟:',C_0)
        print('耗时{}秒'.format(duration2))
if __name__ =='__main__':
    run_main()
原文地址:https://www.cnblogs.com/bigdata-stone/p/9759981.html