用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标

本文章将用PYTHON 画图 以比特币(BTC)为例 进行画图分析 (小白向)
Pycharm平台编写

所用到的python库

import requests
from lxml import etree
import math
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import datetime

所用到的数据来源

数据从国外的coinmarketcap(需要科学上网)上提取2021.2.1-2022.2.3的数据
coinmarketcap
https://coinmarketcap.com/currencies/bitcoin/historical-data/?start=20210101&end=20220202)

数据我就直接放网盘了,怎么爬我后面再补吧 (不过没什么用当个过度就行不用特别了解)
链接:https://pan.baidu.com/s/1C3np-mnd-AAX_4u3XlnZ_A
提取码:7bxn

爬取的是HTML格式的,后面代码转化一下
数据一共包括7个元素
‘date’:日期
‘open’:开盘价
‘high’:当日最高价
‘low’:当日最低价
‘close’:收盘价
‘volume’:当日总交易额
‘Market Cap’:当日市值

with open("data.txt", "r") as f: rd = f.read()
selector = etree.HTML(rd)url_infos = selector.xpath('//tr')data = []
for url_info in url_infos:l = []for i in range(7):d = url_info.xpath('td[%d+1]/text()' % i) if i == 0:l += delse:if d[0] == '-':d[0] = np.nanl += delse:d[0] = d[0].replace(',', '')d[0] = d[0].strip('$')d[0] = float(d[0])l += ddata.append(l)arr = np.array(data)
df = pd.DataFrame(arr)  df.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'Market Cap']
df = df.astype({'open': 'float64', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'Market Cap': 'float64'})
df = df.reindex(index=df.index[::-1])
df.head()  # 倒序
df.reset_index(drop=True, inplace=True)  # 逆序后 重设index
df.reset_index(inplace=True)  # 重设index,原来的index汇入DataFrame中
df['date']=pd.to_datetime(df['date'])
df = df.astype({'date': 'string'})
df.index = pd.to_datetime(df['date'])  # 设置index的值
print(df)
print(df.dtypes)
df['date'] = df['date'].apply(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))#转换日期格式
print(df.dtypes)
print(df)

输出结果如下

画 价格图 和 蜡烛图

价格图

先上效果图,后附可以直接运行的代码(数据用的是网盘的data.txt)

代码

from lxml import etree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import datetimewith open("data.txt", "r") as f: rd = f.read()
selector = etree.HTML(rd)
url_infos = selector.xpath('//tr')
# 从data.txt中提取需要的数据
data = []
for url_info in url_infos:l = []# 获取单行数据并做初步处理for i in range(7):d = url_info.xpath('td[%d+1]/text()' % i)if i == 0:l += delse:if d[0] == '-':d[0] = np.nanl += delse:d[0] = d[0].replace(',', '')d[0] = d[0].strip('$')d[0] = float(d[0])l += ddata.append(l)arr = np.array(data)
df = pd.DataFrame(arr)  # 将数据转为DataFrame数据类型df.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'Market Cap']  # 设置列标题
# df['date']=df['date'].map(pd.to_datetime)#转化日期格式df = df.astype({'open': 'float64', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'Market Cap': 'float64'})
df = df.reindex(index=df.index[::-1])
df.head()  # 倒序
df.reset_index(drop=True, inplace=True)  # 逆序后 重设indexplt.rcParams['axes.unicode_minus'] = False# 解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决中文乱码问题df.reset_index(inplace=True)  # 重设index,原来的index汇入DataFrame中
df['date']=pd.to_datetime(df['date'])
df = df.astype({'date': 'string'})
df.index = pd.to_datetime(df['date'])  # 设置index的值
print(df)
print(df.dtypes)
df['date'] = df['date'].apply(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))#转换日期格式
print(df.dtypes)
print(df)fig, ax2 = plt.subplots(figsize=(1200 / 72, 480 / 72))
ax2.plot(df['date'], df['close'])
ax2.grid(True)
ax2.set_ylim(0, 70000)
fig.subplots_adjust(bottom=0.2)  ## 调整底部距离
ax2.xaxis_date()  ## 设置X轴刻度为日期时间
plt.yticks()  ## 设置Y轴刻度线
plt.xlabel(u"时间")  ##设置X轴标题
ax2.set_ylabel('收盘价')
plt.grid(True, 'major', 'both', ls='--', lw=.5, c='k', alpha=.3)  ##设置网格线
plt.show()

蜡烛图

这里就直接和价格图叠加到一起显示了

放大后是这个样子:

from lxml import etree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import datetimewith open("data.txt", "r") as f: rd = f.read()
selector = etree.HTML(rd)
url_infos = selector.xpath('//tr')
# 从data.txt中提取需要的数据
data = []
for url_info in url_infos:l = []# 获取单行数据并做初步处理for i in range(7):d = url_info.xpath('td[%d+1]/text()' % i)if i == 0:l += delse:if d[0] == '-':d[0] = np.nanl += delse:d[0] = d[0].replace(',', '')d[0] = d[0].strip('$')d[0] = float(d[0])l += ddata.append(l)arr = np.array(data)
df = pd.DataFrame(arr)  # 将数据转为DataFrame数据类型df.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'Market Cap']  # 设置列标题
# df['date']=df['date'].map(pd.to_datetime)#转化日期格式df = df.astype({'open': 'float64', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'Market Cap': 'float64'})
df = df.reindex(index=df.index[::-1])
df.head()  # 倒序
df.reset_index(drop=True, inplace=True)  # 逆序后 重设indexplt.rcParams['axes.unicode_minus'] = False# 解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决中文乱码问题df.reset_index(inplace=True)  # 重设index,原来的index汇入DataFrame中
df['date']=pd.to_datetime(df['date'])
df = df.astype({'date': 'string'})
df.index = pd.to_datetime(df['date'])  # 设置index的值
print(df)
print(df.dtypes)
df['date'] = df['date'].apply(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))#转换日期格式
print(df.dtypes)
print(df)fig, ax1 = plt.subplots(figsize=(1200 / 72, 480 / 72))
da = df[['date', 'open', 'high', 'low', 'close']]
f = da[['date', 'open', 'high', 'low', 'close']].values
ax3 = ax1.twinx()
ax2 = ax1.twinx()
candlestick_ohlc(ax1, f, colordown='g', colorup='r', width=0.3, alpha=0.7)
ax3.bar(df['date'], df['volume'], width=0.6)
ax2.plot(df['date'], df['close'])
ax2.grid(True)
ax3.grid(True)
ax3.set_ylim(0, 500000000000)
ax1.set_ylim(0, 70000)
ax2.set_ylim(0, 70000)
ax1.set_ylabel('币价$')
fig.subplots_adjust(bottom=0.2)  ## 调整底部距离
ax1.xaxis_date()  ## 设置X轴刻度为日期时间
ax2.xaxis_date()  ## 设置X轴刻度为日期时间
ax3.xaxis_date()  ## 设置X轴刻度为日期时间
plt.yticks()  ## 设置Y轴刻度线
plt.xlabel(u"时间")  ##设置X轴标题
ax2.set_ylabel('收盘价/成交量')
plt.grid(True, 'major', 'both', ls='--', lw=.5, c='k', alpha=.3)  ##设置网格线
plt.show()

简单的分析趋势

这里用的是一个比较基础的指标:简单移动平均线 SMA(看均价用的)
具体可以参考这个文章:
https://zhuanlan.zhihu.com/p/422205612

打个比方:
一共有10天连续的收盘价:1 2 3 4 5 6 7 8 9 10
我需要话一个3SMA的线(就是3个周期的简单移动平均线)

那么我将得到一组后7天收盘价的 3SMA
(1+2+3)/3,(2+3+4)/3,…,(8+9+10)/3

现在我画一个 5SMA的图(红色的线)



计算5SMA的代码

step=5
dflen=len(df)
sma= {}
for i in range(step):sma[i]=0
for i in range(dflen-step):i+=stepsma[i]=0for j in range(step):j+=1sma[i] += df['close'][i-j]if j==step: sma[i]=sma[i]/step
sma = pd.DataFrame.from_dict(sma,orient='index',columns=['SMA'])
print(sma)

输出图片的完整代码

from lxml import etree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import datetimewith open("data.txt", "r") as f: rd = f.read()
selector = etree.HTML(rd)
url_infos = selector.xpath('//tr')
# 从data.txt中提取需要的数据
data = []
for url_info in url_infos:l = []# 获取单行数据并做初步处理for i in range(7):d = url_info.xpath('td[%d+1]/text()' % i)if i == 0:l += delse:if d[0] == '-':d[0] = np.nanl += delse:d[0] = d[0].replace(',', '')d[0] = d[0].strip('$')d[0] = float(d[0])l += ddata.append(l)arr = np.array(data)
df = pd.DataFrame(arr)  # 将数据转为DataFrame数据类型df.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'Market Cap']  # 设置列标题
# df['date']=df['date'].map(pd.to_datetime)#转化日期格式df = df.astype({'open': 'float64', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'Market Cap': 'float64'})
df = df.reindex(index=df.index[::-1])
df.head()  # 倒序
df.reset_index(drop=True, inplace=True)  # 逆序后 重设indexplt.rcParams['axes.unicode_minus'] = False# 解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决中文乱码问题df.reset_index(inplace=True)  # 重设index,原来的index汇入DataFrame中
df['date']=pd.to_datetime(df['date'])
df = df.astype({'date': 'string'})
df.index = pd.to_datetime(df['date'])  # 设置index的值
print(df)
print(df.dtypes)
df['date'] = df['date'].apply(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))#转换日期格式
print(df.dtypes)
print(df)step=5
dflen=len(df)
sma= {}
for i in range(step):sma[i]=0
for i in range(dflen-step):i+=stepsma[i]=0for j in range(step):j+=1sma[i] += df['close'][i-j]if j==step: sma[i]=sma[i]/step
sma = pd.DataFrame.from_dict(sma,orient='index',columns=['SMA'])
print(sma)fig, ax1 = plt.subplots(figsize=(1200 / 72, 480 / 72))
da = df[['date', 'open', 'high', 'low', 'close']]
f = da[['date', 'open', 'high', 'low', 'close']].values
ax3 = ax1.twinx()
ax2 = ax1.twinx()
axsma=ax1.twinx()
candlestick_ohlc(ax1, f, colordown='g', colorup='r', width=0.3, alpha=0.7)
ax3.bar(df['date'], df['volume'], width=0.6)
ax2.plot(df['date'], df['close'])
axsma.plot(df['date'],sma['SMA'],color="r")
ax2.grid(True)
ax3.grid(True)
axsma.grid(True)
ax3.set_ylim(0, 500000000000)
ax1.set_ylim(0, 70000)
ax2.set_ylim(0, 70000)
axsma.set_ylim(0, 70000)
ax1.set_ylabel('币价$')
fig.subplots_adjust(bottom=0.2)  ## 调整底部距离
ax1.xaxis_date()  ## 设置X轴刻度为日期时间
ax2.xaxis_date()  ## 设置X轴刻度为日期时间
ax3.xaxis_date()  ## 设置X轴刻度为日期时间
axsma.xaxis_date()  ## 设置X轴刻度为日期时间
plt.yticks()  ## 设置Y轴刻度线
plt.xlabel(u"时间")  ##设置X轴标题
ax2.set_ylabel('收盘价/成交量/SMA')
plt.grid(True, 'major', 'both', ls='--', lw=.5, c='k', alpha=.3)  ##设置网格线
plt.show()

接下来把5SMA(红色) 、30SMA(黄色)、 60SMA(绿色) 反应到一张图上
2处黑色箭头显示的就是 股市里常说的一个金叉现象(不过我是个是SMA的)短线5SMA与长线60SMA底部向上交叉,一般这是一个买入信号(当时这是复盘,实战只能作为一个判断趋势的参考点)

最后分析一下这个2月3日后的BTC可能的走势
图片中可以看到 收盘价的线走在中、长期均价线的下方,总体会有向均价方向移动的趋势,买入机会应该就在60SMA于5SMA渐进时,估计就一两周吧 会有个交叉的趋势

看到这里应该理解了指标的作用 说是预测其实只是提供一些数据给你做判断,指标各种各样,各种股票 货币软件里都要各种指标的线 像是MA EMA BOLL SAR 的 欢迎各位一起来讨论分析,这篇文章也是一个小白入门文,让你理解 数据转化为图片的方式 K线图的理解

Q149021708

from lxml import etree
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.pylab import date2num
import datetimewith open("data.txt", "r") as f: rd = f.read()
selector = etree.HTML(rd)
url_infos = selector.xpath('//tr')
# 从data.txt中提取需要的数据
data = []
for url_info in url_infos:l = []# 获取单行数据并做初步处理for i in range(7):d = url_info.xpath('td[%d+1]/text()' % i)if i == 0:l += delse:if d[0] == '-':d[0] = np.nanl += delse:d[0] = d[0].replace(',', '')d[0] = d[0].strip('$')d[0] = float(d[0])l += ddata.append(l)arr = np.array(data)
df = pd.DataFrame(arr)  # 将数据转为DataFrame数据类型df.columns = ['date', 'open', 'high', 'low', 'close', 'volume', 'Market Cap']  # 设置列标题
# df['date']=df['date'].map(pd.to_datetime)#转化日期格式df = df.astype({'open': 'float64', 'high': 'float64', 'low': 'float64', 'close': 'float64', 'volume': 'float64', 'Market Cap': 'float64'})
df = df.reindex(index=df.index[::-1])
df.head()  # 倒序
df.reset_index(drop=True, inplace=True)  # 逆序后 重设indexplt.rcParams['axes.unicode_minus'] = False# 解决坐标轴刻度负号乱码
plt.rcParams['font.sans-serif'] = ['Simhei']# 解决中文乱码问题df.reset_index(inplace=True)  # 重设index,原来的index汇入DataFrame中
df['date']=pd.to_datetime(df['date'])
df = df.astype({'date': 'string'})
df.index = pd.to_datetime(df['date'])  # 设置index的值
print(df)
print(df.dtypes)
df['date'] = df['date'].apply(lambda x: date2num(datetime.datetime.strptime(x, '%Y-%m-%d')))#转换日期格式
print(df.dtypes)
print(df)step=5
dflen=len(df)
sma= {}
for i in range(step):sma[i]=0
for i in range(dflen-step):i+=stepsma[i]=0for j in range(step):j+=1sma[i] += df['close'][i-j]if j==step: sma[i]=sma[i]/step
sma = pd.DataFrame.from_dict(sma,orient='index',columns=['5SMA'])
print(sma)step=30
dflen=len(df)
sma30= {}
for i in range(step):sma30[i]=0
for i in range(dflen-step):i+=stepsma30[i]=0for j in range(step):j+=1sma30[i] += df['close'][i-j]if j==step: sma30[i]=sma30[i]/step
sma30 = pd.DataFrame.from_dict(sma30,orient='index',columns=['30SMA'])
print(sma30)step=60
dflen=len(df)
sma60= {}
for i in range(step):sma60[i]=0
for i in range(dflen-step):i+=stepsma60[i]=0for j in range(step):j+=1sma60[i] += df['close'][i-j]if j==step: sma60[i]=sma60[i]/step
sma60 = pd.DataFrame.from_dict(sma60,orient='index',columns=['60SMA'])
print(sma60)fig, ax1 = plt.subplots(figsize=(1200 / 72, 480 / 72))
da = df[['date', 'open', 'high', 'low', 'close']]
f = da[['date', 'open', 'high', 'low', 'close']].values
ax3 = ax1.twinx()
ax2 = ax1.twinx()
axsma=ax1.twinx()
axsma30=ax1.twinx()
axsma60=ax1.twinx()
candlestick_ohlc(ax1, f, colordown='g', colorup='r', width=0.3, alpha=0.7)
ax3.bar(df['date'], df['volume'], width=0.6)
ax2.plot(df['date'], df['close'])
axsma.plot(df['date'],sma['5SMA'],color="red")
axsma30.plot(df['date'],sma30['30SMA'],color="blue")
axsma60.plot(df['date'],sma60['60SMA'],color="green")
ax2.grid(True)
ax3.grid(True)
axsma.grid(True)
axsma30.grid(True)
axsma60.grid(True)
ax3.set_ylim(0, 500000000000)
ax1.set_ylim(0, 70000)
ax2.set_ylim(0, 70000)
axsma.set_ylim(0, 70000)
axsma30.set_ylim(0, 70000)
axsma60.set_ylim(0, 70000)
ax1.set_ylabel('币价$')
fig.subplots_adjust(bottom=0.2)  ## 调整底部距离
ax1.xaxis_date()  ## 设置X轴刻度为日期时间
ax2.xaxis_date()  ## 设置X轴刻度为日期时间
ax3.xaxis_date()  ## 设置X轴刻度为日期时间
axsma.xaxis_date()  ## 设置X轴刻度为日期时间
plt.yticks()  ## 设置Y轴刻度线
plt.xlabel(u"时间")  ##设置X轴标题
ax2.set_ylabel('收盘价/成交量/SMA')
plt.grid(True, 'major', 'both', ls='--', lw=.5, c='k', alpha=.3)  ##设置网格线
plt.show()

未完待续…

用PYTHON画图 看股票/数字货币的趋势分析 带你直观理解指标 K线图相关推荐

  1. python能画k线图吗_python画k线图(一天的k线图怎么画)

    1.大智慧软件在日线窗口的左上角标有主图的公式名称,(如ma sar bbi )等, 如果不是ma指标,请输入ma,回车.2.如果输入ma后还是没有均线,请按 f7 键,弹出 最好能举个例子的.非常感 ...

  2. Python画图实战之画K线图【附带自动下载股票数据】

    关于Python画图的基本知识可以先查看下面这篇文章Python画图(直方图.多张子图.二维图形.三维图形以及图中图)https://blog.csdn.net/weixin_41896770/art ...

  3. python 画k线图_matplotlib画k线图

    画k线需要的包和环境: python36 import tushare as ts import re import matplotlib.pyplot as plt import mpl_finan ...

  4. 棕榈学院Python课程回顾——K线图绘制

    棕榈学院Python课程回顾(Day 1-2) 文章目录 棕榈学院Python课程回顾(Day 1-2) 环境配置 Sublime text 3 jupyter notebook Day 1 文件读取 ...

  5. 基于python的股票数据的读取及可视化(K线图)

    文章目录 1.读取数据 2.绘制股票走势图 3.绘制K线图 1.读取数据 TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程, ...

  6. python画出K线图及技术指标

    目录 安装mplfinance及Ta-lib 画图 安装mplfinance及Ta-lib mplfinance是基于matplotlib的金融数据可视化分析模块,前身是mpl_finance,比起m ...

  7. 《Python数据可视化之Matplotlib与Pyecharts》之K线图

    10.5.1  K线图及其参数配置 K线图又称蜡烛图,股市及期货市场中的K线图的画法包含四个数据,即开盘价.最高价.最低价.收盘价,所有的k线都是围绕这四个指标展开,反映股票的状况.如果把每日的K线图 ...

  8. Python绘制股票K线图

    目录 1 股票K线图知识了解 2 用Python绘制股票K线图 2.1 安装绘制K线图的mpl_finance库 2.2 引入相关库 2.3 用Tushare库获取股票基本数据 2.4 日期格式调整及 ...

  9. 利用 python numpy +matplotlib 绘制股票k线图

    一.python numpy + matplotlib 画股票k线图 # -- coding: utf-8 -- import requests import numpy as np from mat ...

最新文章

  1. 结对开发--求二维数组的最大子数组
  2. Winform中DataGridView绑定IList数据源后的排序
  3. python一般用来开发什么-python主要用来做什么?Python开发简单吗?
  4. 【转】C# 二维码生成
  5. ARM1176JZF-S/S3C6410 内存地址转换
  6. SpecFlow特性介绍1-Step Definitions
  7. FlexPaper不能跨服务器加载远程文件解决办法
  8. [图解tensorflow源码] [原创] Tensorflow 图解分析 (Session, Graph, Kernels, Devices)
  9. u盘 linux centos 5.3,鸟哥linux私房菜学习笔记,U盘安装centos5.3不能正常进入图形界面的问题...
  10. 【图像处理】——Python实现图像加噪(随机噪声、椒盐噪声、高斯噪声等)
  11. pve安装黑群晖直通硬盘_蜗牛星际装机教程篇三:手把手教你安装黑群晖NAS
  12. asp.net中慎用static全局变量
  13. [Javascript]js中所学知识点回顾总结
  14. 学生管理系统实训报告
  15. 程序员打造影响力常犯的 3 个错
  16. matlab 有限元分析
  17. EBCDIC 与 GBK 的字符编码及其转换(转)
  18. 2022数学建模高教杯国家一等奖经验分享
  19. Charles抓包出现弹窗问题或者无法抓包https问题汇总
  20. 1257: 田忌赛马

热门文章

  1. DownloadManager--Android自带的下载工具
  2. vegas界面对比!
  3. Python人工智能实战项目教程免费分享学习:人工智能项目《AI在线医生》
  4. 【庖丁解牛】configure: WARNING: unrecognized options: --with-mcrypt, --enable-gd-native-ttf
  5. 汇编中的la_MIPS汇编与指令
  6. 示波器正确测量电源纹波
  7. 数据类型与数据分析方法
  8. 概率统计——三扇门游戏与贝叶斯定理
  9. 大数据在各个行业的应用_大数据应用:大数据应用的七大领域
  10. 【linux】循序渐进学运维-CentOS7基本配置