需求:
1. 输出该股票所有收盘比开盘上涨3%以上的日期
2. 输出该股票所有开盘比前日收盘跌幅超过2%的日期
3. 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股
票,到今天为止,我的收益如何?
数据预处理:
### 获取数据并预处理
import pandas as pd
from pandas import DataFrame, Series
import tushare as ts
import numpy as np
df = ts.get_k_data(code='600519', start='2000-01-01')
df.to_csv('./maotai.csv')
df = pd.read_csv('./maotai.csv')
df.head()
df.drop(labels='Unnamed: 0', axis=1, inplace=True) #去除第一行
df.head()
df['date'] = pd.to_datetime(df['date']) #将日期由字符串转化为时间序列
df.info()
df.set_index('date', inplace=True) #将日期作为行索引
df.head()
得到上述三个需求:
这里采用 bool 值的相关操作。
小技巧:在分析中如果产生了布尔值马上将其作为行所引
需求1:
# 该股票所有收盘比开盘上涨3%以上的日期
# 在分析中如果产生了布尔值马上将其作为行所引!!!
df.loc[(df['close']-df['open'])/df['open']>0.03].index
需求2:
# 输出该股票所有开盘比前日收盘跌幅超过2%的日期
# 用到df.shift()
# df.shift(1) 整体下移一行,没有值的行默认用Nan替代
df.loc[(df['open']-df['close'].shift(1))/df['close'].shift(1)<-0.02].index
需求3:
注意:时间序列可以直接进行切片操作
# 假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
# 时间:2010-2022
# 一手:100支
# 收益 = 每年最后一个交易日收盘价总和*100 - 当年每月第一日开盘价总和*100
new_df = df['2012-01-01':'2022-12-31']
new_df
# 计算买入总共花了多少钱
# 找到【每个月第一个交易日】的开盘价
# 使用数据的重新取样!!!从原始数据中提取指定数据
df_monthly = new_df.resample('M').first() #经过resample()后,索引可能有误,但对应的数据正确
df_monthly
cost = df_monthly['open'].sum()*100 # 买股票花费的总金额
# 卖出的总价
df_yearly = new_df.resample('A').last()
resv = df_yearly['open'].sum()*1200
# 总收益
get = resv-cost