关注我们
QRcode 邮件联系 新浪微博
首页 > 配资网 » 正文

[配资门户]简易的转债策略测试框架——以及python实现方法

   条点评
后台-系统设置-扩展变量-手机广告位-内容正文顶部



简易的转债战略测验结构——以及python完结办法

股票配资

战略好不好,测了才知道——但关于转债来说,或许没那么简略。尽管转债现已根本离别当年迷你商场的困境,但依然是一个小商场,这是咱们在年度回忆陈述中的一个判别——而顺便的一个影响是,许多配套的东西还不齐备,比方战略测验的代码结构。幸亏开源的理念之下,这些工作自行处理也并不太杂乱。咱们在此介绍一个简略的测验结构及其Python完结办法。

首要仍是看大的结构,然后再一步一步完结细化完结。大体的流程应该包含:

1、初始化界说:测验的时刻段、考虑的转债的规模、调仓周期、以及终究的回来值——战略的净值和必要的记载;

2、进入测验循环:核算净值、并在调仓的时点上进行调仓;

3、回来成果。此刻的Python代码如下:

#引进三个有必要引证的库

importdatetimeasdt

importpandasaspd

importnumpyasnp

defframeStrategy:

'''

这儿的参数还不彻底,为了简略先只留最简略的两个

obj是咱们自己设定的一个class,进行日常的转债数据保护和核算,不过此刻投资者不必过分介意,由于后边咱们将只用其作为数据库的功用obj.DB

例如obj.DB将回来一个记载转债成交额的pd.DataFrame,index是yyyy/mm/dd型的日期,columns是各转债的代码

'''

#设定开始日期在库中的方位

#这个getStartLoc将在后边介绍,后边还有许多这类函数

intStart=getStartLoc

#dfRet是终究要回来的表,'NAV'这一列便是最重要的了:战略净值

dfRet=pd.DataFrame

#这个表记载了持仓,index是转债代码,初始先设定成

dfAssetBook=pd.DataFrame

#需求一个变量来记载持仓中的现金

cash=100.0

#设定转债代码规模

codes=defineCodes

#一个调仓的日期列表,这儿设定的是每21个买卖日调仓一次

isAdjustDate=roundOfAdjust

#进入循环,enumerate是python里边一个很好用的迭代函数

fori,dateinenumerate:

#这一步来记载净值改动

checkBook

#断定当日是否需求调仓

ifdateinisAdjustDate:

#假如需求调仓,进入selectCodes函数,依据战略挑选个券

sel=selectCodes

ifsel:

#这一步得到权重变量

w=getWeight

else:

sel=

w=0.0

dfAssetBook=pd.DataFrame

dfAssetBook=100.0

dfAssetBook=w

#无论如何,都用dfRet来记载当日持仓的个券和权重

#join函数十分有用,用来衔接字符串

dfRet=','.join)

#是十分具有python特征的一个处理办法

dfRet=','.join])

returndfRet

下面来逐一击破中心的小函数。首要是getStartLoc,实际上pd.DataFrame的index有一个get_loc的办法也能得到这个成果,但前期的版别没考虑过万一要找的变量不在index中怎么办。而后来的版别中,尽管给予了必定容忍度,但也根本没考虑过当index自身是不可比变量时的处理。所以此刻咱们要进行简略的改造,如下:

defgetStartLoc:

#假如get_loc能处理,就交给它吧

ifdateinobj.DB.index:

i=obj.DB.index.get_loc

else:

#假如处理不了,要先把index转化成datetime型,而非本来的字符型,这样get_loc就能万用了

fakeIndex=obj.DB.index.map

i=fakeIndex.get_loc,method='ffill')

returni

接下来是界说个券大致规模的defineCodes:一般要除掉因股改而退市的那些转债,有时候咱们也期望除掉EB。投资者也能够设定其他的规矩,这就需求用到一个python特性:函数能够作为参数传入另一个函数。这样的话,投资者能够自行编写一个函数,作为界说规模的办法。完结如下:

defdefineCodes:

ifmethod=='default':

returnobj._excludeSpecial

elifmethod=='nonEB':

returnobj._excludeSpecial

elifhasatrr:#这一句是判别method是不是一个函数,假如是,则调用这个函数

returnmethod

#_excludeSpecial是咱们的obj中的办法,如下:

def_excludeSpecial:

columns=set)

#这个cb_data.lstSpecial里边存了那些因股改而退市的转债的代码

columns-=set

columns=list

#假如不要EB,进入下面的程序

ifnothasEB:

forcodeincolumns:

ifcode=='132'orcode=='120':

columns.remove

returncolumns

下面是择券的代码,也是对战略决议含义最大的函数。在调仓日期会调用这个函数。相同,为了给予投资者外部接口,这儿也要保存传入函数的或许性。如下:

defselectCodes:

i=getStartLoc

n=min

#这儿使用一下pandas.DataFrame的逻辑运算做最根本的条件设定:前5个买卖日有必要有最少10万的买卖

#且存量不低于3000万

condition=.min>100000.0)&\

##假如selMethod不为空

IfselMethod:

tempCodes=list

moreCon=selMethod

condition&=moreCon

#这个函数最终回来的变量是这个

retCodes=list

#假如一个都没有,进入这儿,并给出提示

ifnotretCodes:

print'itsaemptyselection,whendate:',date

returnretCodes

#下面以贱价战略举例,假如咱们期望在调仓时买入一切价格低于均价的种类,则能够写下面这个函数,并把_lowprice作为selMethod传入上面的函数:

def_lowPrice:

avgPrice=obj.DB.loc.mean

returnobj.DB.loc<=avgPrice

然后是转债初始权重的设定函数:咱们能够预设几个常用的,比方等权、市值加权。投资者也能够自行设定,天然这也要依靠于传入一个函数参数,不过在加权这个上面,往往不必太多费精力:

defgetWeight:

ifmethod=='average':

#等权战略

#这儿要依靠一下numpy中的ones了

ret=pd.Series)/float),index=codes)

returnret

elifmethod=='fakeEv':

#按发行额加权,即假市值。中证转债指数相似这种

srsIssue=get_issueamount

srsFakeEv=obj.DB.loc*srsIssue

returnsrsFakeEv/srsFakeEv.sum

elifmethod=='Ev':

#市值加权

srsOutstanding=obj.DB.loc

srsEv=obj.DB.loc*srsOutstanding

returnsrsEv/srsEv.sum

elifelifhasatrr:

returnmethod

调仓周期函数:比较简略,不过这儿咱们只留了两种方式,一种是每日调仓,另一种是每隔固定买卖日调仓一次。完结如下:

defroundOfAdjust:

i=getStartLoc

ifmethod=='daily':

returnobj.DB.index

elifisinstance:#这儿有一个值得注意,验证数据类型,不要用type==...,而是instance

#便是每隔n个数取一次了

returnobj.DB.index

最终是checkBook:也便是关于账簿的每日处理函数。这个内容比较简略,值得注意的是:1、这个函数没有任何回来值,但dfRet、dfAssetBook甚至cash都会被它改动,这是python的一个特性,能够多加使用;2、cash的含义是在于仓位不满或许超越100%时,记载现金的本钱或许收益

defcheckBook:

ifdate==dfRet.index:

dfRet.loc=100

else:

i=dfRet.index.get_loc;j=obj.DB.index.get_loc

iflen==1anddfAssetBook.index=='Nothing':

dfRet.iloc<i>=dfRet.iloc*

cash*=1+cashRate/252.0

else:

codes=list

srsPct=obj.DB.iloc.pct_change.iloc+1.0

cashW=1-dfAssetBook.sum

t1=.sum+cash*cashW*

t0=.sum+cash*cashW

dfRet.iloc<i>=dfRet.iloc*t1/t0

cash*=1+cashRate

最终的最终,是对主函数frameStrategy的批改——由于输入参数绝不止obj和开始时刻start。结合上面几个小函数的评论,至少这几个参数是能够留给投资者自设的:1、defineCodes中的method,用来调整择券规模;2、selectCode中的method,用来调整中心战略;3、getWeight中的method,用来调整加权办法;4、调仓周期的参数。因而,这个函数的def行应该是这样的:

defframeStrategy

投资者不只能够用来测验战略,自界说指数也能够比较轻易地核算,而不必再依靠卖方供给的数据了——并且相关于他人的数据,投资者会更清楚地了解自己编写的指数。比方上面的事例能够作为贱价种类等权指数,稍作改动就能够变成高价指数。再如,将下面的函数作为selMethod传入结构,能够得到低溢价率种类指数:

def_lowPrem:

avgPrem=obj.DB.loc.mean

returnobj.DB.loc&lt;=avgPrem

上面说到的这几个指数如下图:

后台-系统设置-扩展变量-手机广告位-内容正文底部
[和讯鑫东财配资]002318股票
返回列表

已有条评论,欢迎点评!