1、介绍
python
Tushare是一个免费、开源的python财经数据接口包。
安装包:
pip install tushare
2、简单策略app
输出该股票全部收盘比开盘上涨3%以上的日期。输出该股票全部开盘比前日收盘跌幅超过2%的日期。ide
假如我从2010年1月1日开始,每个月第一个交易日买入1手股票,每一年最后一个交易日卖出全部股票,到今天为止,个人收益如何?spa
import tushare as ts df = ts.get_k_data("600519",start="1990-01-01") df.to_csv("600519.csv",index=False) #写入文件中,获得股票历史数据信息 #对股票信息进行策略分析 import numpy as np import pandas as pd df = pd.read_csv("600519.csv",index_col="date",parse_dates=["date"]) #从600519.csv中读取数据,date列做为索引 df[(df["close"]-df["open"])/df["open"] > 0.03 ].index #收盘比开盘上涨3% 的全部日期 df[(df["open"]-df["close"].shift(1)) /df["close"].shift(1) < -0.02].index #df["close"].shift(1) 前一天收盘价 df_monthly=df.resample("M").first() #每个月的第一个交易日,日期看着是最后一天,数据是第一天的 df_yearly=df.resample("A").last() #每一年的最后一个交易日 df_yearly=df_yearly.iloc[:-1,:] #去掉最后一行,由于本年最后还没到,取得是昨天的数据 cost=0 num=0 for year in range(2010,2019): cost += (df_monthly[str(year)]["open"] *100 ).sum() #df_monthly[str(year)]["open"] 每个月的开盘价买进 num= 100 * len(df_monthly[str(year)]["open"]) #每个月买一手,一手是100股 if year !=2018: cost -= df_yearly[str(year)]["open"][0] *num #卖出股票,抵消花费 num = 0 cost -= num *df["close"].iloc[-1] print(-cost) #df.resample("W").mean() #每周的平均值 #df.resample("W").first() #每周的第一天
3、双均线策略排序
均线:对于每个交易日,均可以计算出前N天的移动平均值,而后把这些移动平均值连起来,成为一条线,就叫作N日移动平均线。索引
移动平均线经常使用线有5天、10天、30天、60天、120天和240天的指标。接口
5天和10天的是短线操做的参照指标,称作日均线指标;ip
30天和60天的是中期均线指标,称作季均线指标;get
120天、240天的是长期均线指标,称作年均线指标。pandas
金叉:短时间均线上穿长期均线
死叉:短时间均线下穿长期均线
策略:分析5日均线和30日均线,在金叉把全部钱(开始有100000元)买入股票,死叉抛出全部股票
import numpy as np import pandas as pd import matplotlib.pyplot as plt import tushare as ts df["ma5"]=np.nan df["ma30"]=np.nan # for i in range(4,len(df)): # df.loc[df.index[i],"ma5"] = df["close"][i-4:i+1].mean() # for i in range(29, len(df)): # df.loc[df.index[i], "ma30"] = df["close"][i-29:i + 1].mean() df["ma5"]=df["open"].rolling(5).mean() #5日双均线 df["ma30"]=df["open"].rolling(30).mean() #30日双均线 #处理数据:丢掉nan并取到须要的时间段 df = df.dropna() df = df["2010-01-01":] #取到金叉和死叉的值 golden_cross = [] death_cross = [] # for i in range(1,len(df)): # if df["ma5"][i] >= df["ma30"][i] and df["ma5"][i-1] < df["ma30"][i-1] #5日均线做天小于30日均线,在今天大于等于30日均线 # golden_cross.append(df.index[i].to_pydatetime()) # # if df["ma5"][i] <= df["ma30"][i] and df["ma5"][i - 1] > df["ma30"][i - 1] #5日均线昨天大于30日均线,在今天小于等于30日均线 # death_cross.append(df.index[i].to_pydatetime()) sr1 = df["ma5"] < df["ma30"] sr2 = df["ma5"] >= df["ma30"] death_cross = df[sr1 & sr2.shift(1)].index golden_cross = df[~((sr1) | (sr2.shift(1)))].index #golden_cross = df[((~sr1) & (~sr2.shift(1)))].index #把金叉和死叉合并起来,一个金叉接着一个死叉排序 sr1 = pd.Series(1,index=golden_cross) sr2 = pd.Series(0,index=death_cross) sr= sr1.append(sr2).sort_index() first_money=100000 money= first_money hold=0 #有多少股的股票 for i in range(0,len(sr)): p = df["open"][sr.index[i]] #单股价格 if sr.iloc[i] == 1: #金叉 buy=(money// (100*p)) #能够买多少手股票 hold += buy*100 #股票数 money-= buy*100*p #剩余多少钱 else: money += hold*p #卖出股票 hold = 0 p = df["close"][-1] now_money= hold*p +money print(now_money)