[关闭]
@Channelchan 2018-01-06T14:09:14.000000Z 字数 3043 阅读 90323

市场宽度

对市场内股票数据进行统计,观察样本变化。

目录

  1. 什么是市场宽度?
  2. 数据预处理
  3. 市场宽度计算公式
  4. 如何用图形展示市场宽度?

1_什么是市场宽度?

市场宽度指标指某一日收盘时,显示某指数组合的股票的上涨数量与下跌数量的比率,有比较准确预测大盘行情的功能。

怎么计算市场宽度?

B1.png-20.4kB

2_数据预处理

  1. from jaqs.data import DataView
  2. from jaqs.data import RemoteDataService
  3. import os
  4. import numpy as np
  5. import talib as ta
  6. import pandas as pd
  7. from datetime import datetime
  8. import matplotlib.pyplot as plt
  9. import warnings
  10. warnings.filterwarnings("ignore")
  11. dataview_folder = 'JAQS_Data/hs300'
  12. dv = DataView()
  13. dv.load_dataview(dataview_folder)
Dataview loaded successfully.
  1. def change_index(df):
  2. df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))
  3. return df
  1. def formula(positive, negative, total):
  2. return (positive-negative)/total
  3. def sumrows(frame):
  4. return frame.sum(axis=1)
  1. mask = dv.get_ts('index_member')
  1. PN = pd.Panel({'high' : change_index(dv.get_ts('high_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),
  2. 'low' : change_index(dv.get_ts('low_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),
  3. 'close' : change_index(dv.get_ts('close_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),
  4. 'volume' : change_index(dv.get_ts('volume').loc[20150105:])[mask==1].dropna(how='all',axis=1)})
  1. print(PN)
<class 'pandas.core.panel.Panel'>
Dimensions: 436 (items) x 727 (major_axis) x 4 (minor_axis)
Items axis: 000001.SZ to 603993.SH
Major_axis axis: 2015-01-05 00:00:00 to 2017-12-22 00:00:00
Minor_axis axis: close to volume
  1. PN = PN.transpose(2,1,0)

3_市场宽度计算公式

  1. # cpc = close price 相对于前一天的涨跌幅
  2. cpc = PN.minor_xs('close').pct_change()
  3. participation = formula(
  4. sumrows(cpc>0),
  5. sumrows(cpc<0),
  6. 300)
  7. print(participation.tail())
2017-12-18   -0.066667
2017-12-19    0.493333
2017-12-20   -0.296667
2017-12-21    0.233333
2017-12-22   -0.336667
dtype: float64

计算新高新低的量

  1. dh = PN.minor_xs('high').rolling(5).max().pct_change()
  2. dl = PN.minor_xs('low').rolling(5).min().pct_change()
  3. leadership = formula(
  4. sumrows(dh>0),
  5. sumrows(dl<0),
  6. 300
  7. )
  8. print(leadership.tail())
2017-12-18   -0.303333
2017-12-19    0.086667
2017-12-20   -0.126667
2017-12-21   -0.116667
2017-12-22    0.080000
dtype: float64

计算均线上下的量

  1. #MA50
  2. import talib as ta
  3. close = PN.minor_xs('close')
  4. def cal_ma(s, timeperiod=50):
  5. s = s.dropna()
  6. try:
  7. return pd.Series(ta.MA(s.values, timeperiod), s.index)
  8. except:
  9. return pd.Series()
  10. ma = close.apply(cal_ma)
  11. trend = formula(
  12. sumrows(close>ma),
  13. sumrows(close<ma),
  14. 300
  15. )
  16. print(trend.tail())
2017-12-18   -0.436667
2017-12-19   -0.370000
2017-12-20   -0.410000
2017-12-21   -0.356667
2017-12-22   -0.323333
dtype: float64

平滑数据(smooth)

  1. def smooth(series, fast=20, slow=50):
  2. f = ta.MA(series.values, fast)
  3. s = ta.MA(series.values, slow)
  4. return pd.DataFrame({"fast": f, "slow": s}, series.index)
  5. def plot_smooth(ax, smoothed, origin):
  6. ax.set_title(origin.name)
  7. ax.bar(origin.index, origin.values)
  8. ax.plot(smoothed.slow, c='r', label = 'slow')
  9. ax.plot(smoothed.fast, c='g', label = 'fast')
  10. ax.legend()
  11. return ax

4_如何用图形展示市场宽度?

读取数据

  1. import numpy as np
  2. hs300 = change_index(dv.data_benchmark)
  3. hs300["trend"] = trend
  4. hs300["participation"] = participation
  5. hs300["leadership"] = leadership
  1. import matplotlib.pyplot as plt
  2. f, axs = plt.subplots(4, 1, sharex=True, figsize=(15, 15))
  3. axs[0].set_title("hs300")
  4. axs[0].plot(hs300['close'].loc['2015-03-05':])
  5. to_smooth = ["trend", "participation", "leadership"]
  6. for ax, (name, item) in zip(axs[1:], hs300[to_smooth].iteritems()):
  7. plot_smooth(ax, smooth(item), item)
  8. plt.show()

output_23_0.png-119.3kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注