了解一些概念:
本期要完成的一些策略目标:
Python实例分析:
1:获取数据,并计算5日均线和60日均线
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
df = pd.read_csv("C:\\Users\\Administrator\\Desktop\\数据挖掘项目\\金融数据量化交易\\601318.csv",
index_col="date", parse_dates=["date"])[['open', 'close', 'high', 'low']]
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() # 求5日均线
#for i in range(29, len(df)):
# df.loc[df.index[i], 'ma30'] = df['close'][i-29:i+1].mean() # 求30日均线
df['ma5'] = df['open'].rolling(5).mean() # 求5日均线
df['ma30'] = df['open'].rolling(30).mean() # 求30日均线
print(df)
2:绘制历史数据的收盘价和两条均线
#df = df[:2000]
df[['close', 'ma5', 'ma30']].plot() # 绘图
plt.show()
3:计算所有的金叉和死叉日期
# 计算所有金叉日期和死叉日期
# df = df.dropna()
# 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])
#
# if df['ma5'][i] < df['ma30'][i] and df['ma5'][i-1] > df['ma30'][i-1]:
# death_cross.append(df.index[i])
#
# print(golden_cross)
# print(death_cross)
sr1 = df['ma5'] < df['ma30'] # # 比较的结果是返回的是布尔值 sr1来接受
sr2 = df['ma5'] > df['ma30']
death_cross = df[sr1 & sr2.shift(1)].index # 死叉日 &:两个为真才为真
print(death_cross)
golden_cross = df[~(sr1 | sr2.shift(1))].index # 金叉日 &:两个为假才为假 比较运算符
print(golden_cross)
4:完成以下策略:
first_money = 100000
money = first_money # 本金
hold = 0 # 持有多少股
sr1 = pd.Series(1, index=golden_cross)
print(sr1)
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]] # p为金叉日或死叉日的开盘价格
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) # 599997.9