sma策略升级(回答需要带码)

img


1、简易版SMA策略一旦遇到股价震荡频率较高的股票,收益往往会出现问题,因此做个简单的策略升级。基于简易版,设置股价差20为阈值。当出现金叉且股价差大于20时再做多,当出现死叉且股价差小于20时再做空。分别计算大盘和策略的累积收益,并可视化为折线图,并与简易版作对比,看策略收益存在多大的区别
2、使用动量交易策略分析,分别以自身(本身/2天/6天)的平均return作为position,生成strategy再分别做可视化折线图。

在原来计算出移动平均数的基础上,增加一些判断条件进行计算并画出对比图。参考如下代码:

#无策略
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()

http://t.csdn.cn/Pe4OT

https://blog.csdn.net/DYN100001/article/details/109997265?app_version=5.7.5&code=app_1562916241&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22109997265%22%2C%22source%22%3A%22qq_28935153%22%7D&uLinkId=usr1mkqgl919blen&utm_source=app%EF%BC%8C%E8%BF%99%E7%AF%87%E6%96%87%E7%AB%A0%E5%8F%AF%E4%BB%A5%E7%9C%8B%E7%9C%8B

朋友看看这里,这是其中一部分,满意的话可以莲戏我
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')