关于均线买股票胜率回测的问题,我们总结了以下几点,给你解答:
均线买股票胜率回测
§ Code
# 导入函数库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import tushare as ts
# 设置token
token = '你的token'
ts.set_token(token)
pro = ts.pro_api()
# 设置起止日期
start_dt = '20100101'
time_temp = datetime.datetime.now() - datetime.timedelta(days=7)
end_dt = time_temp.strftime('%Y%m%d')
# 获取沪深300指数数据
hs300 = pro.index_daily(ts_code='000300.SH', start_date=start_dt, end_date=end_dt)
# 将数据按照交易日期从远到近排序
hs300 = hs300.sort_values(by='trade_date', ascending=False)
# 计算5日均线
hs300['ma5'] = hs300['close'].rolling(5).mean()
# 计算10日均线
hs300['ma10'] = hs300['close'].rolling(10).mean()
# 计算20日均线
hs300['ma20'] = hs300['close'].rolling(20).mean()
# 计算60日均线
hs300['ma60'] = hs300['close'].rolling(60).mean()
# 计算120日均线
hs300['ma120'] = hs300['close'].rolling(120).mean()
# 将指数数据按照交易日期重新排序,由近及远
hs300 = hs300.sort_values(by='trade_date', ascending=True).reset_index(drop=True)
# 初始化持仓
position = 0
# 初始化资金
cash = 100000
# 初始化仓位列表
position_list = []
# 初始化价格列表
price_list = []
# 初始化收益列表
return_list = []
# 初始化收益
return_rate = 1
# 循环每一天的数据
for i in range(len(hs300)):
# 当前价格
current_price = hs300.loc[i, 'close']
# 前一天的价格
previous_price = hs300.loc[i-1, 'close']
# 前一天的5日均线
ma5 = hs300.loc[i-1, 'ma5']
# 前一天的10日均线
ma10 = hs300.loc[i-1, 'ma10']
# 前一天的20日均线
ma20 = hs300.loc[i-1, 'ma20']
# 前一天的60日均线
ma60 = hs300.loc[i-1, 'ma60']
# 前一天的120日均线
ma120 = hs300.loc[i-1, 'ma120']
# 如果持仓为0
if position == 0:
# 如果5日均线大于10日均线,且10日均线大于20日均线,且20日均线大于60日均线,且60日均线大于120日均线
if ma5 > ma10 and ma10 > ma20 and ma20 > ma60 and ma60 > ma120:
# 买入指数
position = cash // current_price
cash = cash - position * current_price
# 记录仓位
position_list.append(position)
# 记录价格
price_list.append(current_price)
# 记录收益
return_list.append(return_rate)
# 否则
else:
# 仓位保持不变
position_list.append(position)
# 记录价格
price_list.append(current_price)
# 记录收益
return_list.append(return_rate)
# 如果持仓不为0
else:
# 如果5日均线小于等于10日均线,或者10日均线小于等于20日均线,或者20日均线小于等于60日均线,或者60日均线小于等于120日均线
if ma5 <= ma10 or ma10 <= ma20 or ma20 <= ma60 or ma60 <= ma120:
# 卖出指数
cash = cash + position * current_price
position = 0
# 记录仓位
position_list.append(position)
# 记录价格
price_list.append(current_price)
# 记录收益
return_list.append(return_rate)
# 否则
else:
# 仓位保持不变
position_list.append(position)
# 记录价格
price_list.append(current_price)
# 记录收益
return_list.append(return_rate)
# 将收益率转换为累计收益
for i in range(len(return_list)):
if i == 0:
return_list[i] = 1
else:
return_list[i] = return_list[i] * return_list[i-1]
# 将数据放入DataFrame
data = pd.DataFrame({'position':position_list, 'price':price_list, 'return':return_list})
# 计算收益率
data['return_rate'] = (data['return'] - 1) * 100
# 绘制收益曲线
plt.figure(figsize=(14,7))
plt.plot(data['return_rate'])
plt.title('HS300 Return Rate')
plt.xlabel('Time')
plt.ylabel('Return Rate')
plt.show()
# 计算胜率
win_rate = len(data[data['return_rate'] > 0]) / len(data)
# 输出胜率
print('胜率为:', win_rate)
§ Output
>
> stdout : ['胜率为: 0.5277777777777778
均线胜率测试
均线是平均股价,如果股价在均线上,表明这段时间的买入平均来说获利了,如果在均线下,表明这段时间的买入平均来说亏损了。所以,当股价涨到均线的位置,恐怕会有解套盘和获利盘出来,就形成了压力。
当股价跌到均线的位置,就会有补仓盘和短线盘进去,就形成了支撑。如果细心分析K线图,会发现股价一般围绕在均线进行波动。其实,这是均线的压力和支撑所产生的效力。同样原理,当均线被跌破将成为压力,当均线被突破将成为支撑。因此,压力位和支撑位,可以在K线图中以均线作为指示。
那么,这么多条均线,究竟以哪一条为准呢? 这就是关于强度的问题,也是与每个人的买卖区间相联系的。以下是判断强度的原则:
1.股价近一段时间所依托的均线,强度最大。例如前段时间大盘是依托20均线运行的,不破均线可一直做多,8月11日确立跌破20均线,开始走熊。
2.长均线比短均线力度强。 例如前段时间也曾有跌落20均线下的情形,但从没有破60均线,现在60均线被破,是中线资金就开始看空的原因。 现在确认中级调整,也是由此而来。
3.上涨均线支撑力度强,下跌均线阻挡力度强。例如现在的5日均线是向下走的,其支撑力就不那么强了,而120均线是向上走的,其支撑力较强;60均线向上走的,其阻力不会很大,但10日均线向下走,压力就强了。一般股价在遇到上涨的均线时要盘整,甚至形成反弹低点。股价在遇到下跌的均线时也要盘整,甚至形成反弹高点。这一点是非常重要的,是我们判断买卖的要诀。就是说,如果股价在均线位盘整时,就是关键时刻,需要做买和卖的判断。没有盘整,均线力度是要打折扣的。
4.多条均线汇集,力度增强。很多的起涨点或者杀跌点,就是发生在均线汇集时。在多条均线汇集处,常常出现大阳或者大阴。
5.不同分时图如出现同一个位置的均线点,基本可以确定其具有较大的作用。在60分钟图某条均线形成支撑位,而30分钟的另一条均线的支撑位恰好一样,15分钟5分钟也是,这样这个支撑点就非常强,甚至有80%机率可获支撑。 这个对于短线操作或者买卖操作很重要,是如何买在最低,卖在最高的要诀。
上述就是通过均线判断压力和支撑的要点内容。最后将一些均线的特点进行归纳:
5日均线:强庄线 。个股沿着5日均线运行,表明庄家正在拉升,不破均线不用担心。
10日均线:短期趋势线
20日均线:中期趋势线
30日均线:庄家生命线 。个股沿着30日均线运行,表明庄家还在。
60日均线:长期趋势线
120日均线:长庄线
250日均线:牛熊分界线
看60日均线