实现需要导入的包:
import tushare as ts
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
注:tushare,财经数据接口包
1.使用tushare包导入某只股票的历史数据
我们不妨以同花顺这只股票为例(300033)
df=ts.get_k_data(code=‘300033’,start=‘2000-01-01’,end=‘-01-21’)
df
其中,code是股票代码,start是开始时间,end是结束时间。如果不知道开始时间,可以设置一个比较早的时间。
运行结果如上,共计2916条数据。
接下来,我们可以把数据存储到文件中去,调用to_xxx将数据写入文件中
df.to_csv(’./300033.csv’)
然后重新导入文件:
df=pd.read_csv(’./300033.csv’)
df
运行后发现:
多了一列,我们可以删除第一列的数据,删除方法常见的两种:
方法一:直接del df[‘column-name’]
方法二:采用drop方法,有下面三种等价的表达式:
1.df= df.drop(‘column_name’, 1)
输入:df,drop(‘num’,axix=1),不改变内存,及输入df的时候,它还是显示原数据;
2.df.drop(‘column_name’,axis=1, inplace=True)
输入:df.drop(‘num’,axix=1,inplace=True),改变内存,及输入df的时候,它显示改变后的数据;
3. df.drop([df.columns[[0,1, 3]]], axis=1,inplace=True)
输入:df.drop([df.columns[[0,1]]],axis=1,inpalce=True)
总结:凡是会对原数组作出修改并返回一个新数组的,往往都有一个 inplace可选参数。如果手动设定为True(默认为False),那么原数组直接就被替换。也就是说,采用inplace=True之后,原数组名(如2和3情况所示)对应的内存值直接改变;而采用inplace=False之后,原数组名对应的内存值并不改变,需要将新的结果赋给一个新的数组或者覆盖原数组的内存位置(如1情况所示)。
通过pandas删除列: 1.del df[‘columns’] #改变原始数据 2.df.drop(‘columns’,axis=1)#删除不改表原始数据,可以通过重新赋值的方式赋值该数据 3.df.drop(‘columns’,axis=1,inplace=‘True’) #改变原始数据
言归正传,我们采用drop函数,这样我们就删除了第一行无用的数据。
df=df.drop(labels=‘Unnamed: 0’,axis=1)#drop中反过来,0表示行,1表示列,inplace=Ture表示将操作赋予到原数据中
df
使用to_datetime将date列转化为时间序列:
df[‘date’]=pd.to_datetime(df[‘date’])
df
便于查看,我们把日期设置为索引序列:
df=df.set_index(‘date’)
df
2.输出收盘比开盘涨超3%的日期
date=df.loc[(df[‘close’]-df[‘open’])/df[‘open’]>0.03]#获取True对应的行数据
date
在分析的过程中如果产生了布尔值,则下一步将布尔值作为源数据的行索引;如果布尔值作为原数据的行索引,则可以取出True对应的值,忽略False对应的值。
接下来,将数据生成存储到文件中去。
date.to_csv(’./300033上涨3%的日期汇总.csv’)
3.输出开盘价比昨日收盘价跌幅超过2%的日期
思考这样一个问题,昨日的收盘价怎么和开盘价放到一列?
我们可以增加一列收盘价,并把收盘价下移一天:
df[‘yesterday_close’]=df[‘close’].shift(1)
df
date=df.loc[(df[‘open’]-df[‘yesterday_close’])/df[‘yesterday_close’]<-0.02]#开盘价比起昨天收盘价跌幅超过2%
date
date.to_csv(’./300033开盘比前日收盘价跌超2%的日期.csv’)
4.假如我从1月1日起,每个月第一个交易日买入十手股票,每年最后一个交易日卖出,那么到昨天,我的收益是多少?
首先我们要知道,一手股票是100股,一年总共买入12000股。
我们首先计算成本价格:
1.取出日期内的数据:
new_df=df[‘-01-01’:‘-01-23’]
new_df
2.找出每月的第一个交易日:
Month_first=new_df.resample(‘M’).first()
3.计算总花费:
cost=Month_first[‘open’].sum()*1000 #花费的总价格
接下来我们计算收益,要注意的股票还没有卖出,需要估价,利用昨天的收盘价进行估价。
Annual_last=new_df.resample(‘A’).last()[:-1]#将最后一行切出去
计算收益:
earn=Annual_last[‘open’].sum()12000+2000new_df[‘close’][-1]
print(earn-cost)
5.绘制五日均线和三十日均线
首先需要理解,什么是均线?
对于每一个交易日,都可以计算前N天的移动平均值,然后把这些移动均值联系起来,成为一条线,叫做N日移动平均线,移动平均线常用有5天,10天,30天,60天,120天,240天的指标。
均线计算方法:MA=(C1+C2+…+Cn)/n
五日均线:
MA5=df[‘close’].rolling(5).mean()
MA30=df[‘close’].rolling(30).mean()
pandas中提供了pandas.DataFrame.rolling这个函数来实现滑动窗口值计算,下面是这个函数的原型:
DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None)
绘图如下:
plt.plot(MA5)
plt.plot(MA30)