位置:编程技术网 > 编程语言 > 正文 >

【中金固收·可转债】简易的转债策略测试框架——以及python实现方法 20190519

2019年05月20日 14:15来源:未知手机版

2018年春晚

来源:中金固定收益研究

作者

杨? 冰分析员,SAC执业证书编号:?S0080515120002

房? 铎联系人,SAC执业证书编号:?S0080117080049

姬江帆分析员,SAC执业证书编号:S0080511030008;SFC?CE?Ref:?BDF391

策略好不好,测了才知道 —— 但对于转债来说,可能没那么容易。虽然转债已经基本告别当年迷你市场的窘境,但依然是一个小市场,这是我们在年度回顾报告中的一个判断 —— 而附带的一个影响是,很多配套的东西还不完备,比如策略测试的代码框架。幸好开源的理念之下,这些事情自行处理也并不太复杂。我们在此介绍一个简单的测试框架及其Python实现方法。

首先还是看大的框架,然后再一步一步完成细化实现。大体的流程应该包括:

1、初始化定义:测试的时间段、考虑的转债的范围(比如含不含EB、含不含那些因股改而退市的品种)、调仓周期、以及最终的返回值——策略的净值和必要的记录;

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

3、返回结果。此时的Python代码如下:


# 引入三个必须引用的库

import datetime?as dt

import pandas as pd

import numpy?as np

?

def frameStrategy(obj, start='2015/12/31'):

? ?'''

? ?这里的参数还不完全,为了简单先只留最简单的两个

? ?obj是我们自己设定的一个class,进行日常的转债数据维护和计算,不过此时投资者不必太过在意,因为后面我们将只用其作为数据库的功能obj.DB

? ?例如?obj.DB['Amt']将返回一个记录转债成交额的pd.DataFrame,index是yyyy/mm/dd型的日期,columns是各转债的代码

? ?'''

???

??? # 设定起始日期在库中的位置(我们的数据从2002年开始,这里要返回一个整数,记录start在其中的位置,比如2015/12/31对应的是3391)

??? # 这个getStartLoc将在后面介绍,后面还有很多这类函数

??? intStart = getStartLoc(obj, start)

???

??? # dfRet是最终要返回的表,'NAV'这一列就是最重要的了:策略净值(我们这里是100为起点)

??? dfRet = pd.DataFrame(index=obj.DB['Amt'].index[intStart:],columns=['NAV','LOG:SEL','LOG:WEIGHT'])

???

??? # 这个表记录了持仓,index是转债代码,初始先设定成[Nothing]

??? dfAssetBook = pd.DataFrame(index=['Nothing'],columns=['costPrice', 'w'])

???

??? # 需要一个变量来记录持仓中的现金(或者借款)

??? cash = 100.0

?

??? # 设定转债代码范围

??? codes = defineCodes(obj, defineMethod)

???

??? # 一个调仓的日期列表,这里设定的是每21个交易日调仓一次

??? isAdjustDate =?roundOfAdjust(obj, start, 21)

?

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

??? for i,date in?enumerate(dfRet.index):

???????

??????? # 这一步来记录净值变化

??????? checkBook(obj, dfRet, dfAssetBook, cash,date)

??????? # 判定当日是否需要调仓

??????? if?date in?isAdjustDate:

??????????? # 如果需要调仓,进入selectCodes函数,根据策略选择个券

??????????? sel = selectCodes(obj, codes, date, selMethod)

??????????? if?sel:

??????????????? # 这一步得到权重变量

??????????????? w =?getWeight(obj, sel, date, weightMethod)

??????????? else:

??????????????? sel = ['Nothing']

??????????????? w = 0.0

???????????????

??????????? dfAssetBook = pd.DataFrame(index=sel, columns=['costPrice', 'w'])

本文地址:http://www.reviewcode.cn/bianchengyuyan/48959.html 转载请注明出处!

今日热点资讯