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 dt
import numpy as np
import matplotlib.pylab as mp
import 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 > 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() # 显示图像
二、标量函数矢量化
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*b
A = 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 dt
import numpy as np
import matplotlib.pylab as mp
import 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 = 5
beer_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之数据分析(案例:净额成交量、矢量化、数据曲线平滑)相关推荐
- python金融数据分析案例_Python数据分析行业案例课程--欺诈检测
注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...
- Python 大数据分析疫情:如何实现实时数据爬取及 Matplotlib 可视化?
作者 | 杨秀璋 来源 | CSDN博客专家Eastmount 责编 | 夕颜 思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图 ...
- 五大数据分析案例——手把手教你处理数据信息(基础、详细)
文章目录 本章中的数据文件可从下面的github仓库中下载 利用python进行数据分析(第二版) 示例一.关于时区的数据分析 1.1纯python时区计数 1.2使用pandas进行时区计数 示例二 ...
- python气象数据分析_利用python-cdo处理气象数据
如果你不喜欢命令行的操作方式,那么你可以尝试使用python-cdo,利用python脚本语言的优势来处理气象数据.命令行的方式有其优势,比如简单易操作,可扩展性更强等,利用CDO的python接口也 ...
- python彩票数据分析案例_天津Python人工智能课程
Python人工智能课程介绍 人工智能主要致力于计算机视觉,自然语言处理与语音识别三大领域!其基础与核心都是机器学习,当下AI时代各大行业巨头公司都在争相追逐这些热门领域,创业公司更是层出不穷,人工智 ...
- 利用Python进行数据分析案例
来自Bitly的usa.gov数据 1.数据说明:该数据是以json格式储存的,该数据集共有十八个维度,我在这里只做两个任务. a. 对时区进行计数 b. 对windows以及非windows用户进行 ...
- python 销售数据分析输出表格_Python处理Excel数据实例--销售数据分析
数据分析笼统来说,大概分为五个步骤:提出问题.理解数据.数据清洗.构建模型.数据可视化.在数据分析中,很基础又关键的一步就是数据清洗,对原始数据的处理会花掉整个分析过程的很大一部分时间,这是因为如果前 ...
- Python爬虫实战案例:取喜马拉雅音频数据详解
前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...
- Python大数据分析(二):大数据技术基础
文章目录 (一)Linux系统和大数据 (二)Hadoop (1)Hadoop包含哪些模块? (2)Hadoop的生态成员 (3)哪些人在使用Hadoop? (三)Spark (1)Scala (2) ...
最新文章
- 转载,大佬关于虚拟内存与物理内存关系讲解。
- Linux中source命令的用法
- 频率计设计——电路部分
- CS Academy Gcd Rebuild
- 几个python小程序
- “返回指向栈空间的指针”的错误
- 角标越界 Java_【新人求助】利用占位符操作数据库是总是提示数组角标越界是怎么回事 - Java论坛 - 51CTO技术论坛_中国领先的IT技术社区...
- 索引-linux-技术大钢
- 区块链 2.0:下一个计算范式
- python type
- js排序算法详解-希尔排序
- 百度360争推1TB永久网盘
- python检测excel表是否存在空值
- 打开栅格数据的正确方式
- EXCEL之工资表转工资条
- Linux服务器百万并发实现与问题排查
- 离散数学-图论-欧拉图、哈密顿图、二部图、平面图(14)
- where online services go when they dieMichael Doi
- 计算机专业不会编程怎么找工作?
- linux查看riak版本,Riak学习(一):Linux Centos 下安装 Riak 服务
热门文章
- java游戏将相_(Java)算法——位运算基础及基本应用
- vue实现搜索框记录搜索历史_使用JS location实现搜索框历史记录功能_苏颜_前端开发者...
- oracle数据库从AIX环境expdp迁移到linux环境(sec_case_sensitive_logon=true导致连接报错ORA-01017)
- python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离
- java 中缀算术表达式转换成后缀表达式_求Java堆栈,将中缀算术表达式转换成后缀表达式。...
- python lambda表达式及用法_python lambda表达式简单用法
- hrbp 牵着鼻子走_防止被下属牵着鼻子走的四个经典方法,学会了,下属就好管了...
- Python-视频爬取示例对小白友好
- c面向对象 java_JAVA基础--面向对象08
- SSM集成Mybatis和Druid