以下案例分析全部在jupyter notebook里面完成
股票日期从2010年到2022年2月截至,虽然是2022年8月做的数据分析案例,但是是按所述日期进行分析的
需求一:股票分析
- 使用tushare包获取某股票的历史行情数据
- 输出该股票的所有收盘比开盘上涨3%以上日期
- 输出该股票所有开盘比前日收盘跌幅超过2%的日期
- 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
#tushare财经数据接口
pip install tushare
1、获取某只股票的历史行情数据
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import 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中数据写入到本地进行存储
##将本地存储的数据读入到df
df=pd.read_csv('./maotai.csv')
df.head()
1.2处理数据
删除某列、查看数据类型、转换成时间序列类型、转换行索引
#需要对读取出来的数据进行相关处理
#删除df中指定一列
df.drop(labels="Unnamed: 0",axis=1,inplace=True)
#查看每一列的数据类型
df['date'].dtype
df.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(['2006-05-29', '2006-11-14', '2006-11-30', '2006-12-11', '2006-12-14', '2006-12-18', '2006-12-29', '2007-01-09', '2007-01-11', '2007-01-12', ... '2021-07-26', '2021-07-27', '2021-07-29', '2021-08-17', '2021-08-26', '2021-10-18', '2021-12-29', '2022-01-13', '2022-01-28', '2022-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(['2006-04-17', '2006-04-18', '2006-04-19', '2006-04-20', '2006-05-25', '2006-05-30', '2007-01-04', '2007-02-16', '2007-03-01', '2007-03-07', ... '2020-03-23', '2020-10-26', '2021-02-26', '2021-03-04', '2021-04-28', '2021-08-20', '2021-11-01', '2022-03-14', '2022-03-15', '2022-03-28'], dtype='object', name='date', length=449)
4、假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
4.1 分析
- 时间节点:2010-2020
- 一手股票:100只股票
- 买:一个完整的年需要买入1200只股票
- 卖:一个完整年需要卖出1200只股票
- 买卖股票的单价:开盘价
new_df=df["2020-01":"2020-02"]
new_df
4.2 提取数据
4.2.1 买入股票的金额
##买股票:找每个月第一个交易日对应的行数据(捕捉到开盘价)每月的第一行数据
##根据月份从原始数据中提取指定的数据
##每月第一个交易日所对应的行数据
df_monthly=new_df.resample('M').first()###数据重新取样
df_monthly
##买入股票花费的总金额
cost=df_monthly['open'].sum()*100
cost
4.2.2 卖出股票到手的钱(分两部分)
第一部分:2020年以前,按照每年12月31日的开盘价计算
### 卖出股票到手的钱
#特殊情况:2020年买入的股票卖不出去
new_df.resample('A').last()
##将2020年最后一行切出去
df_yearly=new_df.resample('A').last()[:-1]
##卖出股票到手的钱
resv=df_yearly['open'].sum()*1200
resv
第二部分:2020年因为只到2月,收益按照每年的算,所以只能用收盘价算这两个月的
###最后手中剩余股票需要估量其价值计算到总收益中
last_money=200*new_df['close'][-1]+resv
5、复习
df.to_csv | 运用to_xxx的方式将df中数据写入到本地进行存储 |
df.drop(labels="Unnamed: 0",axis=1,inplace=True) | 删除df中之指定一列 |
df.set_index('date',inplace=True) | 将date作为元数据的行索引 |
df.loc[(df['open']-df['close'])/df['open']>0.03] | 将布尔值作为df的行索引,取出判断段条件的行数据 |
df.set_index('date',inplace=True) | 将date作为列数据的行索引 |
new_df.resample('M').first() | 按照平吕进行划分并取出第一行数据 |