赞
踩
一、通过股票收益率的背景熟悉数据分析的变量之间相关系数等函数计算
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)) #计算股票对数收益率
2 协方差、对角元素查看以及迹的计算
covariance = np.cov(bhp_returns,vale_returns) #计算两个变量共同变化趋势——协方差
print('Covariance:','\n',covariance) #得到协方差矩阵
print('Covariance_diagonal:','\n',covariance.diagonal())# 使用该函数查看对角线上的元素
print('Covariance_trace:','\n',covariance.trace()) #使用该函数计算矩阵的迹,即对角线元素之和
3 变量相关系数的原理公式及函数计算(详细原理见其他文章,这里不赘述)
# 两个向量的相关系数被定义为协方差除以各自标准差的乘积
print(covariance/(bhp_returns.std() * vale_returns.std()))
#但是更多的用corrcoef函数计算相关系数
print('Correlation_coefficient:','\n',np.corrcoef(bhp_returns,vale_returns))
4 matplotlib 绘图
# 两只股票收益率绘图
t = np.arange(len(bhp_returns))
plot(t,bhp_returns,lw=1) #lw 线型宽度
plot(t,vale_returns,lw=2)
show()
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) #比较输出布尔类型值
二、多项式拟合
主要内容
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是多项式最高项次数
返回多项式函数的系数
print(poly)
# 返回各项的系数
利用得到的poly函数与polyval函数推断下一个值(x=a,y=?)
print('next value',polyval(poly, t[-1] + 1))
# polyval求解值
求函数的根(y=0,x=?)
print('roots', roots(poly))
# 求解方程的根
对多项式拟合函数求导 ,仍然是个多项式函数
der = polyder(poly)
print ('derivative', der)
#返回各项的系数
求解导函数,找到极值
print ('Extremas', np.roots(der))
#返回极值点
复核结果:结果可能不一定完全一致,与取值范围有关,而且t是arange函数定义的
vals = polyval(poly, t) #将t带入多项式的值,求解
print argmax(vals)
print argmin(vals)
# 找到极大值极小值点
绘图
plot(t,difference)
plot(t, vals)
show()
下图为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)
使用sign函数对change数组内的元素正负进行判断
signs = np.sign(change)
print('Signs',signs) # 正数返回1,负数返回-1,其他返回0
使用pieceswise函数对数组内元素正负号进行判断,判断条件与返回值均可自由定义,所以该函数作用很强大
pieces = np.piecewise(change,[change < 0,change > 0],[-1,1])
print('Pieces',pieces)
#使用piecewise确定数组的正负,判断条件和对应的结果
检验两个函数的输出是否一致
print('Arrays equal?',np.array_equal(signs,pieces))
上面有人可能会认为为什么不是print(‘Arrays equal?’,signs==pieces) ?,直接看结果,一目了然
print('Arrays equal?',np.array_equal(signs,pieces))
输出:
Arrays equal? True
print('Arrays equal?',signs==pieces)
输出:
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]
最后计算OBV净额成交量
print('On balance volume',v[1:]*signs)
四、通过交易过程的模拟使用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]) #筛选出正在盈利的交易日
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。