Tushare是一个免费提供各类金融数据 , 助力智能投资与创新型投资的平台。在这个平台上可以免费获得股票、期货和外汇的各种数据。(Tushare ID:492265)
本次我就使用Tushare来获取股票数据,模拟股票交易。
完善好个人资料可以获得20积分,加上注册送的100积分,可以用股票的行情数据,对于练手来说,够用了。如果你是学生的话,还可以进行学生认证,所有接口数据都可以使用。
点击接口TOKEN(复制自己的TOKEN,之后介绍TOKEN如何使用,注意:这个TOKEN是你自己的,不要外传)
安装tushare包
pip install tushare
导入需要的包
import tushare as ts
import pandas as pd
from pandas import DataFrame,Series
import numpy as np
pro = ts.pro_api('你的TOKEN') #填入,上面第三步获取到的TOKEN
df = pro.daily(ts_code='600519.SH',start_date='20000101',fields='trade_date,open,high,low,close,pre_close')
获取到的股票历史行情数据,此处以茅台为例,股票代码为:600519.SH,可以根据自己需求换别的。
#将trade_date设置为行索引
df['trade_date'] = pd.to_datetime(df['trade_date'])
df.set_index('trade_date',inplace=True)
#输出该股票所有收盘比开盘上涨3%以上的日期
#(收盘-开盘)/开盘 > 0.03
df.loc[(df['close'] - df['open']) / df['open'] > 0.03].index
#输出该股票所有开盘比前日收盘跌幅超过2%的日期
#(开盘-前日收盘)/前日收盘 < -0.02
df.loc[(df['open'] - df['pre_close']) / df['pre_close'] < -0.02].index
#假如我从2010年1月1日开始,每月第一个交易日买入1手股票,每年最后一个交易日卖出所有股票,到今天为止,我的收益如何?
#每月第一个交易日对应的行数据
df_month = df.resample('M').first()
#买入股票花费的总金额
cost = df_monthly['open'].sum()*100
#卖出股票到手的钱,2022年的卖不出去,剔除掉
df_year = df.resample('A').last()[:-1]
resv = df_year['open'].sum()*1200
#最后手中剩余的股票需要估量其价值计算到总收益中
last_monry = 100*df['close'][0]
#计算总收益
resv+last_monry-cost
继续使用上面获取到的茅台数据进行操作
df = df[::-1] #将数据按时间正序排列
df
ma5 = df['close'].rolling(5).mean() #5日均线
ma30 = df['close'].rolling(30).mean() #30日均线
将5日均线与30日均线画出来
import matplotlib.pyplot as plt
%matplotlib inline
plt.plot(ma5[30::])
plt.plot(ma30[30::])
#展示其中一部分
plt.plot(ma5[100:500])
plt.plot(ma30[100:500])
#让ma5,ma30保持一样长
ma5 = ma5[30:]
ma30 = ma30[30:]
df = df[30:]
s1 = ma5 < ma30
s2 = ma5 > ma30
death_ex = s1 & s2.shift(1) #判定死叉的条件
death_date = df.loc[death_ex].index #死叉的时间
golden_ex = ~(s1 | s2.shift(1))#判定金叉的条件
golden_date = df.loc[golden_ex].index #金叉的时间
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
如果我从假如我从2010年1月1日开始,初始资金为100000元,金叉尽量买入,死叉全部卖出,则到今天为止,我的炒股收益率如何?
first_monry = 100000 #本金
money = first_monry #口袋有的现金
hold = 0 #持有股票的数量(股数:100股=1手)
for i in range(len(s)):
time = s.index[i]
p = df.loc[time]['open'] #当前时刻股票的单价
if s[i] == 1:#金叉的时间
hand_count = money // (p*100) #尽可能多的买入股票
hold = hand_count * 100
money -= (hold * p) #将买股票话的钱从money中减去
else: #死叉,卖掉全部股票
money += (p_death * hold) #卖出的股票收入加入到money
hold = 0
last_monry = hold * df['close'][-1] #将手里现有的所有股票按最近一天的收盘价换算
#总收益
money + last_monry - first_monry