@Channelchan
2018-01-06T14:09:14.000000Z
字数 3043
阅读 90323
对市场内股票数据进行统计,观察样本变化。
市场宽度指标指某一日收盘时,显示某指数组合的股票的上涨数量与下跌数量的比率,有比较准确预测大盘行情的功能。
from jaqs.data import DataView
from jaqs.data import RemoteDataService
import os
import numpy as np
import talib as ta
import pandas as pd
from datetime import datetime
import matplotlib.pyplot as plt
import warnings
warnings.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)/total
def 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
#MA50
import talib as ta
close = 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 np
hs300 = change_index(dv.data_benchmark)
hs300["trend"] = trend
hs300["participation"] = participation
hs300["leadership"] = leadership
import matplotlib.pyplot as plt
f, 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()