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
保持好奇心!

浙公网安备 33010602011771号