在原来计算出移动平均数的基础上,增加一些判断条件进行计算并画出对比图。参考如下代码:
#无策略
df['date_rev'] = [0]+[(df.loc[i,'close']-df.loc[i-1,'close'])
for i in range(1, len(df))]
df['ac_rev'] = df['date_rev'].cumsum()
#第一策略
a=[0]
for i in range(1, len(df)):
if df.loc[i-1, 'm10'] < df.loc[i-1, 'm60'] and df.loc[i, 'm10'] > df.loc[i, 'm60']:
n = i
if df.loc[i-1, 'm10'] > df.loc[i-1, 'm60'] and df.loc[i, 'm10'] < df.loc[i, 'm60']:
a.append(df.loc[i, 'close']-df.loc[n, 'close'])
else:
a.append(0)
df['st1_rev']=a
df['ac_st1_rev']=df['st1_rev'].cumsum()
#第二策略
x = [0]
for i in range(1,len(df)):
if df.loc[i-1, 'm10'] < df.loc[i-1, 'm60'] and df.loc[i, 'm10'] > df.loc[i, 'm60'] and abs(df.loc[i,'close']-df.loc[i-1,'close']) >= 20:
n = i
if df.loc[i-1, 'm10'] > df.loc[i-1, 'm60'] and df.loc[i, 'm10'] < df.loc[i, 'm60'] and abs(df.loc[i, 'close']-df.loc[i-1, 'close']) >= 20:
x.append(df.loc[i, 'close']-df.loc[n, 'close'])
else:
x.append(0)
#绘制图
df['st2_rev'] = x
df['ac_st2_rev'] = df['st2_rev'].cumsum()
df.to_csv('hs300_2.csv')
plt.figure(figsize=(12,8))
plt.subplot(1,2,1)
plt.title('strategy1')
plt.plot(df['date'], df['ac_rev'],df['ac_st1_rev'])
plt.legend(['ac_rev','ac_st1_rev'])
plt.subplot(1,2,2)
plt.title('strategy2')
plt.plot(df['date'], df['ac_rev'],df['ac_st2_rev'])
plt.legend(['ac_rev', 'ac_st2_rev'])
plt.show()
朋友看看这里,这是其中一部分,满意的话可以莲戏我
import pandas as pd
import numpy as np
import backtrader as bt
import datetime,time
import tushare as ts
def get_data(ts_code):
#获取沪深300ETF数据
pro = ts.pro_api('your token')
try :
df = pro.fund_daily(ts_code=ts_code)
except :
time.sleep(0.5)
print('获取数据失败')
else :
print('获取数据成功')
#对数据进行处理符合backtrader格式
columns = ['trade_date','open','high','low','close','vol']
df = df[columns]
#转换日期格式
df['trade_date'] = df['trade_date'].apply(lambda x: pd.to_datetime(str(x)))
bt_col_dict = {'vol':'volume','trade_date':'datetime'}
df = df.rename(columns = bt_col_dict)
df = df.set_index('datetime')
#openinterest 默认为0
df['openinterest'] = 0
#由于获取的数据的第一行是最新数据,需要重新排列,否则最新日期的均线数据为空
df=df.sort_index()
return df
df=get_data('510300.SH')