比特币10年价格数据(2014-2024)分析(基础)

news2025/2/23 0:07:21

数据入口:【每周挑战】比特币10年价格数据可视化和量化分析 - Heywhale.com

本数据集包含 2014 - 2024 的比特币美元价格数据,具体包含比特币每日的开盘价、最高价、最低价、收盘价以及成交量等关键信息。数据说明如下:

字段说明
Date日期,比特币的交易日期
Open (Open price per unit)开盘价,每天比特币交易开始时的价格
High (Highest price per unit)最高价,每天交易期间比特币的最高成交价格
Low最低价,每天交易期间比特币的最低成交价格
Close (Adj Close)收盘价,指当天交易结束时的价格,调整后的收盘价考虑了股息等因素
Volume成交量,每天比特币的交易量,通常以比特币的单位表示

本文将从以下方面进行:价格波动与趋势分析、成交量与市场波动关系分析、价格异常波动检测和成交量异常值检测。

一:数据预处理

import pandas as pd
file_path = 'BTC-USD (2014-2024).csv'
df = pd.read_csv(file_path)
df1 = df[['Date', 'Adj Close', 'Volume']]
df1

这里常用收盘价作为当日比特币价格,所以可以去除其他与数据分析无关的列,数据样貌如下:

df1.info()

数据概览如下:

有与观察到数据存在空值,可能会影响后续分析,可以先去除空值:

df1 = df1.dropna(subset=['Adj Close', 'Volume'])

二:价格波动与趋势分析

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

df1['Date'] = pd.to_datetime(df1['Date'])

start_index_2014 = df1[df1['Date'].dt.year == 2014].index[0]

plt.figure(figsize=(14, 7))
plt.plot(df1['Date'], df1['Adj Close'], label='Adjusted Close Price')
plt.title('Adjusted Close Price Trend from 2014')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.gca().xaxis.set_major_locator(mdates.YearLocator())  
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y')) 
plt.gca().set_xlim(df1['Date'][start_index_2014], df1['Date'].iloc[-1])  
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

rolling_window = 30
df1['Rolling Mean'] = df1['Adj Close'].rolling(window=rolling_window).mean()
df_reduced['Rolling Std'] = df1['Adj Close'].rolling(window=rolling_window).std()

plt.figure(figsize=(14, 7))
plt.plot(df1['Date'], df1['Rolling Mean'], label='30-day Rolling Mean')
plt.plot(df1['Date'], df1['Rolling Std'], label='30-day Rolling Std Dev')
plt.title('30-day Rolling Mean and Standard Deviation from 2014')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.gca().xaxis.set_major_locator(mdates.YearLocator())  
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y')) 
plt.gca().set_xlim(df1['Date'][start_index_2014], df1['Date'].iloc[-1]) 
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

绘制的两个图分别为比特币的调整收盘价趋势图以及30天滚动平均值和标准差的图表

这段代码主要分为两部分:第一部分是绘制股票的调整收盘价趋势图,第二部分是绘制该比特币的30天滚动平均值和标准差:

第一部分:绘制调整收盘价趋势图

import matplotlib.pyplot as plt
import matplotlib.dates as mdates

这里导入了matplotlib.pyplot用于绘图,matplotlib.dates用于日期处理。

转换日期格式

df1['Date'] = pd.to_datetime(df1['Date'])

将数据框df1中的’Date’列转换为pandas的datetime对象,这样可以在绘图时正确处理日期。

找到2014年的起始索引

start_index_2014 = df1[df1['Date'].dt.year == 2014].index[0]

通过筛选出年份为2014的日期,并获取第一个索引,这样就可以在图表中从2014年开始展示数据。

设置绘图窗口

plt.figure(figsize=(14, 7))

创建一个绘图窗口,设置大小为14x7英寸。

绘制调整收盘价趋势

plt.plot(df1['Date'], df1['Adj Close'], label='Adjusted Close Price')

使用matplotlib的plot函数绘制调整收盘价随日期变化的折线图,并设置图例标签为’Adjusted Close Price’。

设置图表标题和轴标签

plt.title('Adjusted Close Price Trend from 2014')
plt.xlabel('Date')
plt.ylabel('Price')

设置图表的标题和x轴、y轴的标签。

添加图例

plt.legend()

在图表上添加图例。

设置x轴的主定位器和格式化器

plt.gca().xaxis.set_major_locator(mdates.YearLocator())
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y'))

设置x轴的主定位器为每年,并设置格式化器为年份格式。

设置x轴的显示范围

plt.gca().set_xlim(df1['Date'][start_index_2014], df1['Date'].iloc[-1])

设置x轴的显示范围从2014年的起始索引到数据框的最后一个日期。

设置x轴标签的旋转角度

plt.xticks(rotation=45)

将x轴上的日期标签旋转45度,以便更清晰地显示。

调整布局

plt.tight_layout()

自动调整子图参数,使之填充整个图表区域,并防止标签重叠。

显示图表

plt.show()

显示之前设置和绘制的图表。

第二部分:绘制30天滚动平均值和标准差

设置滚动窗口大小

rolling_window = 30

设置滚动窗口的大小为30天。

计算30天滚动平均值

df1['Rolling Mean'] = df1['Adj Close'].rolling(window=rolling_window).mean()

计算调整收盘价的30天滚动平均值,并将结果存储在新的列’Rolling Mean’中。

计算30天滚动标准差

df1['Rolling Std'] = df1['Adj Close'].rolling(window=rolling_window).std()

计算调整收盘价的30天滚动标准差,并将结果存储在新的列’Rolling Std’中。

绘制滚动平均值和标准差趋势图 

这部分代码与第一部分绘制调整收盘价趋势图的步骤非常相似,这里绘制了两条线:一条是30天滚动平均值,另一条是30天滚动标准差。

整体而言,这段代码是用于分析比特币数据的,通过绘制趋势图来可视化比特币价格的走势以及波动性。

三:成交量与市场波动关系分析

import seaborn as sns
import numpy as np

df1['Daily Returns'] = df1['Adj Close'].pct_change()

df1['Volume Change'] = df1['Volume'].pct_change()

df1 = df1.dropna()

correlation = df1[['Daily Returns', 'Volume Change']].corr()

plt.figure(figsize=(14, 7))
sns.scatterplot(x='Daily Returns', y='Volume Change', data=df1)
plt.title('Scatter Plot of Daily Returns vs Volume Change')
plt.xlabel('Daily Returns of Adjusted Close')
plt.ylabel('Daily Change in Volume')
plt.grid(True)
plt.show()

correlation, np.corrcoef(df1['Daily Returns'], df1['Volume Change'])

绘制的关于日常收益与交易量变化的散点图如下:

这段代码是用来分析比特币市场数据中的日常收益和交易量变化之间的关系。以下是代码的详细解释:

import seaborn as sns
import numpy as np
  • seaborn(简称sns)是一个基于matplotlib的数据可视化库,它提供了更美观和高级的绘图样式。
  • numpy(简称np)是Python中用于科学计算的核心库之一,提供了强大的数学函数和矩阵处理功能。
df1['Daily Returns'] = df1['Adj Close'].pct_change()
  • 这行代码为df1数据框添加了一个新列'Daily Returns'
  • 'Adj Close'是调整后的收盘价,pct_change()方法计算了该列相邻元素之间的百分比变化,即日常收益。
df1['Volume Change'] = df1['Volume'].pct_change()
  • 这行代码为df1数据框添加了一个新列'Volume Change'
  • 'Volume'是交易量,pct_change()同样用于计算相邻交易日交易量的百分比变化。
df1 = df1.dropna()
  • 使用dropna()方法删除含有缺失值的行,因为pct_change()方法会在数据框的开始处产生一个NaN值。
correlation = df1[['Daily Returns', 'Volume Change']].corr()
  • 这行代码计算了'Daily Returns''Volume Change'之间的相关系数。
  • .corr()方法返回一个相关系数矩阵。
plt.figure(figsize=(14, 7))
sns.scatterplot(x='Daily Returns', y='Volume Change', data=df1)
plt.title('Scatter Plot of Daily Returns vs Volume Change')
plt.xlabel('Daily Returns of Adjusted Close')
plt.ylabel('Volume Change')
plt.grid(True)
plt.show()
  • plt.figure(figsize=(14, 7))设置了图形的大小为14x7英寸。
  • sns.scatterplot()绘制了一个散点图,其中x轴是日常收益,y轴是交易量变化。
  • plt.title()plt.xlabel()plt.ylabel()分别设置了图表的标题和坐标轴标签。
  • plt.grid(True)添加了网格线。
  • plt.show()显示了图表。
correlation
  • 第一部分correlation是之前计算得到的相关系数矩阵。
  • np.corrcoef()使用numpy库计算两个序列的相关系数,并返回一个相关系数矩阵。

这段代码的最终输相关系数矩阵:

通过对“Adj Close”(调整后的收盘价)和“Volume”(交易量)的日变动率进行相关性分析,我们可以看到它们之间的相关系数约为0.047。这表明存在一定程度的正相关关系,但这种关系相对较弱。这意味着当“Adj Close”价格变动时,“Volume”的变动在统计上并不是非常显著。

从散点图中可以看出,虽然有一定的趋势表明价格变动和交易量变动可能同向,但这种关系并不明显。散点图中的点相对分散,说明没有强烈的线性关系。

总的来说,虽然存在一些关系,但“Adj Close”和“Volume”的波动之间的关联性并不强。这意味着其他因素可能对交易量的波动有更大的影响,或者两者之间的关联可能不是线性的,而是更加复杂。

四:价格异常波动检测和成交量异常值检测

from scipy import stats

adj_close_z_threshold = stats.norm.ppf(0.99)
volume_z_threshold = stats.norm.ppf(0.99)

df1['Adj Close Z-Score'] = stats.zscore(df1['Adj Close'])

df1['Volume Z-Score'] = stats.zscore(df1['Volume'])

adj_close_outliers = df1[df1['Adj Close Z-Score'].abs() > adj_close_z_threshold]
volume_outliers = df1[df1['Volume Z-Score'].abs() > volume_z_threshold]

(adj_close_outliers, volume_outliers)

根据结果知:调整收盘价的异常值有122条,成交量的异常值有96条。

这段代码是用来识别数据集中的异常值,具体来说,它处理的是比特币市场的调整收盘价(Adj Close)和成交量(Volume)的异常值。

from scipy import stats

这行代码从scipy库中导入stats模块,该模块提供了大量的统计函数,包括概率分布、统计测试和其他相关的统计计算。

adj_close_z_threshold = stats.norm.ppf(0.99)

这行代码使用stats.norm.ppf函数计算正态分布的分位数。ppf代表的是“百分位点函数”(Percent Point Function),也就是累积分布函数(CDF)的逆函数。这里传入的参数是0.99,意味着计算的是正态分布的第99百分位点,也就是上阈值,用于确定Z分数高于这个值的观测值被认为是异常值。

volume_z_threshold = stats.norm.ppf(0.99)

与上一行类似,这行代码计算了成交量(Volume)的正态分布的第99百分位点,用于识别成交量的异常值。

df1['Adj Close Z-Score'] = stats.zscore(df1['Adj Close'])

这行代码计算了调整收盘价(Adj Close)的Z分数。stats.zscore函数计算了数据的标准化得分,即每个数据点与均值的差值除以标准差。Z分数表示了每个观测值距离均值的标准化距离,可以用来识别异常值。

df1['Volume Z-Score'] = stats.zscore(df1['Volume'])

与上一行类似,这行代码计算了成交量(Volume)的Z分数。

adj_close_outliers = df1[df1['Adj Close Z-Score'].abs() > adj_close_z_threshold]

这行代码使用之前计算出的阈值来识别调整收盘价的异常值。它通过比较每个观测值的Z分数的绝对值与阈值,找出那些绝对值大于阈值的观测值,并将它们作为异常值保存到adj_close_outliers变量中。

volume_outliers = df1[df1['Volume Z-Score'].abs() > volume_z_threshold]

这行代码与上一行类似,但它用于识别成交量的异常值。

(adj_close_outliers, volume_outliers)

最后,这行代码将调整收盘价和成交量的异常值作为元组返回。这个元组包含两个DataFrame对象,adj_close_outliersvolume_outliers,分别包含了调整收盘价和成交量的异常值记录。

总结来说,这段代码的目的是识别和返回比特币市场数据集中调整收盘价和成交量的异常值。通过计算Z分数并与预先设定的阈值比较,它能够找出那些在统计上显著不同于其他观测值的记录。

想要探索多元化的数据分析视角,可以关注之前发布的相关内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PMP--一模--解题--151-160

文章目录 11.风险管理--规划风险应对--机会应对策略--上报151、 [单选] 早在执行阶段,项目经理就发现,事业环境因素(EEF)最近发生的变化将使实施成本大幅减少,而且还将缩减项目进度计划,项目经理该如何应对…

《沈阳体育学院学报》

《沈阳体育学院学报》创刊于1982年,是由沈阳体育学院主办,面向国内外公开发行的体育类学术期刊;国际标准刊号为ISSN 1004-0560,国内刊号为CN 21-1081/G8;双月刊,单月中旬出版。 《沈阳体育学院学报》是中文…

Django_Vue3_ElementUI_Release_004_使用nginx部署

1. nginx安装配置 1.1 下载nginx Download nginx 1.2 测试一下 1.3 进入nginx用命令操作 2. 部署 2.1 前端部署 2.1.1 修改nginx监听配置 …conf/nginx.conf http {... # 这里不进行修改server {listen 8010; # 监听 80 端口server_name 192.168.10.24; # 输入服务器 ip…

java进销存系统源码:管店云进销存解决方案

在当今数字化转型的大背景下,企业对高效、可靠的进销存管理系统的需求日益增长。Java作为一种广泛使用的编程语言,以其成熟的技术栈和强大的生态系统,成为了开发高性能进销存系统的首选语言之一。本文将介绍一款基于Java进销存系统源码的“管…

[乱码]确保命令行窗口与主流集成开发环境(IDE)统一采用UTF-8编码,以规避乱码问题

文章目录 一、前言二、命令行窗口修改编码为UTF-8三、Visual Studio 2022修改编码为UTF-8四、Eclipse修改编码为UTF-8五、DevCPP修改编码为UTF-8六、Sublime Text修改编码为UTF-8七、PyCharm、IDEA、VS Code及Python自带解释器修改编码为UTF-8 一、前言 在学习的征途中&#x…

AG32 MCU与内置FPGA的FLASH空间如何划分

AG32与内置FPGA的FLASH空间如何划分 关于芯片flash 大小: 不管所选型号的flash 是多大,请注意最后100K 是留给fpga 使用的。 如果使用的芯片是256K 的flash 空间,那么就是156K 程序100K fpga,用户程序不能 超过156K。如果超过1…

网络流之最大流(dinic算法模板+模板题)

dinic算法:时间复杂度O(), n 代表点的个数,m 代表边的个数。 const int N1e55; struct Edge{int to,w,next; }edge[N*2];//双向边 int head[N],d[N],cur[N]; int n,m,s,t,cnt1;// 从 2 , 3 开始配对 void add(int u,int v,int w){edge[cnt]{v,w,head[…

VirtualBox 7.1.0 发布下载 - 开源跨平台虚拟化软件

VirtualBox 7.1.0 (macOS, Linux, Windows) - 开源跨平台虚拟化软件 Oracle VM VirtualBox 7 请访问原文链接:https://sysin.org/blog/virtualbox-7/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 2024 年 9 月 …

软考中级软件设计师——数据结构与算法基础学习笔记

软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构(存储结构) 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体,是描述客观事物属性的数、字符及所…

树莓派提示:error: externally-managed-environment 树莓派安装虚拟环境,树莓派flask报错

错误信息 raspberryraspberrypi:~ $ pip install flask error: externally-managed-environment脳 This environment is externally managed 鈺扳攢> To install Python packages system-wide, try apt install python3-xyz, where xyz is the package you are trying to i…

C语言 | Leetcode C语言接雨水II

题目: 题解: typedef struct{int row;int column;int height; } Element;struct Pri_Queue; typedef struct Pri_Queue *P_Pri_Queue; typedef Element Datatype;struct Pri_Queue{int n;Datatype *pri_qu; };/*优先队列插入*/ P_Pri_Queue add_pri_que…

硬件工程师笔试面试——开关

目录 11、开关 11.1 基础 开关原理图 开关实物图 11.1.1 概念 11.1.2 常见的开关类型及其应用 11.2 相关问题 11.2.1 开关的工作原理是什么? 11.2.2 在设计一个电子系统时,如何选择最适合的开关类型? 11.2.3 不同类型的开关在实际应用中有哪些优势和局限性? 11.…

自己建网站怎么建

自己建立一个网站可能听起来有点复杂,但实际上,有很多简单且免费的方法可以实现。下面将介绍一些基本步骤,帮助你开始自己建立一个网站。 首先,你需要明确你的网站目的是什么。是个人博客、商业网站,还是其他类型的网…

设计模式 组合模式(Composite Pattern)

组合模式简绍 组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构来表示“部分-整体”的层次结构。组合模式使得客户端可以用一致的方式处理单个对象和组合对象。这样,可以在不知道对象具体类型的条…

如何在webots中搭建一个履带机器人

前期准备 下载webotswebots基本知识 a. 官方文档:Webots documentation: Track b. B站教程:webots-超详细入门教程(2020)_哔哩哔哩_bilibili搭建流程 搭建履带机器人主要使用到了webots中的track节点,这个节点是专门用来定义履带的相关属性,模拟履带运动的 首先,创建一个…

MyBatis操作数据库-XML实现

目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…

PAT甲级-1055 The World‘s Richest

题目 题目大意 输入给出富人的总数以及富人的姓名、年龄、财富,接下来的k行给出需要排序的个数,每个排序要求输出m个富人,并且限制了年龄段,[Amin, Amax]。要求输出所有的排序。如果满足年龄段的人数为0,就输出None。…

VSCode 离线安装中文语言包

1.插件市场 Extensions for Visual Studio family of products | Visual Studio Marketplace 输入: language 在version history里面下载相应的版本,若没有就下载最新的 在下面安装 安装完重启就可以了。 可能会提示的失败: Unable to ins…

整数二分算法和浮点数二分算法

整数二分算法和浮点数二分算法 二分 现实中运用到二分的就是猜数字的游戏 假如有A同学说B同学所说数的大小,B同学要在1~100中间猜中数字65,当B同学每次说的数都是范围的一半时这就算是一个二分查找的过程 二分查找的前提是这个数字序列要有单调性 基…

浅谈树形结构——特殊的树——二叉树

文章目录 一、什么是二叉树?二、二叉树的特点三、二叉树的性质四、两种特殊的二叉树4.1、满二叉树4.2、完全二叉树 五、一些关于二叉树特性的习题六、二叉树的存储[代码实现]6.1、链式存储6.2、顺序存储 七、二叉树的遍历7.1、关于二叉树遍历的选择题练习 一、什么是…