python-入门数分案例
Catalog:Click to jump to the corresponding position
目录:
=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=.=
需求:
1.使用tushare包获取某股票的历史行情数据
2.输出该股票所有收盘比开盘上涨3%以上的日期
3.输出该股票所有开盘比前日收盘跌幅超过2%的日期。
4.假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到2019年为止,我的收益如何?
import tushare as ts import pandas as pd #获取某只股票的历史行情数据 df = ts.get_k_data(code='600703',start='2000-01-01') #code:字符串形式的股票代码 df.head() #显示前5行数据
#将互联网上获取的股票数据存储到本地 df.to_csv('F:\pycharm\data\sagd.csv')#调用to_xxx方法将df中的数据写入到本地进行存储 df = pd.read_csv('F:\pycharm\data\sagd.csv') #将指定的csv读到df中 df.head() #显示前5行数据
#需要对读取出来的数据进行相关的处理 #删除df中指定的一列 df.drop(labels='Unnamed: 0',axis=1,inplace=True) #drop例的axis和其他地方相反,这里的axis=1,表示列,0表示行 df.head()
#查看每一列的数据类型 df.info()
#将date列转为时间序列类型 df['date'] = pd.to_datetime(df['date']) df.info()
#将date列作为源数据的行索引 df.set_index('date',inplace=True) df.head() #显示前五行
#输出该股票所有收盘比开盘上涨3%以上的日期 (df['open'] - df['close']) / df['open'] > 0.03 #返回的是布尔值 #经验分享:在分析的过程中如果产生了布尔值则下一步马上将布尔值作为源数据的行索引 #如果布尔值作为df的行索引,则可以取出true对应的行数据,忽略false对应的行数据 df.loc[(df['open'] - df['close']) / df['open'] > 0.03] #获取了True对应的行数据(满足需求的行数据) df.loc[(df['open'] - df['close']) / df['open'] > 0.03].index #返回为True的df行数据
#输出该股票所有开盘比前日收盘跌幅超过2%的日期 (df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.02 #shift()表示将整列移动N个单位,正数为向下,负数为向上 #将布尔值作为源数据的行索引取出True对应的行数据 df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.01] df.loc[(df['open'] - df['close'].shift(1))/df['close'].shift(1) < -0.01].index #显示日期
假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到2019年为止,我的收益如何?
时间节点:2010-2019
一手股票:100支股票
买:一个完整的年需要买入1200支股票
卖:一个完整的年需要卖出1200支股票
买卖股票的单价:开盘价
new_df = df['2010-01':'2019-01'] #只有行索引为日期格式时才可以这么切列 new_df.head()
#买股票:找每个月的第一个交易日对应的行数据(捕获到开盘价)==》每月的第一行数据 #根据月份从原始数据中提取指定的数据 #每月第一个交易日对应的行数据 df_monthly = new_df.resample('M').first()#数据的重新取样 df_monthly.head()
#买入股票花费的总金额 cost = df_monthly['open'].sum()*100 cost
#卖出股票时对应的价格 df_yearly = new_df.resample('A').last() df_yearly
#卖出股票到手的钱 resv = df_yearly['open'].sum()*1200 resv
#计算总收益 resv-cost
需求:
df = pd.read_csv('F:\pycharm\data\sagd.csv').drop(labels='Unnamed: 0',axis=1) df.head()
#将date列转为时间序列且将其作为源数据的行索引 df['date'] = pd.to_datetime(df['date']) df.set_index('date',inplace=True) df.head()
#计算该股票历史数据的5日均线和30日均线 ma5 = df['close'].rolling(5).mean() ma30 = df['close'].rolling(30).mean() ma5.head(10) #显示前10行
#将空值切掉 ma5 = ma5[30:] ma30 = ma30[30:] df = df[30:] #将df与ma对应起来 #定义一下金叉死叉 s1 = ma5 < ma30 s2 = ma5 > ma30
death_ex = s1 & s2.shift(1) #判定死叉的条件 df.loc[death_ex] #死叉对应的行数据 death_date = df.loc[death_ex].index death_date
golden_ex = ~(s1 | s2.shift(1))#判定金叉的条件 golden_date = df.loc[golden_ex].index #金叉的时间 golden_date
如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
分析:
买卖股票的单价使用开盘价
买卖股票的时机
最终手里会有剩余的股票没有卖出去:
会有。如果最后一天为金叉,则买入股票。估量剩余股票的价值计算到总收益
剩余股票的单价就是用最后一天的收盘价
from pandas import Series 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.head()
s = s['2010':'2020'] #将数据切成10年--19年 数据存储的是金叉和死叉对应的时间 s.head()
first_monry = 100000 #本金,不变 money = first_monry #可变的,买股票话的钱和卖股票收入的钱都从该变量中进行操作 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 #如何判定最后一天为金叉还是死叉 last_monry = hold * df['close'][-1] #剩余股票的价值 #总收益 money + last_monry - first_monry
双均线策略最终收益31万+