@Channelchan
2018-01-06T06:09:14.000000Z
字数 3043
阅读 90541
对市场内股票数据进行统计,观察样本变化。
市场宽度指标指某一日收盘时,显示某指数组合的股票的上涨数量与下跌数量的比率,有比较准确预测大盘行情的功能。

from jaqs.data import DataViewfrom jaqs.data import RemoteDataServiceimport osimport numpy as npimport talib as taimport pandas as pdfrom datetime import datetimeimport matplotlib.pyplot as pltimport warningswarnings.filterwarnings("ignore")dataview_folder = 'JAQS_Data/hs300'dv = DataView()dv.load_dataview(dataview_folder)
Dataview loaded successfully.
def change_index(df):df.index = pd.Index(map(lambda x: datetime.strptime(str(x),"%Y%m%d") , df.index))return df
def formula(positive, negative, total):return (positive-negative)/totaldef sumrows(frame):return frame.sum(axis=1)
mask = dv.get_ts('index_member')
PN = pd.Panel({'high' : change_index(dv.get_ts('high_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),'low' : change_index(dv.get_ts('low_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),'close' : change_index(dv.get_ts('close_adj').loc[20150105:][mask==1].dropna(how='all',axis=1)),'volume' : change_index(dv.get_ts('volume').loc[20150105:])[mask==1].dropna(how='all',axis=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
PN = PN.transpose(2,1,0)
# cpc = close price 相对于前一天的涨跌幅cpc = PN.minor_xs('close').pct_change()participation = formula(sumrows(cpc>0),sumrows(cpc<0),300)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
dh = PN.minor_xs('high').rolling(5).max().pct_change()dl = PN.minor_xs('low').rolling(5).min().pct_change()leadership = formula(sumrows(dh>0),sumrows(dl<0),300)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
#MA50import talib as taclose = PN.minor_xs('close')def cal_ma(s, timeperiod=50):s = s.dropna()try:return pd.Series(ta.MA(s.values, timeperiod), s.index)except:return pd.Series()ma = close.apply(cal_ma)trend = formula(sumrows(close>ma),sumrows(close<ma),300)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
def smooth(series, fast=20, slow=50):f = ta.MA(series.values, fast)s = ta.MA(series.values, slow)return pd.DataFrame({"fast": f, "slow": s}, series.index)def plot_smooth(ax, smoothed, origin):ax.set_title(origin.name)ax.bar(origin.index, origin.values)ax.plot(smoothed.slow, c='r', label = 'slow')ax.plot(smoothed.fast, c='g', label = 'fast')ax.legend()return ax
import numpy as nphs300 = change_index(dv.data_benchmark)hs300["trend"] = trendhs300["participation"] = participationhs300["leadership"] = leadership
import matplotlib.pyplot as pltf, axs = plt.subplots(4, 1, sharex=True, figsize=(15, 15))axs[0].set_title("hs300")axs[0].plot(hs300['close'].loc['2015-03-05':])to_smooth = ["trend", "participation", "leadership"]for ax, (name, item) in zip(axs[1:], hs300[to_smooth].iteritems()):plot_smooth(ax, smooth(item), item)plt.show()

