需求:股票的数据分析
具体需求:
- 使用tushare包获取某股票的历史行情数据
- 输出该股票所有收盘比开盘上涨3%以上的日期
- 输出该股票所有开盘比前日收盘跌幅超过2%的日期
- 假如我从2012年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位置我的收益如何
本文所要用到的是tushare财经数据接口包
pip install tushare
第三方库的导入
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
获取青岛啤酒股票的历史行情数据,code是传入字符串形式的股票代码
pro = ts.pro_api('token接口值')
df = pro.daily(ts_code='600600.SH',start_date='2022-02-08')
df.head(5)
接口值可以从tushare官网获得,登录后在个人主页可以找到
将获取到的数据存到本地,方便后面处理数据使用
df.to_csv('./qingdaopijiu.csv')
数据预处理
将trade_date列转化成时间类型,删除意义不大的列,查看是否有空值。
df['trade_date'] = pd.to_datetime(df['trade_date'],format='%Y%m%d')
print(df.isnull().head())
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
#将trace_date列变为行索引
df.set_index('trade_date',inplace=True)
df.sort_index(inplace=True)
print(df.index)
输出该股票所有收盘比开盘上涨3%以上的日期,伪代码: (收盘-开盘) /开盘 > 0.03
A1=(df['open']- df['close']) / df['open'] > 0.03
在分析的过程中产生了bool值 则马上将布尔值转化为行索引,这是一个数据分析的小技巧,如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false的对应的数据。
输出该股票所有开盘比前日收盘跌幅超过2%的日期,伪代码:(开盘收益 - 前日收盘)/ 前日收盘 < -0.02
A2 = (df['open'] - df['close'].shift(1)) / df['close'].shift(1) < -0.02
小案例
假如我从2012年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天位置我的收益如何.
- 需求
- 时间节点是从2012-2022
- 一手:100支股票
- 买
- 每月的第一个交易日买入,一整年需要买入12手
- 卖
- 一个完整的年需要卖出12手
- 买卖股票的单价
- 使用开盘价
new_df = df['2022-01-01':'2023-03']
new_df
买股票:找到每个月第一个交易日对应的行数据,每月第一个交易日的行数据
df_monthly = new_df.resample('M').first()
df_monthly
买入股票花费的总金额
cost = df_monthly['open'].sum()*100
cost
卖出股票的总金额
#特殊情况:2020年买的股票卖不出去
df_yearly = new_df.resample('A').last()
#卖出股票赚到的钱
resv = df_yearly['open'].sum()*1200
#最后手中剩余的股票需要估量其价值计算到总收益中
last_monry = 200*new_df['close'][-1]
#计算总收益
resv + last_monry-cost
使用tushare包获取股票数据后,进行双均线策略制定
df.set_index('trade_date',inplace=True)
需求:
- 计算该支股票历史数据的5日均线和60日均线
- 什么是均线
- 对于每个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫N日移动平均线,一般为5、10、30、60、120、240天为指标
- 5天和10天的短线操作的参照指标,称作日均线指标
- 30天和60天的是中期均线指标,称作季均线指标
- 120天和240天的是长期均线指标,年均线指标
- 对于每个交易日,都可以计算出前N天的移动平均值,然后把这些移动平均值连起来,成为一条线,就叫N日移动平均线,一般为5、10、30、60、120、240天为指标
- 均线计算方法:MA=(c1+c2+c3+…+cn)/N c:某日收盘价 N:移动平均周期
计算三日均线和五日均线
ma5 = df['close'].rolling(5).mean()
ma30 = df['close'].rolling(30).mean()
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(ma5[60:90])
plt.plot(ma30[60:90])
#蓝色ma5为短期均线,黄色ma30为长期均线
- 分析输出所有金叉日期和死叉日期
- 股票分析技术中的金叉和死叉,可以简单解释为:
- 分析指标中的两根线,一根为短时间内的指标线,一根为较长时间的指标线
- 如果短时间的指标线方向拐头向上,并且穿过较长时间的指标线,成为金叉
- 如果短时间的指标线方向拐头向下,并且穿过了较长时间的指标线,叫死叉
- 一般情况下,出现金叉后,操作趋势买入,死叉后趋向卖出
- 股票分析技术中的金叉和死叉,可以简单解释为:
death_ex = s1 & s2.shift(1)#判定死叉条件
df.loc[death_ex]#死叉对应的行数据
death_date = df.loc[death_ex].index
gold_ex = -(s1 | s2.shift(1))#金叉对应的行数据
gold_date = df.loc[gold_ex].index
gold_date
- 假如我从2012年1月1日开始,初始资金为100000,金叉尽量买入,死叉全部卖出,到今天为止,我炒股的收益如何
- 买卖股票的单价为开盘价
- 买卖股票的时机
- 最终剩余的股票没有卖出
- 会有!如果最后一天为金叉,则买入股票。估量剩余股票的价值,计算到总收益中
- 剩余股票的单价用最后一天的收盘价来衡量
- 会有!如果最后一天为金叉,则买入股票。估量剩余股票的价值,计算到总收益中
first_money = 100000#本金,不变
money = first_money #可变的,买股票的钱和卖股票的钱都从该变量进行
hold = 0 #持有股票的数量(股数:100股=1手)
for i in range(0,len(s)):#i表示s的隐式索引
if i == 1:#金叉时间
#基于100000的本金尽可能多的买入股票
#获取股票的单价(金叉时间对应的行数据中的开盘价)
time = s.index[i]#金叉时间
p = df.loc[time]['open']#股票的单价,当天开盘价
hand_count = money // (p*100)#使用100000最多买入多少手
hold = hand_count*100#买了多少支
money -= (hold*p)#将买股票的钱减去
#print(hold)
else:
#将买入的股票卖出去
#找出卖出股票的单价
death_time = s.index[i]#死叉时间
p = df.loc[death_time]['open']
money += p*hold#卖出转的钱
hold = 0
#print(money)
#print(money)
#如何判断最后一天是金叉还是死叉呢
#如果是金叉,则需要将收益算到总收益中
last_money = hold * df['close'][:1]#剩余股票价值
money + last_money - first_money