请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

和老师计算的结果完全不同

代码 完全一样,但是计算出结果 完全不同 。。。。居然是亏的
图片描述
图片描述
def ma_strategy(data, short_window=5, long_window=20):
""“
双均线策略
:param data: dataframe, 投资标的行情数据(必须包含收盘价)
:param short_window: 短期n日移动平均线,默认5
:param long_window: 长期n日移动平均线,默认20
:return:
”""
data=pd.DataFrame(data)
# 计算技术指标:ma短期、ma长期
data[‘short_ma’] = data[‘close’].rolling(window=short_window).mean()
data[‘long_ma’] = data[‘close’].rolling(window=long_window).mean()

# 生成信号:金叉买入、死叉卖出
data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0)
data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0)


# 过滤信号:st.compose_signal
data = strat.compose_signal(data)
#
# 计算单次收益
data = strat.calculate_prof_pct(data)

# 计算累计收益
data = strat.calculate_cum_prof(data)
# 数据预览
# print(data[['close', 'short_ma', 'long_ma', 'buy_signal', 'sell_signal']])

# 删除多余的columns
data.drop(labels=['buy_signal', 'sell_signal'], axis=1)
#
return data

if name == ‘main’:
# df = st.get_single_price(‘000001.XSHE’, ‘daily’, ‘2020-01-01’, ‘2021-01-01’)
# df=ma_strategy(df)
# # 筛选有信号点
# df = df[df[‘signal’] != 0]
# # 预览数据
# print(“开仓次数:”, int(len(df)/2))
# print(df)
# # print(df[[‘close’, ‘short_ma’, ‘long_ma’, ‘signal’]])
# print(df[[‘close’, ‘signal’, ‘profit_pct’, ‘cum_profit’]])
# # print(data)

# 股票列表
stocks = ['000001.XSHE', '000858.XSHE', '002594.XSHE']
# 存放累计收益率
cum_profits = pd.DataFrame()
# 循环获取数据
for code in stocks:
    df = st.get_single_price(code, 'daily', '2016-01-01', '2021-01-01')
    df = ma_strategy(df)  # 调用双均线策略
    cum_profits[code] = df['cum_profit'].reset_index(drop=True)  # 存储累计收益率
    # 折线图
    df['cum_profit'].plot(label=code)
    # 筛选有信号点
    # df = df[df['signal'] != 0]
    # 预览数据
    print("开仓次数:", int(len(df)))
    # print(df[['close', 'signal', 'pro   、fit_pct', 'cum_profit']])

# 预览
print(cum_profits)
# 可视化
# cum_profits.plot()
plt.legend()
plt.title('Comparison of Ma Strategy Profits')
plt.show()

正在回答 回答被采纳积分+3

3回答

六维世界 2022-03-03 17:24:48

是因为计算单次收益率的函数有问题, 
 我的也是这样, 修改了就好了

修改前:

data.loc[data[‘signal’] != 0, ‘profit_pct’] = data[‘close’].pct_change()
data = data[data[‘signal’] == -1]

修改后:

data.loc[data[‘signal’] != 0, ‘profit_pct’] = data[data[‘signal’] != 0][‘close’].pct_change()
data = data[data[‘signal’] == -1]

参照这个问答:  https://coding.imooc.com/learn/questiondetail/W48BaYReDGNPALwG.html

0 回复 有任何疑惑可以回复我~
起航阳仔 2022-01-05 18:02:29

我也是一样的图,和你一样,和老师不一样

https://img1.sycdn.imooc.com//szimg/61d56cb309d6f0a011630864.jpg

0 回复 有任何疑惑可以回复我~
DeltaF 2021-07-31 15:35:45

你看一下你开仓平仓的数据是不是对的?

也就是信号是不是对的

差异小的话没有问题,因为有复权价格的原因

0 回复 有任何疑惑可以回复我~
  • 在3.6 -Debug写法中,debug后解决了warning,但其他数据完全就计算出来不一样了。两种写法导致了这里ma_strategy 还有 week_strategy的收益率完全不一样。计算收益率里面应该有bug
    回复 有任何疑惑可以回复我~ 2022-01-04 08:51:44
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信