# 量化投资学习（2）- 如何用十五行代码画出k线

By [鱼叔 UncleFish](https://paragraph.com/@unclefish) · 2022-01-04

---

hello 大家好，我是鱼叔。今天是量化投资学习的第二课，如何用python抓取数据绘制k线，这节教程是基于上一节教程开发的，主要是通过调用CoinGecko提供的api接口实现数据的提取。虽然实现这个功能只要十五行的代码，但是我也花了不少时间思考和定位问题，总之希望能大家一丝启发。（ps，当我们能绘制出k线时，那下一步就可以进行量化分析了，代码在文章末尾）

整体设计目标：
-------

1.  能通过输入项目代号和时间范围抓取对应的价格
    
2.  根据时间和价位进行图形绘制，形成k线图
    

实现流程：
-----

1.  通过get\_coin\_market\_chart\_by\_id函数进行数据的挖掘，这个函数有三个入参：id、vs\_cuurency、date\_len。分别代表着项目名称、你想要的计价单位以及想要的数据时间周期（这边我统一用usd作为计价单位）。
    
2.  将数据中的时间和价格分别分离出来，存到两个队列里。
    
3.  将时间的表现形式从「时间戳」转换为「正常时间」。注意api返回的时间为毫秒级的时间戳，因此要除以1000进行转换。此外返回的时间为小时级别数据，也就是说你会得到24\*天数个数据。
    
4.  调用matplotlib提供的plot函数进行图表的绘制。
    
5.  封装成函数，输入参数为id，时间长度两个变量。
    

需要的代码库
------

*   pycoingecko（CoinGecko提供的api库，需要自行安装）
    
*   matplotlib（用于绘制图，需要自行安装）
    
*   time（python自带的时间转换库，不需要额外安装）
    

一些参考链接：
-------

[https://www.jianshu.com/p/2d93ec38ddcf](https://www.jianshu.com/p/2d93ec38ddcf)

[https://blog.csdn.net/wangzirui32/article/details/117390474](https://blog.csdn.net/wangzirui32/article/details/117390474)

实现效果：
-----

这是我抓出来90天btc价格走势图，第二张图是coingecko截图下来的90天k线走势图，其实两者走势基本一样，也就是说至少k线的绘制上没有太大的问题。

![](https://storage.googleapis.com/papyrus_images/6b425044719cbf7827758575e5ed8e16079bd2608a415fd0b79412dd3c61bd97.png)

![](https://storage.googleapis.com/papyrus_images/9c4c1eafa2621a652d0f6d7b728e40e9b9213f564841b6c340325b9790fdaaf2.png)

后期值得改进的地方
---------

1.  目前似乎只支持抓90天以内的数据，超出了长度好像就没法进行抓取，后期可以考虑自行整改官方API实现较长时间数据提取。
    
2.  由于数据量偏大，在拖动图片的时候可能会存在卡顿，后期可以在保证k线形状的情况下减少绘图用的点。
    
3.  在k线图上增加一些标记物，比如中值点、最大值、最小值等。
    
4.  丰富k线内容，包括市值，交易量等。
    

为什么要自己绘制k线
----------

可能很多朋友会说平台提供的k线已经很好用了，为什么要自己绘制呢？事实上，平台确实提供了不少的功能，很多功能也很强大，但是这个过程是被动的，你没法主动地把某两个参数结合起来分析，受限于平台提供的功能亦或是需要成为它们的vip等等。而自己搭建量化系统是一个主动学习探索的过程，你可以将你想到的参数都放进自己的模型里，来打造属于你的交易策略。

代码参考：
-----

具体函数的代码（确实十五行）：

    def price_market_draw(id, time_len):
        cg = CoinGeckoAPI()
        coin_data = cg.get_coin_market_chart_by_id(id, 'usd', time_len) #获得对应代币的价格
        coin_time = []
        coin_price = []
        for i in range(int(time_len)*24): # 由于返回的是小时制，所以总数据等于天数*24
            time_stamp = coin_data['prices'][i][0]/1000  # 返回的是毫秒级时间戳所以除以1000转换成秒级进行处理
            time_local = time.localtime(time_stamp)  # 转换成本地时间
            dt = time.strftime("%Y-%m-%d %H:%M:%S", time_local)  # 进行数据的转换方便观察
            coin_time.append(dt)  # 存入时间队列
            coin_price.append(coin_data['prices'][i][1])  # 存入价格队列
        plt.plot(coin_time, coin_price, linewidth=2)  # 图标绘制，第一个参数是x轴，第二个参数是y轴
        plt.title(id + ' ' + time_len + 'days table', fontsize=14)
        plt.xlabel("time", fontsize=14)
        plt.ylabel("usd", fontsize=14)
        plt.show()
    

调用参考

    from pycoingecko import CoinGeckoAPI
    import matplotlib.pyplot as plt
    import time
    
    
    if __name__ == '__main__':
        #print(response)
    
        price_market_draw('bitcoin', '90')
        #调用btc90天的数据形成k线图，第一个参数是代币名字，第二个天数，天数要小于等于90天
    

* * *

我是鱼叔，一个理性的币圈投资和输出者。

【[2021 鱼叔的投资报告 语雀版](https://www.yuque.com/yushu-wt9ax/unclefish/xdwyhf)】 【[2021 鱼叔的投资报告 公众号版](https://mp.weixin.qq.com/s?__biz=MzUzNjY1NTEzMg==&mid=2247483778&idx=1&sn=54216433595bcf2fcfcc90bf07b46cbd&chksm=faf3a5f1cd842ce799cbc2732f5bbf0c67967ae714c60ff230f8a085e85306dccd09f5614772&payreadticket=HADAQ1uqClPR5PUHcqwHP5x3ie7f5wLId3Wkysk6erGPsyt03qpudhAwGGRYg5UK6_Bhheo#rd)】

有兴趣的朋友可以关注[鱼叔的持仓](https://www.yuque.com/yushu-wt9ax/unclefish/it097b) - 看看鱼叔都在买什么。

欢迎关注： [鱼叔的投资博客](https://www.yuque.com/yushu-wt9ax/unclefish) / [鱼叔的投资笔记](https://www.yuque.com/yushu-wt9ax/ues0xx) / [鱼叔的Mirror](https://mirror.xyz/0xA6DDeA5E7a4eF5c680200BF37984A06c6CFb123D) / 公众号【鱼叔的币圈江湖】

知乎 鱼叔， 币乎 UncleFish， 巴比特海盗号 鱼叔。

如果觉得我不错，欢迎加入[鱼叔的圈子](https://m.redring.cn/ex-group/16775?uid=1604526&f=1)

靠谱的梯子：[天路云](http://91tianlu.fashion/aff.php?aff=4728)

靠谱的交易所注册：[币安](https://accounts.binancezh.cz/zh-CN/register?ref=MV2918PM) ｜ [火币](https://www.huobi.bo/zh-cn/register/?invite_code=r6ak8&t=1628608311363) ｜[OKEX](https://www.ouyi.fit/join/5198227) ｜ [GATE](https://www.gate.ac/signup/3364676)

钱包网址：[TokenPocket](https://www.tokenpocket.pro/) ｜ [ImToken](https://token.im/)

---

*Originally published on [鱼叔 UncleFish](https://paragraph.com/@unclefish/2-k)*
