美文网首页
如何画出BTC微笑曲线

如何画出BTC微笑曲线

作者: 焕涛 | 来源:发表于2020-12-11 16:46 被阅读0次
    image-20201211150802224

    上面的图片是《定投改变命运》里面笑来老师提供的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

    再把标题上面的*号删掉,现在是这样显示的:

    image-20201211114245772

    然后另存为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-20201211115604112

    日期是逆序的,我们把日期顺序对调一下:

    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-20201211142950564

    series2['Closing Price'].idxmax()可获得历史最高价格的索引,赋予date_numseries2.loc[series2['Closing Price'].idxmax()]可以显示那一行的内容。series2.loc[series2['Closing Price'].idxmax()]["日期"]获取历史最高价格的日期,然后把日期值赋予historic_high_datedate_numhistoric_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

    最近在学习numpymatplotlib,主要学习如何画数据图,以上的过程当作备忘。

    虽然直接使用Excel就可以画出这样的图片了,这个过程并没有简单。但是以后如果直接设置好爬虫,自动获取数据,然后根据每天的数据自动更新,自动生成新的图片,把这个过程自动化,那还是更方便的。只是一开始麻烦点,然后以后就不用去修改数据了。

    我只是刚刚入门Python 的一个小白,有什么错误欢迎批准指正,谢谢!

    相关文章

      网友评论

          本文标题:如何画出BTC微笑曲线

          本文链接:https://www.haomeiwen.com/subject/hhojgktx.html