• 二、常用函数


    (一)读写文件

    (1)创建单位矩阵(主对角线元素均为1,其余元素均为0)

    i5 = eye(5)

    注:eye()函数

    numpy.eye(N,M=None, k=0, dtype=<type 'float'>)

    关注第一个第三个参数就行了

    第一个参数:输出方阵(行数=列数)的规模,即行数或列数

    第三个参数:默认情况下输出的是对角线全“1”,其余全“0”的方阵,如果k为正整数,则在右上方第k条对角线全“1”其余全“0”,k为负整数则在左下方第k条对角线全“1”其余全“0”。

    (2)写文件 savetxt函数

    savetxt("eye.txt",i5)

    (3)读文件 loadtxt

    i = loadtxt('eye.txt')

    (二)读入csv文件

    股价数据存储在CSV文件中,第一列为股票代码以标识股票(苹果公司股票代码为AAPL),第二列为dd-mm-yyyy格式的日期,第三列为空,随后各列依次是开盘价、最高价、最低价和收盘价,最后一列为当日的成交量。以下为"data.csv"文件的一行数据:

    AAPL,28-01-2011, ,344.17,344.4,333.53,336.1,21144800

    读csv文件,我们将收盘价和成交量分别载入到两个数组中:loadtxt()函数

    c,v = loadtxt('data.csv',delimiter=',',usecols=(6,7),unpack=True)

    delimiter:分隔符设置为","

    usecols:参数为一个元组,以获取第7,8列数据

    unpack:参数设置为True,分拆存储不同列的数据,即分别将收盘价和成交量的数组赋值给变量c和v

    (三)平均数

    (1)成交量加权平均价格(VWAP)

    VWAP (Volume-Weighted Average Price,成交量加权平均价格)是一个非常重要的经济学量,
    它代表着金融资产的“平均”价格。某个价格的成交量越高,该价格所占的权重就越大。 VWAP
    就是以成交量为权重计算出来的加权平均值,常用于算法交易。

    例:

    股票A,1000股,价格10;
    股票B,2000股,价格15;
    算术平均值 = (10 + 15) / 2 = 12.5;
    加权平均值 = (10 * 1000 + 15 * 2000) / (1000 + 2000) = 13.33

    c,v = loadtxt('data.txt',delimiter=',',usecols=(6,7),unpack=True)

    vwap = average(c,weights=v)

    (2)平均数

    mean_c = mean(c)

    (3)时间加权平均价格

    在经济学中, TWAP(Time-Weighted Average Price,时间加权平均价格)是另一种“平均”
    价格的指标。既然我们已经计算了VWAP,那也来计算一下TWAP吧。其实TWAP只是一个变种
    而已,基本的思想就是最近的价格重要性大一些,所以我们应该对近期的价格给以较高的权重。
    最简单的方法就是用arange函数创建一个从0开始依次增长的自然数序列,自然数的个数即为收
    盘价的个数。当然,这并不一定是正确的计算TWAP的方式。事实上,本书中关于股价分析的大
    部分示例都仅仅是为了说明问题。计算TWAP的代码如下。

    t = arange(len(c))

    twap = average(c,weights=t)

    (四)极值,极差

    读取数据,将每日的最高价和最低价分别载入数组

    h,l = loadtxt('data.csv',delimiter=',',usecols=(4,5),unpack=True)

    (1)最大值max():每日最高价的最大值

    highest = max(h)

    (2)最小值min():每日最低价的最小值

    lowest = min(l)

    (3)极差ptp():

    最高价的极差:

    spread_high_price = ptp(h)

    等价于:spread_high_price = max(h)-min(h)

    (五)简单统计分析

    (1)收盘价中位数median()

    c = loadtxt('data.csv',delimiter=',',usecols=(6,),unpack=True)

    c_median = median(c)

    (2)方差var()

    c_variance = var(c)

    (六)股票收益率

    (1)简单收益率:diff(),std()

    NumPy中的diff函数可以返回一个由相邻数组元素的差
    值构成的数组。这有点类似于微积分中的微分。为了计算收益率,我们还需要用差值除以前一天
    的价格。不过这里要注意, diff返回的数组比收盘价数组少一个元素:

    returns = np.diff( c ) / c[ : -1]

    注意,我们没有用收盘价数组中的最后一个值做除数。接下来,用std函数计算标准差:
    print "Standard deviation =", np.std(returns)

    (2)对数收益率:log(),diff()

    先用log函数得到每一个收盘价的对数,再对结果使用diff函数即可。

    logreturns = np.diff( np.log(c) )

    (3)筛选收益率为正值的元素,where()

    posretindices = np.where(returns > 0)

    (4)波动率:

    在投资学中,波动率(volatility)是对价格变动的一种度量。历史波动率可以根据历史价
    格数据计算得出。计算历史波动率(如年波动率或月波动率)时,需要用到对数收益率。年波动
    率等于对数收益率的标准差除以其均值,再除以交易日倒数的平方根,通常交易日取252天。我
    们用std和mean函数来计算,代码如下所示:

    annual_volatility = np.std(logreturns)/np.mean(logreturns)
    annual_volatility = annual_volatility / np.sqrt(1./252.)
    print annual_volatility

    注意:sqrt使用浮点数,得到的结过才是正确的,为浮点数

    (七)分析日期数据

    dates, close=np.loadtxt('data.csv', delimiter=',', usecols=(1,6), unpack=True)

    执行以上代码后会得到一个错误提示:

    ValueError: could not convert string to float: b'28-01-2011'

    NumPy尝试把日期转换成浮点数。按照如下步骤处理日期:

    (1)日期转换函数

    我们需要做的是显式地告诉NumPy怎样来转换日期,需要用到loadtxt函数中的一个特定的参数converters,

    它是一本数据列和转换函数之间进行映射的字典。

    • 重新定义datestr2num()函数:

    def datestr2num(s):

      s = str(s,'utf-8')

      return datetime.datetime.strptime(s,"%d-%m-%Y").date().weekday()

    • 将日期函数挂上去:

    dates,close = loadtxt('data.csv',delimiter=',',usecols=(1,6),converters={1:datestr2num},unpack=True)

    • 创建一个包含5个元素的数组,分别代表一周的5个工作日。数组元素将初始化为0。

    averages = np.zeros(5)

    • 遍历0到4的日期标识,或者说是遍历星期一到星期五,然

    后用where函数得到各工作日的索引值并存储在indices数组中。在用take函数获取这些索引值
    相应的元素值。最后,我们对每个工作日计算出平均值存放在averages数组中。

    for i in range(5):
    indices = where(dates == i)
    prices = take(close, indices)
    avg = mean(prices)
    print("Day:%d,prices:%s,Average:%f"%(i,prices,avg))
    averages[i] = avg

    (八)真实波动幅度均值(ATR-Average True Range)

    import numpy as np
    import sys
    #h,l,c 分别代表当日最高价,最低价,收盘价 h, l, c
    = np.loadtxt('data.csv', delimiter=',', usecols=(4, 5, 6), unpack=True)
    #sys.argv[] 接收命令行参数(此处输入的参数是20,研究最近20天的数据) N
    = int(sys.argv[1]) h = h[-N:] l = l[-N:] print "len(h)", len(h), "len(l)", len(l) print "Close", c
    #构建前一天收盘价的数组 previousclose
    = c[-N -1: -1] print "len(previousclose)", len(previousclose) print "Previous close", previousclose
    #h-l:当日最高价-最低价
    #h-previousclose:当日最高价-前一天收盘价
    #previousclose-l:前一天收盘价-当日最低价
    #比较上面三个数组相对应的元素,取最大值。
    #下面的代码是书上提供的代码,应该是错误的。maximum函数一次只能对比两个数组,第三个数组放进去没有效果,不参与计算 #truerange
    = np.maximum(h - l, h - previousclose, previousclose - l)
    #下面是改正后的代码
    truerange_1 = np.maximum(h - l, h - previousclose)
    truerange = np.maximum(truerange_1, previousclose - l)
    print "True range", truerange 
    #创建一个长度为N的数组atr,并初始化数组元素为0
    atr
    = np.zeros(N)
    #这个数组的首个元素就是truerange数组元素的平均值
    atr[0]
    = np.mean(truerange)
    #用如下公式计算其他元素的值:
    #((N-1)*PATR + TR)/N
    #PATR表示前一个交易如日的ATR值,TR即当日的真实波动幅度
    for i in range(1, N):
      atr[i]
    = (N - 1) * atr[i - 1] + truerange[i]
      atr[i]
    /= N

    print
    "ATR", atr

    (九)计算简单移动平均线:convolve

     简单移动平均线(simple moving average)通常用于分析时间序列上的数据。为了计算它,
    我们需要定义一个N个周期的移动窗口,在我们的例子中即N个交易日。我们按照时间序列滑动
    这个窗口,并计算窗口内数据的均值。

    此处其实就是计算前5天(包含当天)的平均收盘价。

    import numpy as np
    import sys
    from matplotlib.pyplot import plot
    from matplotlib.pyplot import show
    #N为命令行接收的参数,此处输入的参数为5 N
    = int(sys.argv[1])
    #ones创建一个数组元素都为1的数组
    #创建一个数组作为权重,此处的每天的权重都是一样的(也可以是不等权重的,比如,时间越近,权重越大) weights
    = np.ones(N) / N print "Weights", weights c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
    #convolve卷积函数,详细解释见http://www.cnblogs.com/data-ccz/p/6133814.html
    #下面的语句可写为:sma = convolve(weights,c,'valid') sma
    = np.convolve(weights, c)[N-1:-N+1] t = np.arange(N - 1, len(c)) plot(t, c[N-1:], lw=1.0) plot(t, sma, lw=2.0) show()

    (十)计算指数移动平均线:exp(),linspace()

    除了简单移动平均线,指数移动平均线(exponential moving average)也是一种流行的技术
    指标。指数移动平均线使用的权重是指数衰减的。对历史上的数据点赋予的权重以指数速度减小,
    但永远不会到达0。我们将在计算权重的过程中学习exp和linspace函数。

    import numpy as np
    import sys
    from matplotlib.pyplot import plot
    from matplotlib.pyplot import show
    #构建权重
    #exp以自然数e为底的指数函数,次出传入的N为5
    weights = np.exp(np.linspace(-1., 0., N))
    #对权重值做归一化处理 weights
    /= weights.sum() print "Weights", weights c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True) ema = np.convolve(weights, c)[N-1:-N+1] t = np.arange(N - 1, len(c)) plot(t, c[N-1:], lw=1.0) plot(t, ema, lw=2.0) show()

    (十一)布林带

     布林带(Bollinger band)又是一种技术指标。是的,股票市场的确有成千上万种技术指标。
    布林带是以发明者约翰·布林格(John Bollinger)的名字命名的,用以刻画价格波动的区间。布
    林带的基本型态是由三条轨道线组成的带状通道(中轨和上、下轨各一条)。
     中轨 简单移动平均线。
     上轨 比简单移动平均线高两倍标准差的距离。这里的标准差是指计算简单移动平均线
    所用数据的标准差。
     下轨 比简单移动平均线低两倍标准差的距离。

    import numpy as np
    import sys
    from matplotlib.pyplot import plot
    from matplotlib.pyplot import show
    N = int(sys.argv[1])
    weights = np.ones(N) / N
    print "Weights", weights
    c = np.loadtxt('data.csv', delimiter=',', usecols=(6,), unpack=True)
    sma = np.convolve(weights, c)[N-1:-N+1]
    deviation = []
    C = len(c)
    for i in range(N - 1, C):
    if i + N < C:
    dev = c[i: i + N]
    else:
    dev = c[-N:]
    averages = np.zeros(N)
    averages.fill(sma[i - N - 1])
    dev = dev - averages
    dev = dev ** 2
    dev = np.sqrt(np.mean(dev))
    deviation.append(dev)
    deviation = 2 * np.array(deviation)
    print len(deviation), len(sma)
    upperBB = sma + deviation
    lowerBB = sma - deviation
    c_slice = c[N-1:]
    between_bands = np.where((c_slice < upperBB) & (c_slice > lowerBB))
    print lowerBB[between_bands]
    print c[between_bands]
    print upperBB[between_bands]
    between_bands = len(np.ravel(between_bands))
    print "Ratio between bands", float(between_bands)/len(c_slice)
    t = np.arange(N - 1, C)
    plot(t, c_slice, lw=1.0)
    plot(t, sma, lw=2.0)
    plot(t, upperBB, lw=3.0)
    plot(t, lowerBB, lw=4.0)
    show()
  • 相关阅读:
    cef 依赖的文件 libcef
    ubuntu 添加新分区,并挂载/home
    x509 证书链验证
    chromium调试
    Chromium智能指针使用指南
    具有扩展主密钥时SSL/TLS的主密钥计算
    OpenSSL解惑2:如何强制选择协议的版本
    基于Gmssl的SM2加解密算法Demo
    漫谈TLS nonce
    VS2015动态库静态加载时指定动态库位置的方法
  • 原文地址:https://www.cnblogs.com/data-ccz/p/6129984.html
Copyright © 2020-2023  润新知