DataFrame基础操作巩固——股票分析(一)

以下案例分析全部在jupyter notebook里面完成

 股票日期从2010年到2022年2月截至,虽然是2022年8月做的数据分析案例,但是是按所述日期进行分析的

需求一:股票分析

  1. 使用tushare包获取某股票的历史行情数据
  2. 输出该股票的所有收盘比开盘上涨3%以上日期
  3. 输出该股票所有开盘比前日收盘跌幅超过2%的日期
  4. 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
#tushare财经数据接口
pip install tushare

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()按照平吕进行划分并取出第一行数据

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值