文章目录

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

一、净额成交量

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之数据分析(案例:净额成交量、矢量化、数据曲线平滑)相关推荐

  1. python金融数据分析案例_Python数据分析行业案例课程--欺诈检测

    注意: 1. 本行业案例课程为Python 3 数据分析系列课程的行业案例部分,学员请务必先观看课程介绍免费视频,确认已学习本课程所需Python分析技能. 2. 本课程的核心目的是协助学员学习具体业 ...

  2. Python 大数据分析疫情:如何实现实时数据爬取及 Matplotlib 可视化?

    作者 | 杨秀璋 来源 | CSDN博客专家Eastmount 责编 | 夕颜 思来想去,虽然很忙,但还是挤时间针对这次肺炎疫情写个Python大数据分析系列博客,包括网络爬虫.可视化分析.GIS地图 ...

  3. 五大数据分析案例——手把手教你处理数据信息(基础、详细)

    文章目录 本章中的数据文件可从下面的github仓库中下载 利用python进行数据分析(第二版) 示例一.关于时区的数据分析 1.1纯python时区计数 1.2使用pandas进行时区计数 示例二 ...

  4. python气象数据分析_利用python-cdo处理气象数据

    如果你不喜欢命令行的操作方式,那么你可以尝试使用python-cdo,利用python脚本语言的优势来处理气象数据.命令行的方式有其优势,比如简单易操作,可扩展性更强等,利用CDO的python接口也 ...

  5. python彩票数据分析案例_天津Python人工智能课程

    Python人工智能课程介绍 人工智能主要致力于计算机视觉,自然语言处理与语音识别三大领域!其基础与核心都是机器学习,当下AI时代各大行业巨头公司都在争相追逐这些热门领域,创业公司更是层出不穷,人工智 ...

  6. 利用Python进行数据分析案例

    来自Bitly的usa.gov数据 1.数据说明:该数据是以json格式储存的,该数据集共有十八个维度,我在这里只做两个任务. a. 对时区进行计数 b. 对windows以及非windows用户进行 ...

  7. python 销售数据分析输出表格_Python处理Excel数据实例--销售数据分析

    数据分析笼统来说,大概分为五个步骤:提出问题.理解数据.数据清洗.构建模型.数据可视化.在数据分析中,很基础又关键的一步就是数据清洗,对原始数据的处理会花掉整个分析过程的很大一部分时间,这是因为如果前 ...

  8. Python爬虫实战案例:取喜马拉雅音频数据详解

    前言 喜马拉雅是专业的音频分享平台,汇集了有声小说,有声读物,有声书,FM电台,儿童睡前故事,相声小品,鬼故事等数亿条音频,我最喜欢听民间故事和德云社相声集,你呢? 今天带大家爬取喜马拉雅音频数据,一 ...

  9. Python大数据分析(二):大数据技术基础

    文章目录 (一)Linux系统和大数据 (二)Hadoop (1)Hadoop包含哪些模块? (2)Hadoop的生态成员 (3)哪些人在使用Hadoop? (三)Spark (1)Scala (2) ...

最新文章

  1. 转载,大佬关于虚拟内存与物理内存关系讲解。
  2. Linux中source命令的用法
  3. 频率计设计——电路部分
  4. CS Academy Gcd Rebuild
  5. 几个python小程序
  6. “返回指向栈空间的指针”的错误
  7. 角标越界 Java_【新人求助】利用占位符操作数据库是总是提示数组角标越界是怎么回事 - Java论坛 - 51CTO技术论坛_中国领先的IT技术社区...
  8. 索引-linux-技术大钢
  9. 区块链 2.0:下一个计算范式
  10. python type
  11. js排序算法详解-希尔排序
  12. 百度360争推1TB永久网盘
  13. python检测excel表是否存在空值
  14. 打开栅格数据的正确方式
  15. EXCEL之工资表转工资条
  16. Linux服务器百万并发实现与问题排查
  17. 离散数学-图论-欧拉图、哈密顿图、二部图、平面图(14)
  18. where online services go when they dieMichael Doi
  19. 计算机专业不会编程怎么找工作?
  20. linux查看riak版本,Riak学习(一):Linux Centos 下安装 Riak 服务

热门文章

  1. java游戏将相_(Java)算法——位运算基础及基本应用
  2. vue实现搜索框记录搜索历史_使用JS location实现搜索框历史记录功能_苏颜_前端开发者...
  3. oracle数据库从AIX环境expdp迁移到linux环境(sec_case_sensitive_logon=true导致连接报错ORA-01017)
  4. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离
  5. java 中缀算术表达式转换成后缀表达式_求Java堆栈,将中缀算术表达式转换成后缀表达式。...
  6. python lambda表达式及用法_python lambda表达式简单用法
  7. hrbp 牵着鼻子走_防止被下属牵着鼻子走的四个经典方法,学会了,下属就好管了...
  8. Python-视频爬取示例对小白友好
  9. c面向对象 java_JAVA基础--面向对象08
  10. SSM集成Mybatis和Druid