上面的图片是《定投改变命运》里面笑来老师提供的BTC曲线图,但是前段时间BTC价格在上涨,价格曲线图应该有很大变化。所以我就想找下原始数据,自己绘制然后对比一下,应该会出现微笑曲线。(虽然笑来老师在讲课过程中也提供过类似的照片,但是自己绘制一下会印象更加深刻)
获取数据
前几天在我的一篇文章里面,提到了Coinmarketcap这个网站,是笑来老师每天获取BTC价格的来源。
既然如此,我就想顺便找一下能不能获取所有历史价格。
果然,这是一个数据齐全的网站,所有历史价格在下方的地址:
https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20130429&end=20201211
在网站的右上角可以把语言改成简体中文,就可以有中文的网页了。
上面中的start=
和end=
之后的日期修改之后就可以获取这个时间段内的所有数据了。
最近的数据:
image-20201211113516261最早的数据:
image-20201211113549180把数据复制下来:
image-20201211113631949用Exce打开,把数据复制进去
image-20201211114054602把日期设置成我们常用的显示方式:
image-20201211114142938再把标题上面的*
号删掉,现在是这样显示的:
然后另存为BTC_price_history.txt
文件,确保文件以uft-8
编码保存。
用记事本打开是这样的:
image-20201211115341010整理数据
以下的过程参考的是笑来老师的源码:
https://github.com/xiaolai/regular-investing-in-box/blob/master/data/visualization.py
我在前几天的文章里面把我的理解过程记录下来:
https://zuopin.xin/posts/9ad4188fa70df653d800fb805f14e79cb7388238a90be6aba4ce53a3f98fe17b
在Jupyter notebook
里面运行:
日期是逆序的,我们把日期顺序对调一下:
image-20201211121944850序号也是反过来的,我们增加一列序号:
image-20201211123730115用下面的代码计算历史最高价格,然后增加列“Closing Price"和”Base",把里面的数据从文本转换成数字格式,以便画图使用。
#增加收盘价用来计算
closing_price=[]
base = []
for i in range(number_of_rows):
# print(series2.at[i,"收盘价"])#series.at[] not series.at()
closing_price.append(float(sub(r'[,]','',series2.at[i,"收盘价"])))#series.at[] not series.at(),转换为可运算数字格式
base.append(0)
historic_high=max(closing_price)
print("历史最高价格: ",historic_high)
series2["Closing Price"]=closing_price
series2["Base"] = base
image-20201211142759499
historic_high
为历史最高价格
当前数据是这样的:
image-20201211142950564series2['Closing Price'].idxmax()
可获得历史最高价格的索引,赋予date_num
,series2.loc[series2['Closing Price'].idxmax()]
可以显示那一行的内容。series2.loc[series2['Closing Price'].idxmax()]["日期"]
获取历史最高价格的日期,然后把日期值赋予historic_high_date
。date_num
、historic_high_date
会在后面参与画图。
运行如下:
image-20201211144921527绘制图片
使用matplotlib
画图代码如下:
from matplotlib.ticker import FuncFormatter
import matplotlib.ticker as ticker
tick_spacing = 250
#通过修改tick_spacing的值可以修改x轴的密度
from datetime import datetime
import matplotlib.dates as mdates
# draw the figure
ax = plt.gca()
ax.yaxis.set_major_formatter(FuncFormatter(lambda y, _: '{:.0f}'.format(y)))
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))
series2.plot(kind='line', x='日期', y='Closing Price', ax=ax, figsize = (20,10), color="blue")
series2.plot(kind='line', linestyle='dotted', x='日期', y='Base', ax=ax, figsize = (20,10), color="gray")
plt.xlabel(f'\nBTC history price')
for num in range(0,20001,2500):
plt.axhline(num, linestyle='dotted',color="gray")
for date in range(0,20001,500):
plt.axvline(date, linestyle='dotted',color="gray")
plt.annotate(r'$%s,%s$' %(historic_high_date,historic_high),xy = (date_num,historic_high),xycoords = 'data',
xytext=(+30,-30),textcoords = 'offset points',fontsize = 16
,arrowprops = dict(arrowstyle='->',
connectionstyle="arc3,rad=.2"))
plt.show()
图片如下:
image-20201211145352477微笑曲线出现了,与下面原来的图片对比下:
image-20201211150802224最近在学习numpy和matplotlib,主要学习如何画数据图,以上的过程当作备忘。
虽然直接使用Excel就可以画出这样的图片了,这个过程并没有简单。但是以后如果直接设置好爬虫,自动获取数据,然后根据每天的数据自动更新,自动生成新的图片,把这个过程自动化,那还是更方便的。只是一开始麻烦点,然后以后就不用去修改数据了。
我只是刚刚入门Python 的一个小白,有什么错误欢迎批准指正,谢谢!
网友评论