1.量价关系概述
“量”有成交量(股数)、成交金额、换手率等多种表现形式,“量”一般指交易市场中某种证券在某一特定时期内的交易数量。成交量体现了市场中多空力量的博弈。
- 成交的股数一般以“手”为单位,一手为100股。
- 成交额则直接体现了交易的资金量。
- 换手率指股票的每日成交量与股票的流通股本比值,主要体现个股的流动性和活跃度。
“价”指证券的交易价格,对股票而言一般指收盘价。
价格的变化与成交量有明显的相关关系。成交量是市场供求的一种表现
- 当市场供不应求时,即市场利好于多方力量时,投资者会纷纷进入市场买入股票,成交量会增加。
- 另一方面,市场处于冷清状态时,股票买方力量薄弱,购买量较少,成交量可能会减少。
一般来说,低成交量会伴随价格的降低,高成交量会伴随价格的上涨。成交量较大且价格上升时,适宜看涨;成交量较小且价格降低时,适宜看跌。
2.量价关系分析
量价关系不仅仅只有量高价涨和量低下跌这两种简单的形式。在上涨的行情中价格上涨有可能对应着成交量的下跌;在下跌行情中,价格下跌反而可能对应着成交量的上涨。
与价格一样,成交量可以有上涨、下跌、持平三种状态。每一个成交量的状态都可以与三种价格变化形态相联系,进而一共有9种对应关系。下边是几中常见的:
2.1 价涨量增
“价涨量增”的指价格与成交量同时增加,或者说价格随成交量的增加而增加。
价涨量增主要出现在上涨行情中,成交量的增加预示着股票价格上升动能的增强,股票价格会继续走高。
在中长期价涨量增关系中,市场的中长期都是上涨行情,股票市场短期的降价回调都是入场的好机会。价涨量增可能在下跌行情底部回升时,出现价涨量增,市场上出现了诸多利好因素,说明股票价格为来处于回升阶段,投资者可以从底部入场,等到价格上涨行情涌现时,获取盈利。
2.2 价涨量平
“价涨量平”表明当价格在持续上涨时,股票的成交量却不再上涨而是保持持平状态。即成交量的变化不大,价格上涨的动能可能不会再增加。价涨量平体现出一种背离关系,量价的背离释放出市场可能反转的信号。
上涨行情中价格持续上涨,成交量保持不变可能预示着价格即将到达顶部。如果成交量继而持平或者减少,价格可能会从顶部反转为下跌态势。
此外,价涨量平的量价背离不一定都是反转情形,也可能是市场处于调整期。市场经过一番洗盘之后。市场经过一番洗盘之后,有可能出现价涨量平情形。还有一种状态是,价格上涨过猛(比如连续多天涨停),投资者对市场一致看好,买盘很多,但卖盘很少,成交量呈现出比较温和的状态,此时成交量失去反映市场动能的意义。价涨量平也体现出市场处于指标修复器。
2.3 价涨量缩
“价涨量缩”也是一种背离关系。市场横盘调整完可能会出现价涨量缩的情形,经过一番调整,一些投资者被洗盘出局,在洗盘过程中,市场参与者逐渐减少。洗盘结束初期行情看好,价格上涨,但获利盘卖盘较少,交易量呈现出收缩情形。
2.4 价平量增
价平量增出现在下跌行情的底部可能反转的情形中。在下跌行情中,价格不再下跌而是持平,但交易量在增大,说明多方力量(庄家)可能进行了低位布局。市场中出现了一些利好信息,买方力量在逐渐增强,多方投资者预测到未来可能出现的上涨趋势,在低位入场推动成交量上涨。此外,在上涨行情中,“价平量增”表明市场出现“高位滞涨”情形,价格处于高位时,价格不再上涨,而成交量却在增加,一种可能是股票市场在更换“庄家”。一般不能把价平量增的形态理解为市场处于中期洗盘调整期,因为洗盘成交量会收缩而不是增加。
2.5 价平量缩
一般出现在新一轮上涨行情初期,价格保持稳定而成交量在减少。当市场进行调整洗盘时,可能会出现“价平量缩”。
2.6 价跌量增
“价跌量增”指成交量增加的情况下,股票价格反而下跌。
一般出现在高位下跌行情初期。投资者不看好市场,卖方力量较大,投资者大量卖出。
另一种可能是下跌末期的市场,做多力量慢慢增强,成交量会增加,但多方力量与空方力量的较量还不至于会抬高股价,价格依旧下跌。
2.7价跌量平
“价跌量平”表示当价格下跌时,成家立保持平稳。价跌量平释放出趋势回稳信号,但还是没办法预测后市介个走势。如果“价跌量平”跟随在“价平量平”后面,则表明已经开始出现下跌行情,成交量不变,股价大幅下滑,投资者要可能要考虑及时出逃。
2.8 价跌量缩
股价下跌的同时成交量也在收缩。
当市场出于盘整期,市场价格下跌,一部分投资者逃离市场,可能会出现该情形。
在单边下跌行情阶段,“价跌量跌”形态体现出市场即将出现止跌的情形,空方力量逐渐耗尽,卖出力量较小,成交量也在减小。
此外,在单边下跌行情中,市场行情不好,买方力量很弱,接盘力量较小,也会出现“价跌量缩”的情形。
3. 成交量与均线思想结合制定交易策略
步骤概述如下:
- 获取成交量数据volume,计算成交量的5日简单移动平均数VolSMA5和10日简单移动平均数VolSMA10,并制定成交量均值VolSMA,
- 获取价格数据,获取5日移动平均和20日简单移动平均数
- 制定交易信号:成交量volume大于成交量均值VolSMA时,释放出买入信号;成交量volume小于等于成交量均值VolSMA时,释放出卖出信号。
- 价格5日均线向上突破20日均线时,释放买入信号;反之,卖出释放信号。
- 合并交易信号。成交量与均线均释放买入时才买入,均释放卖出时执行卖出。
- 交易策略评价。
# 获取数据
import tushare as ts
import pandas as pd
import numpy as np
token = 'Your token' # 输入你的接口密匙,获取方式及相关权限见Tushare官网。这句话不能照抄!
pro = ts.pro_api(token)
def get_data(tscode):
df = pro.daily(ts_code=tscode)
df = df.loc[:, ['trade_date', 'open', 'high', 'low', 'close', 'vol']]
df.rename(
columns={
'trade_date': 'Date', 'open': 'Open',
'high': 'High', 'low': 'Low',
'close': 'Close', 'vol': 'Volume'},
inplace=True) # 重定义列名,方便统一规范操作。
df['Date'] = pd.to_datetime(df['Date']) # 转换日期列的格式,便于作图
df.set_index(['Date'], inplace=True) # 将日期列作为行索引
df = df.sort_index() # 倒序以便作图
return df
df = get_data('002271.SZ') # 东方雨虹为例
# 定义简单移动平均函数
def smaCal(tsPrice, k):
import pandas as pd
Sma = pd.Series(0.0, index=tsPrice.index)
for i in range(k-1, len(tsPrice)):
Sma[i] = sum(tsPrice[(i-k+1):(i+1)])/k
return(Sma)
# 求成交量均值VolSMA
VolSMA5 = smaCal(df.Volume, 5)[9:]
VolSMA10 = smaCal(df.Volume, 10)[9:]
VolSMA = ((VolSMA5+VolSMA10)/2)
# 制定交易信号
VolSignal=(df.Volume[9:] > VolSMA) *1
sma5=smaCal(df.Close,5)[19:]
sma20=smaCal(df.Close,20)[19:]
# 定义向上突破函数
def upbreak(Line,RefLine):
signal = np.all([Line > RefLine,Line.shift(1) < RefLine.shift(1)],axis=0)
return pd.Series(signal[1:],index=Line.index[1:])*1
# 定义向下突破函数
def downbreak(Line,RefLine):
signal = np.all([Line < RefLine,Line.shift(1) > RefLine.shift(1)],axis=0)
return pd.Series(signal[1:],index=Line.index[1:])*1
# 捕捉5日均线向上突破20日均线的日期
UpSMA = upbreak(sma5,sma20)
# 捕捉5日均线向下突破20日均线的日期
DownSMA = downbreak(sma5,sma20)
# 指定均线交叉的买卖信号,并合并买卖信号
SMAsignal = UpSMA - DownSMA
# 对成交量信号与价格均线信号进行加总
signal = VolSignal + SMAsignal
signal = signal.dropna()
trade = signal.replace([2,-2,1,-1,0],[1,-1,0,0,0])
trade = trade.shift(1)[1:]
# 求该策略胜率
ret = ((df.Close-df.Close.shift(1)) / df.Close.shift(1))['2020']
ret.name = 'stockRet'
tradeRet = (trade * ret)['2020']
tradeRet.name = 'tradeRet'
winRate = len(tradeRet[tradeRet>0]) / len(tradeRet[tradeRet != 0])