需求:股票分析
1、使用tushare包获取某股票的历史行情数据
2、输出该股票所有收盘比开盘上涨3%以上的日期
3、输出该股票所有开盘比前日收盘跌超过2%的日期
4、假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
1、使用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')
#将互联网上获取的股票数据存储到本地
df.to_csv('./maotai.csv')
#将本地存储的数据读入到df
df = pd.read_csv('./maotai.csv')
需要对读取出来的数据进行相关的处理
#删除df中指定的一列
df.drop(labels='Unnamed: 0',axis=1,inplace=True)
#查看每一列的数据类型
df.info()
#将time列转化为时间序列类型
df['date'] = pd.to_datetime(df['date'])
#将date列作为源数据的行索引
df.set_index('date',inplace=True)
2、输出该股票所有收盘比开盘上涨3%以上的日期
#伪代码:(收盘-开票)/开盘>0.03
(df['close']-df['open'])/df['open'] > 0.03
#在分析的过程中如果产生了布尔值则下一步马上将布尔值作为源数据的行索引
#如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false对应的行数据
df.loc[(df['close']-df['open'])/df['open'] > 0.03] #获取了true对应的行数据(满足需求的行数据)
df.loc[(df['close']-df['open'])/df['open'] > 0.03].index#df的行数据
3、输出该股票所有开盘比前日收盘跌超过2%的日期
#伪代码:(开盘-前日收盘)/前日收盘 < -0.02
#df['close'].shift(1)#将对应的数据向下降一格
(df['open']-df['close'].shift(1))/df['close'].shift(1) < -0.02
df.loc[(df['open']-df['close'].shift(1))/df['close'].shift(1) < -0.02]
df.loc[(df['open']-df['close'].shift(1))/df['close'].shift(1) < -0.02].index
4、假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
- 分析:
- 时间节点:2010-2021
- 一手股票:100支股票
- 买:
- 一个完整的年需要买入1200支股票
- 卖:
- 一个完整的年需要卖出1200支股票
- 买卖股票的单价:
- 使用开盘价
new_df = df['2010-01':'2021-11']
#买股票:找到每个月的第一个交易日对应的行数据(捕获到开盘价)==每月的第一行数据
#根据月份从原始数据中提取指定的数据
df_monthly = new_df.resample('M').first()#数据的重新取样'M'是月(数据没有问题,索引有问题)
#买入股票花费的总金额
cost = df_monthly['open'].sum()*100
#卖出股票到手的钱
#特殊情况:2021年买入的股票卖不出去
new_df.resample('A').last()#'A'是年
#将2021年就是最后一行切出去
df_yearly = new_df.resample('A').last()[:-1]
#卖出股票到手的钱
resv = df_yearly['open'].sum()*1200
#最后手中剩余的股票需要估值其价值计算到总收益中
#使用昨天的收盘价作为剩余股票的单价
last_money = 1100*new_df['close'][-1]
#计算总收益
resv+last_money-cost
需求:双均线策略制定
- 使用tushare包获取某股票的历史行情数据
计算该股票历史数据的5日均线和30日均线
- 什么是均线?
- 对于每一个交易日,都可以计算出前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()
分析输出所有金叉日期和死叉日期
- 股票分析技术中的金叉和死叉,可以简单解释为:
- 分析指标中的两根线,一根为短时间内的指标线,另一根为较长时间的指标线
- 如果短时间的指标线方向拐头向上,并且穿过了较长的时间指标线,这种状态叫“金叉”;
- 如果短时间的指标线方向拐头向下,并且穿过了较长的时间指标线,这种状态叫“死叉”;
- 一般情况下,出现金叉后,操作趋向买入;死叉则趋向卖出当然,金叉和死叉只是分析指标之一,要和其他很多的指标配合使用,才能增加操作的准确性
ma5 =ma5[30:]
ma30 =ma30[30:]
s1 = ma5 < ma30
s2 = ma5 > ma30
df = df[30:]
death_ex = s1 & s2.shift(1)#判定死叉的条件
df.loc[death_ex]#死叉对应的行数据
death_date = df.loc[death_ex].index
golden_ex = -(s1 | s2.shift(1))#判定金叉的条件
golden_date = df.loc[golden_ex].index#金叉的时间
案例
- 假如我从2010年一月一日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益如何?
- 分析
- 买卖股票的单价使用开盘价
- 买卖股票的时机
- 最终手里会有剩余的股票没有卖出去
- 会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益。
- 剩余股票的单价就是用最后一天的收盘价
- 会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益。
s1 = Series(data=1,index=golden_date) #1作为金叉的标识
s2 = Series(data=0,index=death_date) #0作为死叉的标识
s = s1.append(s2)
s = s.sort_index() #存储的是金叉和死叉对应的时间
s = s['2010':'2021']
first_money = 100000#本金
money = first_money#可变的,买股票花的钱和卖股票收入的前都从该变量中进行操作
hold = 0 #持有股票的数量(股数:100股=1手)
for i in range(0,len(s)):#i表示的s这个Series中的隐式索引
#i=0(死叉:卖)=1(金叉:买)
if s[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)#将买股票花的钱从money中减去
else:
#将买入的股票卖出去
#找出卖出股票的单价
death_time = s.index[i]
p_death = df.loc[death_time]['open']#卖股票的单价
money += (p_death * hold)#卖出的股票收入假如到money
hold = 0
money
#如何判定最后一天为金叉还是死叉
last_money = hold * df['close'][-1]#剩余股票的价值
#总收益
money + last_money - first_money