DogeCoin-胡侃胡分析

Dogecoin,有人称作“狗狗币/狗币”,诞生于2013年12月8日,基于Scrypt算法,是一款虚拟货币。

先来无事,爬一些狗狗币的历史数据,做一下简单的分析,主要涉及到每日投入回报,斐波那契回撤线、RSI等各项指标的计算和绘图,同时有一些浅显的见解。

乱侃乱聊诸位客官见笑了。话不多说,代码人先撸为敬

#引入包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import plotly.graph_objects as go
plt.style.use('fivethirtyeight')
# 加载数据
df = pd.read_csv("doge_history.csv")
# 设置交易日期为索引
df = df.set_index(pd.DatetimeIndex(df['tickertime'].values))
# csv有一列是序列号存在,在本实例中没有价值,直接去掉这一列
df.drop('Unnamed: 0',axis=1, inplace=True)
# 按照交易日期排序
df = df.sort_index()
# 展示数据 每列含义: 索引列 | 交易日期 | 开盘价 | 收盘价 | 当日最高价 | 当日最低价 | 市值 | 交易量 | 相对前日涨幅
df
# 总数据量是 533条,时间是从2019年12月截至到2021年5月中旬
df.describe()
DogeCoin 历史数据的基本情况

简单看一下数据的基本情况.
我们可以看到每一项纬度的基本情况,例如收盘价的平均值,最大最小值及各分位的值#单纯开盘价的差值可以看出狗狗币的波动之大有点惊掉下巴了.

DogeCoin历史数据基本分析

绘制K线图
 当然我们可以从很多平台看到具体的K线图,不过我们为了装13也自己画一个图来撸一撸。

DogeCoin 每日K线
  • 自从进入2021年4月以来狗狗币冲击力一次0.8美分之后就开始疲软了
  • 我们很想知道目前阶段是不是应该继续持有它(当然前提是你以前就有,且没有在高位接盘)
  • 我们用最基础的斐波那契回撤支持线来分下,狗狗币抗不抗压
# 计算斐波那契回撤线, 一共设置4层回撤支撑线
maximum_price = df['closeprice'].max()
minimum_price = df['closeprice'].min()
difference = maximum_price - minimum_price
first_level = maximum_price - difference * 0.236
second_level = maximum_price - difference * 0.382
third_level = maximum_price - difference * 0.5
fourth_level = maximum_price - difference * 0.618
# 画图, 除了基本的四条斐波那契回撤线之外再把最大最小值的线也加上
# 同时也把交易量的图画出来
top = plt.subplot2grid((4,4), (0,0), rowspan=3, colspan=4)
top.plot(df.index, df['closeprice'], label='Close')
top.axhline(maximum_price, linestyle='--', alpha=0.5,color ='red')
top.axhline(first_level, linestyle='--', alpha=0.5,color ='orange')
top.axhline(second_level, linestyle='--', alpha=0.5,color ='yellow')
top.axhline(third_level, linestyle='--', alpha=0.5,color ='green')
top.axhline(fourth_level, linestyle='--', alpha=0.5,color ='blue')
top.axhline(minimum_price, linestyle='--', alpha=0.5,color ='purple')
plt.title('Close 2019-2021')
plt.legend(loc='upper left')
bottom = plt.subplot2grid((4,4),(3,0),rowspan=3, colspan=4)
plt.title('Volum 2019-2021')
bottom.bar(df.index,df['vol'])
plt.subplots_adjust(hspace=0.75)
plt.gcf().set_size_inches(15,8)
DogeCoin 斐波那契数回撤线

从图中我们可以明显看出来几个情况:

  • 交易量上升的几个时间周期内,狗狗的价格也在上升
  • 4、5月份狗狗回撤支撑还不错

接下来我们再从RSI和SMA这些指标看一看数据的反馈情况

# 每日投入回报
DSR = df['closeprice'].pct_change(1)
DSR
DogeCoin DSR基本情况
# 画出每日投资回报的图
plt.figure(figsize=(25,8))
plt.plot(DSR.index, DSR, label='Close', lw=1, alpha =0.65)
plt.title('DogeCoin Daily Simple Return')
plt.ylabel('Percentage')
plt.xlabel('Date')
plt.xticks(rotation=75)
DogeCoin DSR 波动图

单纯从每日投入回报的数据上看狗狗币不太适合稳重投资人入手,波动太大

  • 有两天的浮动超过百分之百,如果地位入手确实赚了,但是高位洁癖就赔惨了
  • 这样大的波动如果运气好玩杠杆真的算是高潮迭起了
# 计算强弱指标RSI
delta = df['closeprice'].diff(1)
delta = delta.dropna()
up = delta.copy()
down = delta.copy()
up[up<0] = 0
print(up.head(3))
down[down>0] = 0
time_period = 14
AVG_Gain = up.rolling(window=time_period).mean()
AVG_Loss = abs(down.rolling(window=time_period).mean())
RS = AVG_Gain / AVG_Loss
RSI = 100.0 - (100.0 / (1.0 + RS))
# 计算30天简单移动平均线 30 day simple moving average
SMA30 = df['closeprice'].rolling(window=30).mean()
df['SMA30'] = SMA30
df
# 画出RSI 和 SMA的图
fig, ax = plt.subplots(1,2,figsize=(15,5))
ax0 = RSI.plot(ax=ax[0])
ax0.axhline(30, color='green')
ax0.axhline(70, color='red')
df[['closeprice','SMA30']].plot(ax=ax[1])
DogeCoin RSI 和SMA30

我们把RSI强弱指标的数据用两张图展示出来:

  • 从SMA30 + 收盘价趋势来看,狗狗应该还会上升
  • 截至到2021年5月中旬,从RSI的基本分析来说超买情况刚刚回去,盘整回落
  • 结论就是还可以继续持有
  • All In

matplotlib.pyplot入门: http://www.lifefunker.com/archives/193
RSI: http://www.lifefunker.com/archives/190
超买、超卖: http://www.lifefunker.com/archives/186
plotly: http://www.lifefunker.com/archives/169
RSI: http://www.lifefunker.com/archives/163

Python 之matplotlib.pyplot

1、基本介绍

python 生态圈里的一大画图神器。matplotlib.pyplot是一个有命令风格的函数集合,它看起来和MATLAB很相似。每一个pyplot函数都使一副图像做出些许改变,例如创建一幅图,在图中创建一个绘图区域,在绘图区域中添加一条线等等。在matplotlib.pyplot中,各种状态通过函数调用保存起来,以便于可以随时跟踪像当前图像和绘图区域这样的东西。绘图函数是直接作用于当前axes(matplotlib中的专有名词,图形中组成部分,不是数学中的坐标系。)

2、安装

pip install matplotlib

举一个栗子?

import matplotlib.pyplot as plt
plt.plot([1,2,3,4])
plt.ylabel('some numbers')
plt.show()
matplotlib.pyplot demo

我们可以看到图一条直线图就生成了,那么X和Y轴为什么是0~3和1~4。原因是这样的,这里我们只是为plot()命令提供 了一个list或者是array,matplotlib就会假设这个序列是Y轴上的取值,并且会自动为你生成X轴上的值。因为python中的范围是从0开始的,因此X轴就是从0开始,长度与Y的长度相同,也就是[0,1,2,3]。

plot()是一个灵活的命令,它的参数可以是任意数量,如上图这表示的是(x,y)对,(1,1)(2,4)(3,9)(4,16)

这里有第三个可选参数,它是字符串格式的,表示颜色和线的类型。该字符串格式中的字母和符号来自于MATLAB,它是颜色字符串和线的类型字符串的组合。默认情况下,该字符串参数是’b-‘,表示蓝色的实线。
举一个使用红色圆圈绘制上述点集的栗子?:

import matplotlib.pyplot as plt
plt.plot([1,2,3,4], [1,4,9,16], 'ro')
plt.axis([0, 6, 0, 20])
plt.show()
不同颜色的 点集图

可以查看plot()的文档,那里有完整的关于线的类型的说明。axis()命令可以方便的获取和设置XY轴的一些属性。
如果matplotlib仅限于使用上面那种list,那么它将显得毫无用处。通常,我们都是使用numpy数组,实际上,所有的序列都将被在内部被转化成numpy数字。

下面的栗子?是使用一个命令用几种不同风格的线绘制一个数组:

import numpy as np
import matplotlib.pyplot as plt

# 0到5之间每隔0.2取一个数
t = np.arange(0., 5., 0.2)

# 红色的破折号,蓝色的方块,绿色的三角形
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
pyplot不同风格的画图

我们在画图的时候可以控制线的属性;线有许多属性可以设置:线宽、线的形状,平滑等等。一般是分几种方式:

  • 使用关键字参数:如 plt.plot(x,y,linewidth=2.0)
  • 对线对象(Line2D)使用set_方法,plot()会返回一个线对象的列表,比如line1, line2 = plot(x1, y1, x2, y2)。 下面的第一段代码我们将假设我们只有一条线,即返回的线对象列表的长度为1。
  • 使用setp()命令。setp()可以作用于一个列表对象或者是一个单一的对象。你可以使用python风格的关键字参数或者是MATLAB风格的string/value对为参数:下方第二段代码体现
line, = plt.plot(x, y, '-')
line.set_antialiased(False) # 关闭平滑
lines = plt.plot(x1, y1, x2, y2)
# 使用关键字
plt.setp(lines, color='r', linewidth=2.0)
# 或者是MATLAB风格的string/value对
plt.setp(lines, 'color', 'r', 'linewidth', 2.0)

3、进一步介绍

工作在多图形(figures)和多坐标系(axes)
MATLAB和pyplot都有当前图形(figure)和当前坐标系(axes)的概念。所有的绘图命令都是应用于当前坐标系的。gca()和gcf()(get current axes/figures)分别获取当前axes和figures的对象。

下面是一个栗子?,创建了两个子绘图区域(subplot):

import numpy as np
import matplotlib.pyplot as plt
 
def f(t):
    return np.exp(-t) * np.cos(2*np.pi*t)
 
t1 = np.arange(0.0, 5.0, 0.1)
t2 = np.arange(0.0, 5.0, 0.02)
 
plt.figure("2subplot")
plt.subplot(211)
plt.plot(t1, f(t1), 'bo', t2, f(t2), 'k')
 
plt.subplot(212)
plt.plot(t2, np.cos(2*np.pi*t2), 'r--')
plt.show()

你可以创建任意数量的子图(subplots)和坐标系(axes)。如果你想手动放置一个axes,也就是它不再是一个矩形方格,你就可以使用命令axes(),它可以让坐标系位于任何位置,axes([left,bottom,width,height]),其中所有的值都是0到1(axes([0.3,0.4,0.2,0.3])表示的是该坐标系位于figure的(0.3,0.4)处,其宽度和长度分别为figure横坐标和纵坐标总长的0.2和0.3)。其实subplot和axes的区别就在于axes大小和位置更加随意。
你可以创建多个figure,通过调用figure(),其参数为figure的编号。当然每个figure可以包含多个subplot或者是多个axes。

subplot()中的参数分别指定了numrows、numcols、fignum,其中fignum的取值范围为1到numrows*numcols,分别表示的是将绘图区域划分为numrows行和numcols列个子绘图区域,fignum为当前子图的编号。编号是从1开始,一行一行由左向右编号的。

又一个栗子?,稍后一颗枣:

import matplotlib.pyplot as plt
plt.figure(1)                # 编号为1的figure
plt.subplot(211)             # figure1中的第一个子图
plt.plot([1, 2, 3])
plt.subplot(212)             # figure1中的第二个子图
plt.plot([4, 5, 6])
 
 
plt.figure(2)                # figure2
plt.plot([4, 5, 6])          # 默认使用subplot(111),此时figure2为当      
                             # 前figure
 
plt.figure(1)                # 设置figure1为当前figure;  
                             # 但是subplot(212)为当前子图
plt.subplot(211)             # 使subplot(211)为当前子图
plt.title('Easy as 1, 2, 3') # 对subplot(211)命名

我们可以使用clf()和cla()(clear current figure/axes)清除当前figure和当前axes。
如果你创建了许多figures,你需要注意一件事:figure的内存直到显示调用close()函数才会被完全释放,否则它并没有被全部释放。如果只是删掉对figure的引用,或者是通过关闭window进程管理器关闭该figure,这都是不完全删除figure的,因为pyplot在内部维持了一个引用,直到close()被调用。

4、再进一步介绍

文字:text()命令可以被用来在任何位置添加文字,xlabel()、ylabel()、title()被用来在指定位置添加文字。

import numpy as np
import matplotlib.pyplot as plt
 
mu, sigma = 100, 15
x = mu + sigma * np.random.randn(10000)
 
 
# 直方图
 
n, bins, patches = plt.hist(x, 50,  facecolor='g', alpha=0.75,density=True )
 
 
plt.xlabel('Smarts')
plt.ylabel('Probability')
plt.title('Histogram of IQ')
plt.text(60, .025, r'$\mu=100,\ \sigma=15$')
plt.axis([40, 160, 0, 0.03])
plt.grid(True)
plt.show()
直方图带文字说明
  • 所有text()命令返回一个matplotlib.text.Text实例,像上面的线一样,可以通过关键字参数在text()定制文本样式,也可以通过setp()来定制文字的样式:
  • 在文本中使用数学表达式;matplotlib接受任何TeX方程表达式,你可以写成用”$”符号包裹的TeX表达式:
t = plt.xlabel('my data', fontsize=14, color='red')
setp(t,color='blue')
plt.title(r'$\sigma_i=15$')

这里的”r”非常重要,它表示后面的字符串是一个纯粹的字符串,不会将后面的反斜杠当作转义字符。matplotlib内置有TeX表达式解释器和排版引擎,和自带的数学字体。因此你可以不用安装TeX就能使用数学表达式,如果你安装了LaTeX和dvipng,你也可以使用LaTex排版你的文字并且直接输出到figures或者是保存。

  • 注释文本:使用text()命令可以在Axes中任意位置放置文本,一个普遍的文本用法是对一些特性进行注释,annotate()方法让添加注释变得很容易。对于注释有两点需要注意:需要被注释的地方,使用xy参数来指出,还有就是注释文本所放置的位置,使用参数xytext来指定位置,这两个参数都使(x,y)元组:
import numpy as np
import matplotlib.pyplot as plt
 
ax = plt.subplot(111)
 
t = np.arange(0.0, 5.0, 0.01)
s = np.cos(2*np.pi*t)
line, = plt.plot(t, s, lw=2)
 
plt.annotate('local max', xy=(2, 1), xytext=(3, 1.5),
            arrowprops=dict(facecolor='black', shrink=0.05),
            )
 
plt.ylim(-2,2)
plt.show()
在图中加注释

这里的xy和xytext所使用的坐标是根据XY轴的刻度的坐标,称为data coordinates。当然也可以使用其他坐标系统,具体参考官方文档。

对数和其他非线性坐标轴(axis)
matplotlib.pylot不仅仅提供了线性的坐标,还提供了对数(logarithmic)和分对数(logit)坐标。当数据的维度跨越许多数量级时,这种坐标就很有用,改变坐标轴的刻度很容易:

plt.xscale(‘log’)
  • 可以添加自己的刻度和投影。对于同样的数据,在Y轴使用不同刻度下的曲线图:
import numpy as np
import matplotlib.pyplot as plt
# 在区间[0,1]制造一些数据
# np.random.normal为高斯分布
y = np.random.normal(loc=0.5, scale=0.4, size=1000)
y = y[(y > 0) & (y < 1)]
y.sort()
x = np.arange(len(y))
 
# 创建一个窗口
plt.figure(1)
# 线性
plt.subplot(221)
plt.plot(x, y)
plt.yscale('linear')
plt.title('linear')
plt.grid(True)
# 对数
plt.subplot(222)
plt.plot(x, y)
plt.yscale('log')
plt.title('log')
plt.grid(True)

# symmetric log
plt.subplot(223)
plt.plot(x, y - y.mean())
plt.yscale('symlog', linthreshy=0.05)
plt.title('symlog')
plt.grid(True)
# logit
plt.subplot(224)
plt.plot(x, y)
plt.yscale('logit')
plt.title('logit')
plt.grid(True)
 
plt.show()
不同刻度图

友情链接:另一画图神器plotly,http://www.lifefunker.com/archives/169

股票指标-rsi指标三条线的使用技巧

rsi指标是一个预测个股强弱的指标,投资者可以根据它来分析个股。rsi指标三条线分别为:白色线,一般为6天线;黄色线,一般为12天线;紫色线,一般为24天色线。

当6日、12日rsi指标线在rsi值的50附近向上击穿24日线,此时如果出现了金叉,那么往往是买入信号;当24日rsi指标线下降并跌破rsi值的50平衡线时,就会形成一个死叉,股票价格就会下跌,这是一个很好的卖出信号;当6日和12日RSI指标之前都在50平衡线下方运动,突然同时向上突破该平衡线时,说明多方力量不断增强,已经蓄势待发,股票的价格将继续上升,投资者可以适量的买入;当6日、12日RSI指标线同时上升到80以上,表明此时股价已经达到峰值,股价可能会下跌,投资者可以选择卖出。