我在用好币圈这五大指数,助你抄底与逃顶这篇文章中介绍过Ahr999指数,想用程序来获取这个指数的数据,当时折腾了几个小时都没有成功,遇到了几个难题,后来终于找到办法了。
首先,上篇文章中介绍用了两个指数,其实Ahr999把这两个指数相乘得到了一个,如下:
ahr999指数 = (比特币价格/200日定投成本) * (比特币价格/指数增长估值)
该指数由微博用户ahr999创建,辅助比特币定投用户结合择机策略做出投资决策。该指数隐含了比特币短期定投的收益率及比特币价格与预期估值的偏离度。从长期来看,比特币价格与区块高度呈现出一定的正相关,同时借助定投方式的优势,用户可以控制短期定投成本,使其大都位于比特币价格之下。
根据统计规律发现,ahr999指数
小于0.45,是抄底区间;
在0.45与1.2之间,定投区间;
在1.2与5之间,这就是等待起飞的区间;
大于5时,该卖币了
这个指数详细的介绍在这里https://weibo.com/ttarticle/p/show?id=2309404441088189399138
接下来,根据这里面的公式一步步来计算
一、求指数币价
1. 获取每天的比特币价格,使用dataframe,一列为日期,一列为比特币当天的价格;
2. 算出每天对应的币龄,用的是pandas中的日期差,就是比特币出生了多少天(比特币的生日是2009年1月3日),这个想办法转成了整数;
3. 根据公式指数币价 = 10^[5.84log(币龄)-17.01]算出指数币价,
但用math.log计算log(币龄)时一直报错:cannot convert the series to ,这是我遇到的第一个难题。
我测试过币龄直接乘以一个数是没问题的。
后来终于找到原因,是因为math.log这个函数没办法直接运用到pandas中,要想使用得换个命令,使用numpy库中的log函数,即df['BTC_age'].apply(np.log10),这样就解决了log函数的问题。
接下来在计算公式中还有一个难题是如何求10的x次方,因为也是用pandas计算,后来找到一个函数求幂,用法是df1.pow(df2)代表df1的df2次方。我们要求的是10的[5.84log(币龄)-17.01]次方,所以需要用df['a']=10增加一列,每个值都是10,这样就可以用df['a'].pow(5.84* df['BTC_age'].apply(np.log10) -17.01)求出指数币价了。
这两个问题解决了,就可以通过上述方法就算出指数币价。
二、计算200日定投成本
这个值ahr999特意强调是几何平均,不是算术平均,差别是这样的
算术平均数含义如下:
几何平均数含义如下:
那么问题来了,如何在pandas中求几何平均呢?
经历过几个坑之后,发现这里需要调取另一个库scipy,里面有个gmean就可以直接求了,另外我们需要用到rolling函数,就是取200行,程序如下:
from scipy.stats.mstats import gmean
df['200_cost'] = df['BTC_price'].rolling(200).apply(gmean,raw=True) # 几何平均值
至此,所有的坑都被我趟过了,过程当中还是感觉自己的基础知识不够扎实,全靠谷歌,这样有时候也挺浪费时间的,不过用一次后面就不难了。
另外我又想到一个爬虫的思路,直接爬取https://ahr999.com的数据,但是从这个https://btajy.com/btcie.com/ahr999/datanew.js?sj=20203.2823调取之后是个字符串,不好变成列表或字典形式,又卡住了。
后来想到,这个问题的解决办法是先用正则表达式找出来与ahr999指数相关的值,然后再转化为列表,这步我是解决了。
但昨天和今天的数据对比发现地址中这个sj=?这个值每天都变,那就没办法用一个固定值了,所以这个方法只能放弃了。
获取ahr999这个指数之后就可以用来做提醒什么的,同样可以用钉钉或者微信,这里不再赘述了。
想更进一步交流,欢迎搜索我微信ywx1221或扫码