以下案例分析全部在jupyternotebook里面完成
股票日期从2010年到2022年2月截至,虽然是2022年8月做的数据分析案例,但是是按所述日期进行分析的
需求股票分析
使用tushare包获取某股票的历史行情数据输出该股票的所有收盘比开盘上涨3%以上日期输出该股票所有开盘比前日收盘跌幅超过2%的日期假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
#tushare财经数据接口
pip install tushare
tushare财经数据接口
获取某只股票的历史行情数据
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存储、读取数据
##将互联网上获取的股票数据存储到本地
df.to_csv("./maotai.csv")###运用to_xxx的方式将df中数据写入到本地进行存储
##将本地存储的数据读入到df
df=pd.read_csv("./maotai.csv")
df.head()
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行
输出该股票所有收盘比开盘上涨3%以上的日期
伪代码:/开盘>0.03
/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)
输出该股票所有开盘比前日收盘跌幅超过2%的日期
伪代码:/前日收盘<-0.02
df["open"]-df["close"].shift)/df["close"].shift<-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
细节跌幅超过2%,则是<-0.02,不是>。因为是跌,不是涨细节列表里是当日收盘价格,如果前日收盘而且需要整个列相减则需要closeprice那一列整体下移,用shift。shift表示整体下移一行,shift表示整体上移一行。细节这个是互联网数据,股票价格随时会发生波动
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)
假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位止,我们的收益如何?
1分析
时间节点:2010-2020一手股票:100只股票买:一个完整的年需要买入1200只股票卖:一个完整年需要卖出1200只股票买卖股票的单价:开盘价
new_df=df["2020-01":"2020-02"]
new_df
2提取数据
1买入股票的金额
##买股票:找每个月第一个交易日对应的行数据(捕捉到开盘价)每月的第一行数据
##根据月份从原始数据中提取指定的数据
##每月第一个交易日所对应的行数据
df_monthly=new_df.resample("M").first()###数据重新取样
df_monthly
##买入股票花费的总金额
cost=df_monthly["open"].sum()*100
cost
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
复习
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() | 按照平吕进行划分并取出第一行数据 |
文章为作者独立观点,不代表股票交易接口观点