lxj0276 / Assignment1

根据20170925-华泰期货-CTA量化策略因子系列(二):动量因子研报进行复现

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

CTA-

根据20170925-华泰期货-CTA量化策略因子系列(二):动量因子研报进行复现 策略实现逻辑(复现在main.py) 策略参照华泰CTA动量因子报告,并参考了作为范例的几个csv文件,选择面板动量进行复现。以过去15天的平均收益率(但这里先使用期货价格/对应的成交量再计算收益率)作为动量因子,instruments选取26只期货,做多动量因子排名前20%的期货(5只)并同时做空排名后20%的期货(5只)。 同时,交易和持仓也采取和研报一样的方法,进行滚动下单。持仓计算:

  1. 以dataframe为数据结构,先获取今日(行)的做空和做多情况,不在名单里的品种(列)对应位置记为0,在做多名单里的对应位置记为1/H,在做空名单里的对应位置记为-1/H,

  2. 初始化各类参数,如每手交易单位数,交易首日持仓情况直接按1中方法决定等。

  3. 先根据今日因子排名初始化今日多空情况,再根据前一日多空(持仓)情况决定今日持仓情况,记今日为i日(对应第i行),前一日为第i-1行,以期货j(对应第j列)为例子分为如下几种情况:

a) 前一日持仓情况为0,则今日持仓 = 初始化的今日持仓情况

b) 前一日持仓情况不为0,初始化今日持仓情况也不为0,即df.iloc[i][j]!=0, df.iloc[i-1][j]!=0,则先判断两者是否同号,如果同号则先取绝对值再进行相加,若相加后<=1,则今日持仓绝对值则为相加后的数,再根据正负号情况乘1或-1;若两者异号,则今日持仓 = 初始化今日持仓

c) 前一日持仓情况不为0,初始化今日持仓情况为0,即df.iloc[i][j]==0, df.iloc[i-1][j]!=0,则还需考虑第i-2行的情况,令第i-2和第i-1日的持仓情况先取绝对值再做差,若差值=0或小于0,则证明昨日不加仓,只要不加仓则今日持仓情况=初始化持仓情况下再平1/H仓位。若差值>0则今日持平昨日持仓。

二.改进想法(文件在main(new_adjclose).py)

Point1由于只采用adj close或许无法准确反映价格情况,因此,新的调整价格为(最高价+最低价+adjclose)/3,以此作为原价格的替代来构造动量因子,但实际效果不佳,夏普比率0.0158,pot为15.3455,

Point2 是并不考虑交易量,直接用价格计算收益率,但效果表现非常差,此处不详述。

Point3 使用每日价格的一阶差分/每日未平仓头寸(OpenInterest)的一阶差分代替当日价格/当日成交量,先计算增长率进而计算其15天滚动均值作为动量因子,得到夏普比率为0.5313,pot为1204.6849

Point4 续Point3,直接使用每日价格一阶差分/每日未平仓头寸的一阶差分计算其15日滚动均值,得到夏普比率为0.32195,pot为319.146,累计持仓收益如下。

pnl(1)等括号内有(1)的以及logreturns是复现得到的数据,其余csv数据如pnl,signal等是格式参考。

About

根据20170925-华泰期货-CTA量化策略因子系列(二):动量因子研报进行复现


Languages

Language:Python 100.0%