以下案例分析全部在jupyter notebook里面完成
股票日期从到2月截至,虽然是8月做的数据分析案例,但是是按所述日期进行分析的
需求一:股票分析
使用tushare包获取某股票的历史行情数据输出该股票的所有收盘比开盘上涨3%以上日期输出该股票所有开盘比前日收盘跌幅超过2%的日期假如我从1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?#tushare财经数据接口pip install tushare
tushare财经数据接口
1、获取某只股票的历史行情数据
import tushare as tsimport pandas as pdfrom pandas import DataFrame,Seriesimport numpy as np
#字符串形式的历史行情数据#code:字符串形式股票代码df=ts.get_k_data(code="600519",start="2000-01-01")print(df)
1.1存储、读取数据
##将互联网上获取的股票数据存储到本地df.to_csv('./maotai.csv')###运用to_xxx的方式将df中数据写入到本地进行存储##将本地存储的数据读入到dfdf=pd.read_csv('./maotai.csv')df.head()
1.2处理数据
删除某列、查看数据类型、转换成时间序列类型、转换行索引
#需要对读取出来的数据进行相关处理#删除df中指定一列df.drop(labels="Unnamed: 0",axis=1,inplace=True)#查看每一列的数据类型df['date'].dtypedf.info()###将time列由字符串转化成时间序列类型df['date']=pd.to_datetime(df['date'])###将date列作为源数据的行索引df.set_index('date',inplace=True)df.head()###输出前5行
2、输出该股票所有收盘比开盘上涨3%以上的日期
伪代码:(收盘-开盘)/开盘>0.03
(df['open']-df['close'])/df['open']>0.03
###在分析过程中如果产生了boolen值则下一步立刻将布尔值作为源数据的行索引##如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false对应的行数据df.loc[(df['open']-df['close'])/df['open']>0.03].index##获取true对应的行数据(满足需求的行数据)
回顾:df.loc()函数
主要依赖于行列的index字符名,去索引指定行列位置的值。loc[]括号里还可以加条件,如df.loc[df['shield']>6]因为日期就是行数据的行索引,所以在df.loc[判断条件]后面加个.index
DatetimeIndex(['-05-29', '-11-14', '-11-30', '-12-11','-12-14', '-12-18', '-12-29', '-01-09','-01-11', '-01-12',...'-07-26', '-07-27', '-07-29', '-08-17','-08-26', '-10-18', '-12-29', '-01-13','-01-28', '-03-07'],dtype='datetime64[ns]', name='date', length=815, freq=None)
3、输出该股票所有开盘比前日收盘跌幅超过2%的日期
伪代码:(开盘-前日收盘)/前日收盘<-0.02
df['open']-df['close'].shift(1))/df['close'].shift(1)<-0.02
###将date列作为源数据的行索引df.set_index('date',inplace=True)##将布尔值作为源数据的行索引取出TRUE对应的数据df.loc[(df['open']-df['close'].shift(1))/df['close'].shift(1)<-0.02].index
细节1:跌幅超过2%,则是<-0.02,不是>。因为是跌,不是涨细节2:列表里是当日收盘价格,如果前日收盘而且需要整个列相减(这样比较方便)则需要close price那一列整体下移,用shift()。shift(1)表示整体下移一行,shift(-1)表示整体上移一行。细节3:这个是互联网数据,股票价格随时会发生波动
Index(['-04-17', '-04-18', '-04-19', '-04-20', '-05-25','-05-30', '-01-04', '-02-16', '-03-01', '-03-07',...'-03-23', '-10-26', '-02-26', '-03-04', '-04-28','-08-20', '-11-01', '-03-14', '-03-15', '-03-28'],dtype='object', name='date', length=449)
4、假如我从1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
4.1 分析
时间节点:-一手股票:100只股票买:一个完整的年需要买入1200只股票卖:一个完整年需要卖出1200只股票买卖股票的单价:开盘价new_df=df["-01":"-02"]new_df
4.2 提取数据
4.2.1 买入股票的金额
##买股票:找每个月第一个交易日对应的行数据(捕捉到开盘价)每月的第一行数据##根据月份从原始数据中提取指定的数据##每月第一个交易日所对应的行数据df_monthly=new_df.resample('M').first()###数据重新取样df_monthly##买入股票花费的总金额cost=df_monthly['open'].sum()*100cost
4.2.2 卖出股票到手的钱(分两部分)
第一部分:以前,按照每年12月31日的开盘价计算
### 卖出股票到手的钱#特殊情况:买入的股票卖不出去new_df.resample('A').last()##将最后一行切出去df_yearly=new_df.resample('A').last()[:-1]##卖出股票到手的钱resv=df_yearly['open'].sum()*1200resv
第二部分:因为只到2月,收益按照每年的算,所以只能用收盘价算这两个月的
###最后手中剩余股票需要估量其价值计算到总收益中last_money=200*new_df['close'][-1]+resv
5、复习
如果觉得《DataFrame基础操作巩固——股票分析(一)》对你有帮助,请点赞、收藏,并留下你的观点哦!