当前位置:   article > 正文

Python.Numpy学习零碎笔记之便捷函数_numpy python一些便捷的公式

numpy python一些便捷的公式

一、通过股票收益率的背景熟悉数据分析的变量之间相关系数等函数计算


1 股票收益率的计算

import numpy as np
from matplotlib.pyplot import plot
from matplotlib.pyplot import show
bhp_c = np.loadtxt('BHP.csv',delimiter=',',usecols=(6,),unpack=True) #导入股票收盘价
vale_c = np.loadtxt('VALE.csv',delimiter=',',usecols=(6,),unpack=True)
#计算股票简单收益率
bhp_returns = np.diff(bhp_c)/bhp_c[:-1]   # diff:相邻元素差值
vale_returns = np.diff(vale_c)/bhp_c[:-1]
#print('Standard deviation =',np.std(bhp_returns))  # 计算标准差

#logreturns = np.diff(np.log(bhp_c)) #计算股票对数收益率
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

2 协方差、对角元素查看以及迹的计算

covariance = np.cov(bhp_returns,vale_returns) #计算两个变量共同变化趋势——协方差
print('Covariance:','\n',covariance)  #得到协方差矩阵
print('Covariance_diagonal:','\n',covariance.diagonal())# 使用该函数查看对角线上的元素
print('Covariance_trace:','\n',covariance.trace()) #使用该函数计算矩阵的迹,即对角线元素之和
  • 1
  • 2
  • 3
  • 4

3 变量相关系数的原理公式及函数计算(详细原理见其他文章,这里不赘述)

# 两个向量的相关系数被定义为协方差除以各自标准差的乘积
print(covariance/(bhp_returns.std() * vale_returns.std()))
#但是更多的用corrcoef函数计算相关系数
print('Correlation_coefficient:','\n',np.corrcoef(bhp_returns,vale_returns))
  • 1
  • 2
  • 3
  • 4

4 matplotlib 绘图

# 两只股票收益率绘图
t = np.arange(len(bhp_returns))
plot(t,bhp_returns,lw=1) #lw 线型宽度
plot(t,vale_returns,lw=2)
show()
  • 1
  • 2
  • 3
  • 4
  • 5

蓝色:BHP 绿色:VALE

5 判断两只股票的价格走势是否同步:如果(它们的差值偏离平均差值)>(2倍标准差)=不同步,此时我们可以进行交易(说实话这里的原理还没完全明白)

检查最后一次收盘价是否在同步状态

difference = bhp_c - vale_c
avg = np.mean(difference)
dev = np.std(difference)
print('Out of sync',np.abs(difference[-1]-avg) > 2*dev) #比较输出布尔类型值
  • 1
  • 2
  • 3
  • 4

二、多项式拟合


主要内容

  • ployfit线性拟合函数,
  • polyval求解值的函数,
  • polyder求导函数,
  • roots求根函数,
  • argmax,argmin求解最大值最小值的函数
import numpy as np
from matplotlib.pyplot import plot
from matplotlib.pyplot import show

bhp_c = np.loadtxt('BHP.csv',delimiter=',',usecols=(6,),unpack=True)

vale_c = np.loadtxt('VALE.csv',delimiter=',',usecols=(6,),unpack=True)

difference = bhp_c - vale_c # 两只股票收盘价的差价

t = np.arange(len(difference))

poly = np.polyfit(t,difference,3)#用polyfit进行多项式拟合,t是x,difference是y,3是多项式最高项次数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

返回多项式函数的系数

print(poly)  
#   返回各项的系数  
  • 1
  • 2
  • 3

利用得到的poly函数与polyval函数推断下一个值(x=a,y=?)

print('next value',polyval(poly, t[-1] + 1))  
#   polyval求解值  
  • 1
  • 2
  • 3

求函数的根(y=0,x=?)

print('roots', roots(poly))  
#   求解方程的根  
  • 1
  • 2
  • 3

对多项式拟合函数求导 ,仍然是个多项式函数

der = polyder(poly)  
print ('derivative', der)  
#返回各项的系数  

  • 1
  • 2
  • 3
  • 4
  • 5

求解导函数,找到极值

print ('Extremas', np.roots(der))  
#返回极值点 
  • 1
  • 2
  • 3

复核结果:结果可能不一定完全一致,与取值范围有关,而且t是arange函数定义的

vals = polyval(poly, t) #将t带入多项式的值,求解  
print argmax(vals)  
print argmin(vals)  
#   找到极大值极小值点
  • 1
  • 2
  • 3
  • 4

绘图

plot(t,difference)  
plot(t, vals)  
show() 
  • 1
  • 2
  • 3

这里写图片描述

下图为15次多项式拟合

这里写图片描述

三、使用Numpy的sign函数和piecewise函数判断数组内的元素正负号,并返还对应的值


导入BHP股票的收盘价及成交量,并对收盘价做差分计算

import numpy as np
c,v = np.loadtxt('BHP.csv',delimiter=',',usecols=(6,7),unpack=True)
change = np.diff(c)
  • 1
  • 2
  • 3

使用sign函数对change数组内的元素正负进行判断

signs = np.sign(change)
print('Signs',signs)  # 正数返回1,负数返回-1,其他返回0
  • 1
  • 2
  • 3

使用pieceswise函数对数组内元素正负号进行判断,判断条件与返回值均可自由定义,所以该函数作用很强大

pieces = np.piecewise(change,[change < 0,change > 0],[-1,1])
print('Pieces',pieces)
#使用piecewise确定数组的正负,判断条件和对应的结果
  • 1
  • 2
  • 3

检验两个函数的输出是否一致

print('Arrays equal?',np.array_equal(signs,pieces))
  • 1

上面有人可能会认为为什么不是print(‘Arrays equal?’,signs==pieces) ?,直接看结果,一目了然

print('Arrays equal?',np.array_equal(signs,pieces))
  • 1
输出:
Arrays equal? True
  • 1
  • 2
print('Arrays equal?',signs==pieces) 
  • 1
输出:
Arrays equal? [ True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True  True  True  True  True  True
  True  True  True  True  True  True  True]
  • 1
  • 2
  • 3
  • 4
  • 5

最后计算OBV净额成交量

print('On balance volume',v[1:]*signs)
  • 1
  • 2

四、通过交易过程的模拟使用vectorize函数来避免循环的使用


import numpy as np

o,h,l,c = np.loadtxt('BHP.csv',delimiter=',',usecols=(3,4,5,6),unpack=True)

def calc_profit(op,high,low,close):
    #以比开盘价稍低的价格买入
    buy = op * 0.999 # (值不重要,主要关注函数的用法)

    if low < buy < high: #这里判断尝试的买入价是否在当日价格区间之内
        return (close - buy)/buy
    else:
        return 0

func = np.vectorize(calc_profit) #向量化函数,避免使用循环
profits = func(o,h,l,c)

print('Profits',profits)
print('Real trades',profits[profits != 0]) #筛选出非零利润的交易日
print('winning trades',profits[profits > 0]) #筛选出正在盈利的交易日
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/142469
推荐阅读
相关标签
  

闽ICP备14008679号