均线粘合度选股

均线系统是技术分析中最基础的指标,也是最重要的指标。大道至简,要达到这个“简”,离不开前期的“繁”。正如著名数学家华罗庚所说:一本书先由薄到厚,再由厚到薄,才算是真正掌握。

移动平均系统有时会向上发散。 有两个特点:一是均线大多向上延伸,尤其是中长期; 第二,均线系统之间的距离比较长(如何定义距离是关键)。移动平均系统有时会向下发散。 其特点是:一是均线大多向下延伸,特别是中长期均线; 其次,均线系统之间的距离较长。另外,均线有时会交错在一起,排列顺序似乎乱了。 这种情况根据距离又分为两种类型,一种是疏远型,顶部均线与底部均线距离比较远;另一种是疏远型,顶部均线与底部均线距离比较远; 它是紧密型的,顶部移动平均线和底部移动平均线之间的距离非常近,因此视觉上所有移动平均线似乎都挤在一起,紧紧地或紧密地粘在一起。

上述是对均线系统的一个简单的观察,从量化角度是需要严格定义均线系统距离的远近,虽然给出一个定义是一件很容易的事情,但这个定义要满足对一个股票价格时间纵向上能够比较,并且对同一个时点不同股票之间的横向之间能够比较,却不是一件容易的事情,这也是此定义研究最关键的地方。

那为什么不同股票之间需要比较呢?

因为有助于选出市场中最强的股票,或者选出市场中最弱的股票,也能选出市场中最震荡的股票。

那该如何定义均线系统的疏密呢?这个问题不像看上去那么简单。

首先,对于一个均线系统MAs={MA1,MA2,…,MAn},在一个时间点上,要度量其疏密程度,也就是度量均线系统在这个时间点上的“垂直宽度”,怎样度量才算是一个合适的垂直宽度?假定我们用这个时间点上MAs的最大值和最小值在定义的话,一个最直接的垂直宽度定义为:

D = max{MAs } – min{MAs}

这个定义显然存在问题,最大的问题就是不同股票价格之间无法进行横向比较,因为有的股票价格可能是个位数,有的股票价格可能是两位数,也有的是千元价格的股票,像贵州茅台,也有类似于香港市场的仙股,如此一来,D作为均线疏密程度指标就没有任何比较意义,千元价格股票的均线系统再亲密,可想而知D也是一个不小的值,而个位价格的股票,D相比较而言会比较小。所以,基于最大值最小值绝对差的定义选股时,无法对不同股票之间进行横向比较。

改进的垂直宽度,可以考虑定义为:

D = max{MAs }/ min{MAs} – 1

这个改进定义用均线系统中的最小值到最大值的涨幅来刻画垂直宽度,很好地克服了绝对价格自身绝对值带来的影响。但仔细想想发现还是存在一定的问题,不同价格序列的波动性存在差异化,譬如原油的波动性很大,黄金的波动性较小,十年期国债的波动性更小,如果用涨幅D来描述均线系统的疏密度,不同价格的横向比较基本上有失客观,不存在合理的可比性。举个例子,10年期国债T1612,后半段的均线系统从图中可以看出是非常稀疏的,但是均线系统的D距离在2%以内,2%在股票价格里面属于非常亲密的均线系统了。

下面是选取中国长城“000066”2023年4月6好到2023年8月2号的历史日数据进行回测。通过python的requests爬取得到数据。

import requests as rq
import xlwt
#获取数据
url = r'https://q.stock.sohu.com/hisHq?code=cn_000066&stat=1&order=D&period=d&callback=historySearchHandler&rt=jsonp&0.2987396445827468'
response = rq.get(url)
response.encoding = 'utf-8'

然后在录入excel表格

s = eval(response.text[21:-2])
p = list(s)

workbook = xlwt.Workbook(encoding="utf-8")
worksheet = workbook.add_sheet("sheet1", cell_overwrite_ok=True)
for num,i in enumerate(p[0]['hq']):
    worksheet.write(num, 0, i[0])
    worksheet.write(num, 1, i[1])
    worksheet.write(num, 2, i[2])
    worksheet.write(num, 3, i[5])
    worksheet.write(num, 4, i[6])

workbook.save(r"D:\\迅雷云盘\\股票.xls")

接下来就是重头戏了!!!

使用pandas导出数据:

import matplotlib.dates as mdates

stock_data = pd.read_excel(r'D:\\迅雷云盘\\股票.xls')

数据如下:

利用爬取的数据做k线图,并画出5日均线,10日均线,20日均线:

import matplotlib.dates as mdates

stock_data = pd.read_excel(r'D:\\迅雷云盘\\股票.xls')
date = pd.to_datetime(stock_data['date'], format='%Y-%m-%d')

stock_data.insert(5,'m20','')
stock_data.insert(6,'m10','')
stock_data.insert(7,'m5','')
stock_data.insert(8,'num','')
close = stock_data['close']
opens = stock_data['open']
hight = stock_data['hight']
low = stock_data['low']


for i in range(0,len(close)-20):
    day_20 = close[i:i+20]
    mean = day_20.mean()
    stock_data.loc[i,'m20'] = round(mean,2)
for i in range(0,len(close)-10):
    day_10 = close[i:i+10]
    mean = day_10.mean()
    stock_data.loc[i,'m10'] = round(mean,2)
for i in range(0,len(close)-5):
    day_5 = close[i:i+5]
    mean = day_5.mean()
    stock_data.loc[i,'m5'] = round(mean,2)

m5 = stock_data['m5']
m10 = stock_data['m10']
m20 = stock_data['m20']
k = close - opens
standads = ['red' if i>0 else 'green'  for i in k]
ecolor = ['red' if i>0 else 'green'  for i in k]
ax = mp.gca()
ax.xaxis.set_minor_locator(mdates.DayLocator())
mp.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
mp.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
mp.plot(date[:60],opens[:60],color = 'k',linestyle = '--',alpha = 0.8,label = r'$k line$')
mp.plot(date[:60],m5[:60],label = r'$ma5$')
mp.plot(date[:60],m10[:60],label = r'$ma10$')
mp.plot(date[:60],m20[:60],label = r'$ma20$')

mp.bar(date[:60],k[:60],0.8,opens[:60],color = standads,edgecolor = ecolor,alpha = 0.8,zorder = 3)
mp.vlines(date[:60],low[:60],hight[:60],color = ecolor)
mp.grid(linestyle = ':')

 然后计算均线粘合度:

max_values = [max(values) for values in zip(list1, list2, list3)]
min_values = [min(values) for values in zip(list1, list2, list3)]

moving_average_adhesion = [(max_values[i]/min_values[i])-1 for i in range(len(min_values))]
removing_average_adhesion = [round(num,3) for num in moving_average_adhesion]

for num,i in enumerate(removing_average_adhesion):
    stock_data.loc[num, 'num'] = i

mins = min(removing_average_adhesion)
mins_id = removing_average_adhesion.index(mins)
deal_index = []
for i, num in enumerate(removing_average_adhesion):
    if num <=0.02:
        deal_index.append(i)

然后用列表的形式输出每日的均线粘合为:

最后在k线图上显示可交易的点。

由图可以看出,在均线粘合度低于2%时,对于交易的买入与卖出的有明显的效果。有了此均线粘合度的定义,可以研究每一个日线级别的上涨,是在一个什么样的均线粘合度环境下涨起来的,均线粘合度对其上涨的延伸程度有什么样的影响?从经验观察发现,一个日线级别上涨如果在一个均线粘合度很大的环境里,对应着均线向下发散,那么其上涨幅度不会太乐观,因为上升阻力重重,反之,如果上涨过程中含有一个均线粘合度很小的值,这个日线级别会有爆发行情。可以具体研究一下,在实际统计中是一种什么样的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值