目录
针对股票数据的项目分析实战
1.数据预处理
2.调用to_dsv方法把数据保存到本地
3.删除unnamed列
4.找出所有收盘比开盘上涨超过3%的日期
5. 找出所有收盘比开盘跌幅超过2%的日期
6.估计收益
7.计算均线
8.统计金叉和死叉的时期
针对股票数据的项目分析实战
1.数据预处理
首先需要使用pip install tushare安装tushare第三方包, Tushare是一个免费、开源的python财经数据接口包。主要实现对股票等金融数据从数据采集、清洗加工 到 数据存储的过程,能够为金融分析人员提供快速、整洁、和多样的便于分析的数据,为他们在数据获取方面极大地减轻工作量,使他们更加专注于策略和模型的研究与实现上。考虑到Python pandas包在金融量化分析中体现出的优势,Tushare返回的绝大部分的数据格式都是pandas Dataframe类型,非常便于利用pandas/NumPy/Matplotlib进行数据分析和可视化。当然,如果您习惯了用Excel或者关系型数据库做分析,您也可以通过Tushare的数据存储功能,将数据全部保存到本地后进行分析。
tushare网站:Tushare -财经数据接口包
获取一只股票的数据。
import numpy as np import pandas as pd import tushare as ts #获取股票数据 #code 为股票代码 start 为获取数据的开始时间,end为结束时间 df=ts.get_k_data(code='002354',start='2021-12-10',end='2022-01-5') print(df)
2.调用to_dsv方法把数据保存到本地
读取刚刚保存的本地数据
3.删除unnamed列
查看数据相关信息
将data的数据类型改为时间序列
修改日期作为行索引
4.找出所有收盘比开盘上涨超过3%的日期
5. 找出所有收盘比开盘跌幅超过2%的日期
6.估计收益
假如2010年1月1日开始, 每月第一个交易日以开盘价买入该股票,每年最后一个交易日收盘价卖出,到今天为止,ps2022买的卖不出去,收益如何?
7.计算均线
在计算均值时,可以利用rolling函数
8.统计金叉和死叉的时期
完整代码如下:
import numpy as np
import pandas as pd
import tushare as ts
import matplotlib.pyplot as plt
#用以正常显示中文
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#获取股票数据
#code 为股票代码 start 为获取数据的开始时间,end为结束时间
df=ts.get_k_data(code='600519',start='2008-01-01')
#保存数据
df.to_csv('maotai.csv')
#读入刚刚保存的文本数据
df=pd.read_csv('maotai.csv')
# print(df.head(5))
#删除unnameed列
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
# print(df.head(5))
#查看数据相关信息
# print(df.info())
#将date数据改为时间序列
df['date']=pd.to_datetime(df['date'])
# print(df.info())
#将日期修改为行索引
df.set_index('date',inplace=True)
# print(df.head(5))
#找出所有收盘比开盘上涨3%的日期 将布尔值作为行索引 取出true对应的行数据 忽略false对应的行数据
df1=df.loc[(df['close']-df['open'])/df['open']>0.03].index
# print(df1)
#找出所有收盘比开盘跌涨2%的日期 将布尔值作为行索引 取出true对应的行数据 忽略false对应的行数据
df2=df.loc[(df['close']-df['open'])/df['open']<-0.02].index
# print(df2)
#估算收益
df3=df['2010-01':'2021-01']#切片
# print(df3)
#取出每一个月第一个交易日数据
df3_monthly=df3.resample('m').first()
# print(df3_monthly)
#买入的总金额
cost=df3_monthly['open'].sum()*100
#取出每一年最后一个交易日 2022的不卖作切片处理
df3_yearly=df3.resample('A').last()[:-1]
#卖出的总金额
resv=df3_yearly['close'].sum()*1200
money=resv-cost
# print("利润为{}".format(money))
#计算5日均线
# ma5=df['close'].rolling(5).mean()[4:]
# ma30=df['close'].rolling(30).mean()[29:]
#绘制曲线
# plt.plot(ma5,color="r", label="5日均线")
# plt.plot(ma30,color="b", label="30日均线")
# plt.legend(loc='best')
# plt.show()
#输出金叉和死叉的日期
#统一切片
df=df.dropna()
df['ma5']=df['close'].rolling(5).mean()[30:]
df['ma30']=df['close'].rolling(30).mean()[30:]
df=df[30:]
gold_cross=[]
death_cross=[]
# #判别金叉死叉 方法1
# for i in range(len(df)):
# if df['ma5'][i]>df['ma30'][i] and df['ma5'][i-1]df['ma30'][i-1]:
# death_cross.append(df.index[i])
# #保留年月日
# gold_cross = [i.strftime("%Y%m%d") for i in gold_cross]
# death_cross = [i.strftime("%Y%m%d") for i in death_cross]
# print(gold_cross)
# print(death_cross)
#方法2
s1=df['ma5']>df['ma30']
s2=df['ma5']



