python金融量化分析学习

#双均线分析 针对茅台股票
#1、使用tushare包获取历史行情数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts

df = ts.get_k_data("600519",start="1999-01-01")
df.to_csv("600519.csv")

df = pd.read_csv("600519.csv",index_col= "date",parse_dates=["date"])[['open','close','high','low']]
df

#2、使用pandas包计算该股票历史的5日均线和30日均线
df['ma5'] = np.nan
df['ma30'] = np.nan

#5日均线方法一
for i in range(4,len(df)):
    df.loc[df.index[i],"ma5"] = df['close'][i-4:i+1].mean() 
df

#5日均线方法二
df['ma5'] = df['open'].rolling(5).mean()
df

#30日均线方法一
for i in range(29,len(df)):
    df.loc[df.index[i],"ma30"] = df['close'][i-29:i+1].mean() #30日均线
    
df

#30日均线方法二
df['ma30'] = df['open'].rolling(30).mean()
df


#3、使用matplotlib包可视化历史数据的收盘价和两条均线
df = df[:100] #前100条数据
df[['close','ma5','ma30']].plot()
plt.show()

#4、分析输出所有金叉日期和死叉日期
#方法一
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]:
        golden_cross.append(df.index[i].to_pydatetime())
    if df['ma5'][i] <= df['ma30'][i] and  df['ma5'][i-1] > df['ma30'][i-1]:
        death_cross.append(df.index[i].to_pydatetime())

#方法二 
df = df.dropna()
df = df['2010-01-01':]
golden_cross = []
death_cross  = []
sr1 = df['ma5'] < df['ma30']
sr2 = df['ma5'] >= df['ma30']
death_cross = df[sr1  & sr2.shift(1)].index     #死叉
death_cross
golden_cross = df[~(sr1 | sr2.shift(1))].index	#金叉



#假如从2010年1月1日开始,初始资金为十万,金叉尽量买入,死叉全部卖出,则到今天为止,炒股收益如何?
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts

df = ts.get_k_data("600519",start="1999-01-01")
df.to_csv("600519.csv")

df = pd.read_csv("600519.csv",index_col= "date",parse_dates=["date"])[['open','close','high','low']]

df['ma5'] = np.nan
df['ma30'] = np.nan

df['ma5'] = df['open'].rolling(5).mean()
df['ma30'] = df['open'].rolling(30).mean()

df = df.dropna()
df = df['2010-01-01':]
golden_cross = []
death_cross  = []
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

first_money = 100000
money = first_money
hold = 0 #持有多少股
sr1 = pd.Series(1,index=golden_cross)
sr2 = pd.Series(0,index=death_cross)
sr = sr1.append(sr2).sort_index()
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['open'][-1]
now_money = hold * p + money
print(now_money - first_money)

#结果为930470.2999999999
posted @ 2020-06-17 15:26  Akmf's_blog  阅读(184)  评论(0)    收藏  举报