Python之数据分析(案例:净额成交量、矢量化、数据曲线平滑)(股票净值曲线python)

网友投稿 595 2022-08-23


Python之数据分析(案例:净额成交量、矢量化、数据曲线平滑)(股票净值曲线python)

文章目录

​​一、净额成交量​​​​二、标量函数矢量化​​​​三、数据曲线平滑​​

一、净额成交量

1、案例分析

符号数组a: [10 -20 30 40 -50]用法:numpy.sign(a)结果是[1 -1 1 1 -1]净额成交量:简称OBV,赚了是正,赔了是负利用条件筛选来得到盈亏指标:一参是差分数组,二参是条件数组,三参是各个条件对应的值数组

2、第二种筛选方法

sign_closing_price = np.piecewise(diff_closing_price,[diff_closing_price < 0,diff_closing_price == 0,diff_closing_price > 0],[-1, 0 , 1])

3、案例源码

import datetime as dtimport numpy as npimport matplotlib.pylab as mpimport matplotlib.dates as mddef dmy2ymd(dmy): dmy = str(dmy, encoding='utf-8') # 转码dmy日期 date = dt.datetime.strptime(dmy, '%d-%m-%Y').date() # 获取时间对象 ymd = date.strftime('%Y-%m-%d') return ymddates, closing_prices, volumes = np.loadtxt( '0=数据源/beer_price2.csv', delimiter=',', usecols=(0, 4, 5), unpack=True, dtype=np.dtype('M8[D], f8, f8'), converters={0: dmy2ymd})# 交易日的差分(后一天减去前一天)组成的差分数组,正的是赚了,负的是赔了diff_closing_price = np.diff(closing_prices)sign_closing_price = np.sign(diff_closing_price)# print(diff_closing_price)# print(sign_closing_price)# 利用条件筛选来得到盈亏指标:一参是差分数组,二参是条件数组,三参是各个条件对应的值数组sign_closing_price = np.piecewise( diff_closing_price, [diff_closing_price < 0, diff_closing_price == 0, diff_closing_price > 0], [-1, 0, 1])# 得到盈亏量,带正负的obvs = volumes[1:] * sign_closing_price # 成交量乘盈亏指标,得到的是盈亏量# 曲线图基础设置mp.figure('On-Balance Volume', facecolor='lightgray')mp.title('On-Balance Volume', fontsize=20)mp.xlabel('Date', fontsize=14)mp.ylabel('OBV', fontsize=14)# 主刻度设置为以周一为起始的星期格式ax = mp.gca() # 获取刻度线(坐标轴)ax.xaxis.set_major_locator( md.WeekdayLocator(byweekday=md.MO))# 次刻度设置为以天为单位ax.xaxis.set_minor_locator( md.DayLocator())# 主刻度的格式化ax.xaxis.set_major_formatter( md.DateFormatter('%d %b %Y'))mp.tick_params(labelsize=10) # 字体mp.grid(axis='y', linestyle=':') # 网格线,不需要纵向# 绘制曲线dates = dates[1:].astype(md.datetime.datetime) # 将日期标准化成numpy的日期# 记录所有上涨和下跌的部分rise = obvs > 0fall = obvs < 0# 设置前景色与背景色fc = np.zeros(dates.size, dtype='3f4')ec = np.zeros(dates.size, dtype='3f4')fc[rise], fc[fall] = (1, 0, 0), (0, 0.5, 0)ec[rise], ec[fall] = (1, 1, 1), (1, 1, 1)# 绘制柱形图mp.bar(dates, obvs, 1.0, 0, color=fc, edgecolor=ec, label='OBV')mp.legend() # 显示图例mp.gcf().autofmt_xdate() # 设置格式展示的自动化调整mp.show() # 显示图像

二、标量函数矢量化

1、矢量化概念

def 标量函数(标量参数1, 标量参数2, ...) ... return 标量返回值1, 标量返回值2, ...

矢量化:np.vectorize(标量函数)——>转换成矢量函数

def 矢量函数(矢量参数1, 矢量参数2, ...) ...矢量返回值1, 矢量返回值2, ...

2、练习代码

import numpy as npdef fun1(a, b): return a+b, a-b, a*bA = np.array([10, 20, 30])B = np.array([100, 200, 300])# 不需要循环迭代,就可以对传入的数组对应着进行处理# 此处表示将A与B两个数组中的值一一对应传入fun1中进行处理,处理结果返回给C数组C = np.vectorize(fun1)(A, B)print(C)

三、数据曲线平滑

1、数据平滑 卷积降噪(消除随机噪声干扰)——>曲线拟合(获得数学模型)——>求特征值(反映业务特征)

2、平滑过程 y=f(x) y=g(x) y1=f(x1) y1=g(x1) f(x1)=g(x1) f(x1)-g(x1)=0 f(x)-g(x)=0的根就是x1 np.polysub(p1, p2)得到p3,即为方程f(x)-g(x)=0的各个项系数 np.roots(p3) 得到p3的根,即x1

3、案例源码

import datetime as dtimport numpy as npimport matplotlib.pylab as mpimport matplotlib.dates as mddef dmy2ymd(dmy): dmy = str(dmy, encoding='utf-8') # 转码dmy日期 date = dt.datetime.strptime(dmy, '%d-%m-%Y').date() # 获取时间对象 ymd = date.strftime('%Y-%m-%d') return ymddates, beer_closing_prices = np.loadtxt( '0=数据源/beer_price2.csv', delimiter=',', usecols=(0, 4), unpack=True, dtype=np.dtype('M8[D], f8'), converters={0: dmy2ymd})__, apple_closing_prices = np.loadtxt( '0=数据源/apple_price.csv', delimiter=',', usecols=(0, 4), unpack=True, dtype=np.dtype('M8[D], f8'), converters={0: dmy2ymd})# 用理想差分(后一天减去前一天的值)求日收益,再除每天的收盘价beer_returns = np.diff(beer_closing_prices)/beer_closing_prices[:-1]apple_returns = np.diff(apple_closing_prices)/apple_closing_prices[:-1]# 卷积降噪N = 8 # 卷积和的宽度weights = np.hanning(N) # 权重是大小为8的汉宁窗,8各自对称的数据# print(weights)weights /= weights.sum() # 除权重和# 两条曲线的卷积beer_smooth_returns = np.convolve(beer_closing_prices, weights, 'valid')apple_smooth_returns = np.convolve(apple_closing_prices, weights, 'valid')# 拟合曲线days = dates[N-2:-1].astype(int) # 转化成以天为单位degree = 5beer_p = np.polyfit(days, beer_smooth_returns, degree)beer_fitted_returns = np.polyval(beer_p, days)apple_p = np.polyfit(days, apple_smooth_returns, degree)apple_fitted_returns = np.polyval(apple_p, days)# polysub处理sub_p = np.polysub(beer_p, apple_p)roots = np.roots(sub_p) # 取根reals = roots[np.isreal(roots)].real # 取实根inters = []for real in reals: if days[0] <= real <= days[-1]: inters.append([real, np.polyval(beer_p, real)])inters.sort() # 按照横坐标进行排序inters = np.array(inters) # 变成numpy的数组# 曲线图基础设置mp.figure('Smooth returns', facecolor='lightgray')mp.title('Smooth returns', fontsize=20)mp.xlabel('Date', fontsize=14)mp.ylabel('Returns', fontsize=14)# 主刻度设置为以周一为起始的星期格式ax = mp.gca() # 获取刻度线(坐标轴)ax.xaxis.set_major_locator( md.WeekdayLocator(byweekday=md.MO))# 次刻度设置为以天为单位ax.xaxis.set_minor_locator( md.DayLocator())# 主刻度的格式化ax.xaxis.set_major_formatter( md.DateFormatter('%d %b %Y'))mp.tick_params(labelsize=10) # 字体mp.grid(linestyle=':') # 网格线# 绘制曲线dates = dates.astype(md.datetime.datetime) # 将日期标准化成numpy的日期mp.plot(dates[:-1], beer_returns, c='dodgerblue', alpha=0.25, label='Beer')mp.plot(dates[:-1], apple_returns, c='limegreen', alpha=0.25, label='Apple')'''此处由于数据不够匹配,因此差别很大,绘制不出想要的效果'''# 绘制卷积后的曲线:卷积之前的数据是没有算入曲线的,所以N-2# mp.plot(dates[N-2:-1], beer_smooth_returns, c='dodgerblue', alpha=0.75, label='Smooth Beer')# mp.plot(dates[N-2:-1], apple_smooth_returns, c='limegreen', alpha=0.75, label='Smooth Apple')# 绘制拟合曲线# mp.plot(dates[N-2:-1], beer_fitted_returns, c='dodgerblue', linewidth=3, label='Fitted Beer')# mp.plot(dates[N-2:-1], apple_fitted_returns, c='limegreen', linewidth=3, label='Fitted Apple')# 绘制polysub后的点dates, returns = np.hsplit(inters, 2)dates = dates.astype(int).astype('M8[D]').astype(md.datetime.datetime)mp.scatter(dates, returns, marker='x', c='firebrick', s=100, lw=3, zorder=3)mp.legend() # 显示图例mp.gcf().autofmt_xdate() # 设置格式展示的自动化调整mp.show() # 显示图像


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring boot集成redisson的最佳实践示例
下一篇:python数据分析之pandas数据预处理(数据合并与数据提取、loc、iloc、ix函数详解)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~