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
使用
股票数据分析
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