1. 程式人生 > >tushare做量化投資分析

tushare做量化投資分析

spa mat 均值 每年 close 指標 計算 () nbsp

一、介紹

Tushare是一個免費、開源的python財經數據接口包。

安裝包:

pip install tushare


二、簡單策略

輸出該股票所有收盤比開盤上漲3%以上的日期。輸出該股票所有開盤比前日收盤跌幅超過2%的日期。

假如我從2010年1月1日開始,每月第一個交易日買入1手股票,每年最後一個交易日賣出所有股票,到今天為止,我的收益如何?

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()                             #每周的第一天

三、雙均線策略

均線:對於每一個交易日,都可以計算出前N天的移動平均值,然後把這些移動平均值連起來,成為一條線,就叫做N日移動平均線。

移動平均線常用線有5天、10天、30天、60天、120天和240天的指標。

5天和10天的是短線操作的參照指標,稱做日均線指標;

30天和60天的是中期均線指標,稱做季均線指標;

120天、240天的是長期均線指標,稱做年均線指標。

金叉:短期均線上穿長期均線

死叉:短期均線下穿長期均線


策略:分析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)





tushare做量化投資分析