4、DataFrame基础操作巩固-股票分析
需求:股票分析
- 使用tushare包获取某股票的历史行情数据。
- 输出该股票所有收盘比开盘上涨3%以上的日期。
- 输出该股票所有开盘比前日收盘跌幅超过2%的日期。
- 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如 何?
(1)下载tushare财经数据接口包
终端命令行执行:
pip install tushare
(2)进入官网https://tushare.pro/
注册登录后,进入个人主页,找到接口TOKEN,进行复制,我们在下面将会用到。
image.png(2)导入相关包
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
import datetime as dt
import time
token='自己的上面复制的token'
ts.set_token(token)
pro = ts.pro_api()
(3)调用接口获取股票的信息
注:更多接口方法可以在http://tushare.org/ 进行查看
获取茅台的 每日股价信息
df = pro.daily(ts_code = '600519.SH',start_date='20000101')
df
image.png
(4)对股票信息按照时间进行排序
# 排序
# DataFrame.sort_values(by, axis=0, ascending=True, inplace=False, kind='quicksort', na_position='last')
# axis:{0 or ‘index’, 1 or ‘columns’}, default 0,默认按照索引排序,即纵向排序,如果为1,则是横向排序
# by:str or list of str;如果axis=0,那么by="列名";如果axis=1,那么by="行名";
# ascending:布尔型,True则升序,可以是[True,False],即第一字段升序,第二个降序
# inplace:布尔型,是否用排序后的数据框替换现有的数据框
# kind:排序方法,{‘quicksort’, ‘mergesort’, ‘heapsort’}, default ‘quicksort’。似乎不用太关心
# na_position : {‘first’, ‘last’}, default ‘last’,默认缺失值排在最后面
df.sort_values(axis = 0, by = 'trade_date',inplace=True)
df
image.png
(5) 将获取的股票信息存储到本地
# 通过调用 to_xxx 方法将数据存储到本地
df.to_csv('./motai.csv')
(6)将本地存储的文件读入到df
df = pd.read_csv('./motai.csv')
df.head()
image.png
(7)需要得读取出来的数据进行处理
# drop 中 axis 为1表示删除列,为0表示删除行,inplace 为 True 表示覆盖原有数据
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
df.head()
image.png
(8)查看每一列的数据类型
df.info()
image.png
(9)将trade_date转为时间类型
#将int类型转为时间类型
df['trade_date'] = pd.to_datetime(df['trade_date'],format='%Y%m%d')
df.info()
image.png
(10)设置trade_date列为索引
df.set_index('trade_date',inplace=True)
df
image.png
(11)输出该股票所有收盘比开盘上涨3%以上的日期。
#伪代码:(收盘 - 开盘) / 开盘 > 0.03
(df['open'] - df['close']) / df['open'] > 0.03
#在分析的过程中,如果产生了boolean值,可以将boolean作为行索引,可以取出值为True的行数据
df.loc[(df['open'] - df['close']) / df['open'] > 0.03].index #获取到收盘比开盘上涨3%以上的日期
image.png
(12)输出该股票所有开盘比前日收盘跌幅超过2%的日期。
# 伪代码:(开盘 - 前日收盘) / 前日开盘 < 0.02
old = df['close'].shift(1) #将收盘价整体下移一位
old.head()
image.png
(13)找到开盘价低于上一天收盘价2%以上的日期
(df['open'] - old) / old < -0.02
image.png
(14)将布尔值作为行索引
df.loc[(df['open'] - old) / old < -0.02].index #获取到符合条件的日期
image.png
(15)剩余需求
- 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如 何?
- 分析
- 时间节点:2010-2021年
- 一手股票:100支
- 买:
- 一个完整的年需要买入1200支股票
- 一个完整的年需要卖出1200支股票
- 买卖股票的单价:
- 都使用开盘价
(16)截取df,从日期2010年1月,截取到2021年12月
# 对行索引进去切片
new_df = df['2010-01':'2021-12']
new_df
image.png
(17)买股票:找到每个月的第一个交易日(捕获到开盘价) --> 每个月的第一行数据。
# 根据月份从原始数据中提取指定的值
# 每个月的第一个交易日行数据
# resample('M') 把数据按照月份进去切割
df_monthly = new_df.resample('M').first() #数据是没有错的,索引有问题,不影响使用
df_monthly
image.png
(18)买入股票花费的总金额
cost = df_monthly['open'].sum()*100
cost
image.png
(19)卖出股票挣到的钱
注:特殊情况:2021年买入的股票没有卖出去
# resample('A')按照年份进行切割
new_df.resample('A').last()
# 将2021年最后一行切出去
df_yearly = new_df.resample('A').last()[:-1]
df_yearly
image.png
(20)卖出股票到手的钱
resv = df_yearly['open'].sum()*1200
resv
image.png
(21) 计算出最后一年有几个月:
len(df.loc['2021-01-01':].resample('M').last())
image.png
(22)最后在手中剩余的股票价值加到总收益中
#使用昨天的收盘价作为剩余股票的单价
last_monry = len(df.loc['2021-01-01':].resample('M').last()) * 100 * new_df['close'][-1]
last_monry
image.png
(23)计算总收益
resv + last_monry - cost
image.png
总结:假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益为846587元,收益还是很不错的。
网友评论