python代码实现技术指标:转债正股的乖离率想老公了
python代码实现技术指标:转债正股的乖离率
乖离率(BIAS)是描述股价与股价的移动平均线的相距的远近程度。BIAS指的是相对距离。
1.BIAS的计算公式及参数。
N⽇乖离率=(当⽇收盘价-N⽇移动平均价)/N⽇移动平均价
式中:分⼦为股价(收盘价)与移动平均价的绝对距离,可正可负,除以分母后,就是相对距离。
移动平均价为1元时相差0.1元,与移动平均价为10元时相差0.1元是很不相同的,所以在⼀定场合要⽤相对距离,不应考虑绝对距离。
BIAS的公式中含有参数的项只有⼀个,即MA。这样,MA的参数就是BIAS的参数,即乖离率的参数就是移动平均价的参数,也就是天数。参数⼤⼩的选择⾸先影响MA,其次影响BIAS。⼀般说来,参数选得越⼤,则允许股价远离MA的程度就越⼤。换句话说,股价远离MA到了⼀定程度,我们就会认为该回头了,⽽这个远离的程度是随着参数的变⼤⽽变⼤的。例如,参数为5时,我们可能认为BIAS到了4%股价就该回头了;⽽参数为10时,我们则必须等到BIAS超过4%,⽐⽅说到了7%才认为股价该回头。
2.BIAS的应⽤法则。
BIAS的原理是离得太远了就该回头,因为股价天⽣就有向⼼的趋向,这主要是由⼈们的⼼理因素造成的。
另外,经济学中价格与需求的关系也是产⽣这种向⼼作⽤的原因。股价低需求就⼤,需求⼀⼤,供不应求,股价就会上升;反之,股价⾼需求就⼩,供过于求,股价就会下降,最后达到平衡,平衡位置就是中⼼。
BIAS的应⽤法则主要是从以下考虑:
从BIAS的取值⼤⼩⽅⾯考虑。这个⽅⾯是产⽣BIAS的最初的想法。找到⼀个正数或负数,只要BIAS⼀超过这个正数,我们就应该感到危险⽽考虑抛出,
只要BIAS低于这个负数,我们就感到机会可能来了⽽考虑买⼊。这样看来问题的关键就成了如何找到这个正数或负数,它是采取⾏动与沉默的分界线。
上⾯的是百度出来的bias的解释。 也看到少数⼈⽤这个指标来根据正股来追踪转债,获得不错的收益率。所以笔者也尝试下该参数的计算。有空再把回测贴上了。
python 代码实现
#计算⽅法:
#bias指标
#N期BIAS=(当⽇收盘价-N期平均收盘价)/N期平均收盘价*100%
df['bias_6'] = (df['clo'] - df['clo'].rolling(6, min_periods=1).mean())/ df['clo'].rolling(6, min_periods=1).mean()*100
df['bias_12'] = (df['clo'] - df['clo'].rolling(12, min_periods=1).mean())/ df['clo'].rolling(12, min_periods=1).mean()*100
df['bias_24'] = (df['clo'] - df['clo'].rolling(24, min_periods=1).mean())/ df['clo'].rolling(24, min_periods=1).mean()*100
df['bias_6'] = round(df['bias_6'], 2)
df['bias_12'] = round(df['bias_12'], 2)
df['bias_24'] = round(df['bias_24'], 2)
芥末黄瓜
核⼼就是上⾯的⼏⾏,压缩下,变成⼀个函数,df为正股的⽇线数据。 N为要计算的N期
def bias(df,N):
label='bias_{}'.format(N)
df[label] = (df['cloPrice'] - df['cloPrice'].rolling(N, min_periods=1).mean())/ df['cloPrice'].rolling(N, min_periods=1).mean()*100
df[label] = df[label].map(lambda x:round(x,2))
return df.iloc[-1][label]
当然,写成map函数也可以,⼀⾏即可。不过这样追求简洁反⽽让看的⼈错过某些细节信息。 python花式炫技要不得。
有了核⼼部分,剩下的边⾓料就⼀步⼀步填就好了。
获取转债对应正股的代码
⽅法1:
集思录和宁稳的数据,数据准确性与更新最快,有过滤强赎公告。 具体操作⽅式见⽂:
集思录:
宁稳:
⽇线数据获取:tushare,但需要积分(¥¥¥¥),过滤出来的数据需要通过时间过滤,因为出来的很多历史数据。 之前共享了⼀个pro 版本的token,也可以直接使⽤,⽆限调⽤。
中学生的英文
⽤这个⽅法本地既可以跑,也可以上QMT实盘,⽤于每天⾃动选债。
三岁宝宝咳嗽⽅法2:
量化平台,优矿、聚宽等。
⽅便,不需要本地安装python环境。不过没法每次做成⾃动化操作,只能每次都要打开⽹页,点⼀下运⾏。⽆法每天⾃动运⾏通知到⾃⼰的微信。
下⾯⽤⽅法2来实现:
获取所有 转债与正股代码
def get_bonds_list(beginDate=u"20170101", endDate=u"20201215",EB_ENABLE=Fal):
df = DataAPI.MktConsBondPremiumGet(SecID=u"",
tickerBond=u"",
beginDate=beginDate,
endDate=endDate,
field=u"",
pandas="1")
cb_df = df.tickerBond.str.startswith(('12', '11'))
df = df[cb_df]
cb_df = df.tickerBond.str.startswith('117')
df = df[~cb_df]
if not EB_ENABLE:
eb = df.cShortNameBond.str.match('\d\d.*?E[123B]') # TODO 判断EB是否过滤
df = df[~eb]
陕西博物院ticker_list = []
remove_duplicated = t()
for _, row in df[['tickerBond', 'cShortNameBond', 'tickerEqu']].iterrows():
if row['tickerBond'] not in remove_duplicated:
ticker_list.append((row['tickerBond'], row['cShortNameBond'], row['tickerEqu']))
remove_duplicated.add(row['tickerBond'])
ticker_list = force_redemption(ticker_list, beginDate)
return ticker_list
start_date = '2022-01-14'
ticker_list=get_bonds_list(start_date,start_date)
开始时间与结束时间同⼀天,start_date='2022-01-14', 因为我们需要计算当前的bias的值,所以我们不取历史强赎的转债数据。
取的正股⽇期,以当前⽇期往前N×2天,⽐如要求N=6的周期,那么就取个6*2=12天的历史⽇线。 实际正常取N+3即可,为了以防节假⽇的时候数据过少导致k线不够。
start_date_dt = datetime.strptime(start_date,'%Y-%m-%d') + timedelta(days=-N*2)
start_date_str = start_date_dt.strftime('%Y-%m-%d')
所以使⽤⼀个正股代码求bias值的代码为:
def get_zg_bias(code):
df=DataAPI.MktEqudAdjGet(cID=u"",ticker=code,tradeDate=u"",beginDate=start_date_str,endDate=u"",isOpen="1",field=u"cloPrice,tradeDate",pand as="1")
return bias(df,N)
批量取所有转债正股的bias只需要⼀个循环:
ticker_list=get_bonds_list(start_date,start_date)
bias_list =[]
N = 6
for bond in ticker_list:
_bias = get_zg_bias(bond[2])
bias_list.append({'zg_name':bond[1],'code':bond[0],'bias':_bias})
滇军把结果转为dataframe
荷花淀原文
bias_df = pd.DataFrame(bias_list)
得到的是6⽇均线的bias值排序,看看结果:
当前bias最⼤的10值。
最⼤的居然是亚药转债的正股,bias值为25.14. 上表中最⼤的在最底下。 接着依次是万孚转债,润达转债的正股。
6⽇均线的bias更多应⽤在短线上,选出来的都是多头均线排列。当然这时更加需要溢价率的配合,结合溢价率,把⾼溢价率的去除。
不然100%的溢价率,即使正股继续涨停,也得要涨100%多才能消化掉这个溢价率。
计算转债溢价率,然后把⾼溢价率的去除,这⾥阈值随意给⼀个,⽐如过滤掉30%
def getBondPremRatio(codelist):
最美的情诗
return
DataAPI.MktConsBondPerfGet(beginDate=start_date,endDate=start_date,cID=u"",tickerBond=codelist,tickerEqu=u"",field=u"tickerBond,bondPremRati o",pandas="1")
溢价率与bias合并
join_df = pd.merge(bias_df,bondPremRatio_list,left_on='code',right_on='tickerBond',how='inner')过滤溢价率⼤于30%的,bias值最⼤的10值
join_df[join_df['bondPremRatio']<30].sort_values('bias',ascending=Fal).head(10)
然后正股下降趋势的是bias值倒数10名:
随便找⼀只对应的正股看看,⼩康股份