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

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

原创

mb62e7593c01ba5博主文章分类:Python进阶者 ©著作权

文章标签 python numpy 数据可视化 数据分析 数学建模 文章分类 Python 后端开发

©著作权归作者所有:来自51CTO博客作者mb62e7593c01ba5的原创作品,请联系作者获取转载授权,否则将追究法律责任

文章目录

一、净额成交量

1、案例分析

  • 符号数组a: [10 -20 30 40 -50]
  • 用法:numpy.sign(a)
    结果是[1 -1 1 1 -1]
  • 净额成交量:简称OBV,赚了是正,赔了是负
  • 损益指数通过条件过滤得到:第一个参数是差分组,第二个参数是条件数组,第三个参数是每个条件对应的值数组。
    [En]

    the profit and loss index is obtained by conditional filtering: the first parameter is the difference score group, the second parameter is the conditional array, and the third parameter is the value array corresponding to each condition.*

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 dt
import numpy as np
import matplotlib.pylab as mp
import matplotlib.dates as md


def 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 ymd

dates, 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 > 0
fall = 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() # 显示图像

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

二、标量函数矢量化

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、数据平滑
卷积降噪(消除随机噪声)–>曲线拟合(获得数学模型)–>寻找特征值(反映业务特征)

[En]

Convolution noise reduction (eliminating random noise)– > curve fitting (obtaining mathematical model)– > finding eigenvalues (reflecting business characteristics)

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()  # 显示图像

Python之数据分析(案例:净额成交量、矢量化、数据曲线平滑)
  • 收藏
  • 评论
  • *举报

上一篇:SQL数据库语言基础之SqlServer的自动化管理功能(SQL Server代理、作业、警报、操作员)

下一篇:Python之数据分析(Numpy中的除法和取余、三角函数、ufunc对象的位运算)

Original: https://blog.51cto.com/u_15738244/5535709
Author: mb62e7593c01ba5
Title: Python之数据分析(案例:净额成交量、矢量化、数据曲线平滑)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/504541/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球