matplotlib

matplotlib

数据可视化工具包

安装

pip install matplotlib

import matplotlib.pyplot as plt

绘图:plt.plot()

显示:plt.show()

plot函数

绘制折线图

  • marker

    • 线型(-,-.,--,...)

    • 点型(v,^,s,*,H,+,x,D,o,...)

  • color:颜色(b,g,r,y,k,w,....),k是black

  • label:线的标注

  • o:k,说明是黑点

绘制多条曲线,执行多个plot()即可

图像标注

  • plt.title():标题

  • plt.xlabel():x轴标签

  • plt.ylabel():y轴标签

  • plt.xlim(min,max):x轴范围

  • plt.ylim(min,max):y轴范围

  • plt.xticks([]):x轴的刻度

    • plt.xticks(np.arange(0,10,2),['a','b','c','d','e'])

  • plt.yticks([]):y轴的刻度

  • plt.legend():显示线的标签

  • pandas包对plot的支持

    • df = pd.read_csv('file_name.csv',parse_dates=['date',index_col='date'])['open','close','high','low']

    • df.plot()

    • plt.show()

画布与子图

  • 画布:fig = plt.figure()

  • 子图:ax1 = fig.add_subplot(2,2,1)

    • 将画布分成两行两列,图占第一个位置

  • 调节子图间距:suplots_adjust(left,bottom,right,top,wspace,hspace)

图类型

函数 说明
plt.plot(x,y,fmt,...) 坐标图
plt.boxplot(data,notch,position) 箱型图
plt.bar(left,right,width,bottom) 条形图
plt.barh(width,bottom,left,height) 横向条形图
plt.polar(theta,r) 极坐标图
plt.pie(data,explode) 饼图
plt.psd(x,NFFT=256,pad_to,Fs) 功率谱密度图
plt.specgram(x,NFFT=256,pad_to,F) 谱图
plt.cohere(xy,NFFT=256,Fs) X-Y相关性函数
plt.scatter(x,y) 散点图
plt.step(x,y,where) 步阶图
plt.hist(x,bins,normed) 直方图

绘制k线图

  • matplotlib.finanace子包中有许多绘制金融相关图的函数接口

  • 绘制k线图:matplotlib.finanace.candlestick_ochl函数

     1 import matplotlib.finanace as fin
     2 from matplotlib.dates import date2num
     3 ​
     4 df['time'] = date2num(df.index.to_pydatetime('date'))
     5 df = df.iloc[:100,:]
     6 fig = plt.figure()
     7 ax = fig.add_subplot(1,1,1)
     8 # 对应ochl
     9 arr =df['time','open','close','high','low'].values
    10 fin.candlestick_ochl(ax,arr)
    11 fig.show()

Tushare

免费、开源的python财经数据接口包

安装

pip install Tushare

依赖pandas,lxml

使用

http://tushare.org/

股票数据分析

 1 import numpy as np
 2 import pandas as pd
 3 import matplotlib.plot as plt
 4 import tushare as ts
 5 ​
 6 df = ts.get_k_data('600660',start='2010')   # 查询福耀玻璃
 7 df.to_csv('福耀玻璃.csv')
 8 df = pd.read_csv('福耀玻璃.csv',index_col='date',parse_dates=['date'])[['open','close','high','low']]
 9 ​
10 # 输出收盘比开盘上涨3%以上的日期
11 df[(df['close']-df['open'])/df['open']] >= 0.03]
12 ​
13 # 输出所有开盘比前日收盘跌幅超过2%的日期
14 (df['open']-df['close'].shift(1))/df['close'].shift(1)<=-0.02
15 ​
16 # 从2019年1月1日开始到2021年,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,收益如何?
17 price_last = df['open'][-1]
18 df = df['2019-01':'2021-12']    # 去除首尾不用的数据
19 df_monthly = df.resample("M").first()
20 df_yearly = df.resample("A").last()
21 cost_money = 0
22 hold = 0
23 for year in range(2019,2022):
24     cost_money += df_monthly[str(year)]['open'].sum()*100
25     hold += len(df_monthly[str(year)])*100
26     if year != 2022:
27         cost_money -= df_yearly[str(year)]['open'][0]*hold
28         hold = 0
29     
30 cost_money -= hold * price_last    
31 printf(-cost)

双均线分析

均线指标:5天和10天短线操作的参照指标

均线指标:30天和60天中期操作的参照指标

均线指标:120天和240天长期操作的参照指标

金叉:短期均线上穿长期均线,买入信号

死叉:短期均线下穿长期均线,卖出信号

 1 import numpy as np
 2 import pandas as pd
 3 import matplotlib.plot as plt
 4 import tushare as ts
 5 '''
 6 看5日均线和30日均线
 7 假如从2019年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天位置,收益率如何?
 8 '''
 9 df = ts.get_k_data('600660',start='2019')   # 查询福耀玻璃
10 df.to_csv('福耀玻璃.csv')
11 df = pd.read_csv('福耀玻璃.csv',index_col='date',parse_dates=['date'])[['open','close','high','low']]
12 ​
13 # 求5日均线和30日均线
14 df['ma5']=df['open'].rolling(5).mean()
15 df['ma30'] = df['open'].rolling(30).mean()
16 df = df.dropna()    # 去有掉空数据的行
17 ​
18 # 画图 
19 df[['close','ma5','ma30']].plot()
20 plt.show()
21 ​
22 # 计算金叉日期和死叉日期
23 sr1 = df['ma5'] < df['ma30']
24 sr2 = df['ma5'] >= df['ma30']
25 # shift(1)向后移一位
26 #sr1:           TTTTTFFFFFTTTTT
27 #sr2.shift(1):   FFFFFTTTTTFFFFF
28 death_cross = df[sr1 & sr2.shift(1)].index
29 gloden_cross = df[~(sr1 | sr2.shift(1))].index
30 ​
31 # 假设从2019年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,求收益率?
32 sr1 = pd.Series(1,index=golden_cross)
33 sr2 = pd.Series(0,index=death_cross)
34 sr = sr1.append(sr2).sort_index()
35 money = 100000
36 hold = 0
37 ​
38 for i in range(0,len(sr)):
39     p = df['open'][sr.index[i]]
40     if ar.iloc[i] == 1:
41         # 金叉买进
42         buy = (money // (100 * p))
43         hold += buy*100
44         money -= buy-100*p
45     else:
46         # 死叉卖出
47         money += hold * p
48         hold = 0
49 ​
50 p = df['open'][-1]        
51 now_money = hold * p + money
52 intrest = now_money - first_money

 

 

上一篇:acwing 1884. COW


下一篇:处理 pandas数据中 批量创建多列并写入excel的 case