怎么做多空对冲
脚本2
- read_coin
- 选币
- 单币涨跌幅计算单币资金曲线
- 单币资金曲线均值得到周期总体资金曲线
- 周期总体资金曲线得到周期总体涨跌幅
- 周期总体涨跌幅计算得到总体资金曲线
脚本2怎么实现多空对冲的
- 首先读取factors和periods中的文件,然后read_coin得到结果
- strategy里面的cal_factor的作用是将所有的因子排名加权得到一个新的因子,这个就是多因子的做法。其中因子权重为factor_list里面的因子的最后一个元素,这里涉及到strategy里面的两个变量long_factor 和short_factor,如果其值为factors则表示,做复合因子
- backtest_df为得到的复合因子
- before_filter如果没有条件,则df_long 和df_short得到的就是df的copy
- select_long_and_short_coin进行的是多空选币,这里需要注意:多空分别采用了什么因子,这里出现了long_factor和short_factor做为多空因子,但实际上这两个值都为factors,我怀疑这里做的多空是十分组,第一组多,第n组空
- 如果想做多因子多空,需要改代码
- select_long_and_short
如果是多空不同的单因子
- Strategy.calc_factor得到的是和read_coin相同的back_test_df
- 只需要修改strategy里面的long_factor和short_factor为想要的因子
任务
将PSY因子多头资金曲线和其他资金曲线组成对冲的多空资金曲线
多空资金曲线可以观察什么时期PSY因子有超额,什么时期没有,超额稳定不稳定
其他的资金曲线包括:BN现货全市场在资金曲线、流动性多头资金曲线、反转策略多头资金曲线、BTC资金曲线
这里用到的办法是涨跌幅 = (a - b)/ 2
- 全市场资金曲线怎么算
- byclose是干嘛的
- 注意到merge_df这里前面几行都为0,需要搞清楚为什么,以及怎么修改
- 在得到factors和periods之后,如何计算资金曲线
- spot的意思是同时买spot和swap,swap是只买swap,这个说法对不对
ret_next
periods的文件如图:
df[‘ret_next’] = df[‘下个周期_avg_price’] / df[‘avg_price’] - 1
其中avg_price是一小时的avg_price在12h的区间里去第一个值
这里的ret_next是下个周期价格的涨跌幅
计算资金曲线的流程
- read_coin读数据,得到12h的开高收低 涨跌幅以及因子值
这里的因子 涨跌幅怎么从1h到12h
avg_price是从1h到12h取first
df[‘ret_next’] = df[‘下个周期_avg_price’] / df[‘avg_price’] - 1
这里可能存在问题,avg_price从1h到12h需要做mean
因子值怎么得到???????
- 然后通过因子排名得到多空选币的币
- 每个时间点,知道下个周期选中的每个币的下周期涨跌幅,分别计算资金曲线,然后mean得到总体资金曲线,然后回推得到总体涨跌幅
- 这样就能得到每个周期的涨跌幅
- 计算的到资金曲线
怎么计算新涨跌幅
- 在上面得到每个周期涨跌幅之后
- (a - b) / 2得到新的涨跌幅度
怎么计算全市场涨跌幅
- 12h的周期上,知道每个币的资金曲线
- 求均值得到所有币的资金曲线
- 然后求涨跌幅
- 这个涨跌幅是12h内每小时的涨跌幅
怎么算多空对冲
- 在计算出来12h周期的每小时涨跌幅之后
- 将这个值放到equity中
怎么放到equity中的
- 然后对equity的每小时涨跌幅做 (a - b) / 2
- 作为新的equity
- 这个equity如何绘制为曲线
这里有左轴和右轴
需要绘制的左轴放在data_dict中,需要绘制的右轴放在right_axis中,绘制的时候,函数会遍历这两个dict
脚本2
- if_all_curves = True # 是否生成多头、空头曲线。True:生成;False:不生成,只有多空资金曲线
- 1 read_coin
- 2 计算单币在周期内的资金曲线
- 3 均值得到周期资金曲线
- 4 反推周期内的涨跌幅
- 5 计算周期资金曲线
- 6 将资金曲线放到equity中
- 7 画图
- 画图的时候算涨跌幅的减法,这里对equity的涨跌幅做减法
- 这里需要扣除手续费吗?(先做上面的,完后再考虑这个)
- byclose是什么?(稍后研究)
- 流动性因子如何计算?
factors中的因子是小时级别的,periods中的数据是12H的,在进行resample的时候,怎么做的??
- is_spot为true,只选择现货数据,false只选择合约,并且is_spot为true的时候,只选择has_swap的大币,这个说法对不对
filter_list
- 脚本2分为以下几个阶段:
- 1 read_coin
- 2 计算单币在周期内的资金曲线
- 3 均值得到周期资金曲线
- 4 反推周期内的涨跌幅
- 5 计算周期资金曲线
- 6 将资金曲线放到equity中
- 7 画图
- 在第一阶段read_coin的时候,filter和factor一样,传入read_coin获得需要的数据
- calc_factor 计算因子,制作factors的多空组合排名
- before_filter 这里对filter做了df_long和df_short的筛选,其筛选比例是一个固定的数 80%,而且排序方式都是True,我觉的这里有问题。我希望用的是df_long,参数为0.1.可后期修改
- 其实我感觉before_filter 是对多空币的筛选,只有满足某种条件的多空币才能被选中。
- select_long_and_short_coin选币的时候,是对factors进行筛选的,这里的意思是对多空计算好的因子排名进行筛选的。
- cal_net_value 根据选币结果,从每个币每小时涨跌幅到所有币的每小时资金曲线
- 后面应该没有用到filter,也就是说,filter仅仅在read_coin之后,在before_filter函数中,筛选出了满足filter条件的coin,后续再拿去选币
流动性因子如何计算
- 脚本2分为以下几个阶段:
- 1 read_coin
2 选币- 2 计算单币在周期内的资金曲线
- 3 均值得到周期资金曲线
- 4 反推周期内的涨跌幅
- 5 计算周期资金曲线
- 6 将资金曲线放到equity中
- 7 画图
- read_coin读取到的数据如下:
- 可以用多空吗?改改参数做多空,修改流动性因子的排序方式和选币比例
这里需要考虑多空两边对于has_swap的固定,稍后再说
在传入因子的时候,规定了因子排序方式为true或者false,但是在select_long_and_short_coin中的calc_rank中,不管是多头还是空头,排序方式都是true,这里怎么解释?
破案了,如果long_factor = short_factor = factors,那么calc_factor按照排序方式在排,如果long_factor和short_factor分别为不同的因子,那么多头True 空头false
比如因子只有一个:psy,且long_factor = short_factor = factors,那么在calc_factor的时候,按照排序方式对因子进行排序,将排名做为factors,然后在select_long_and_short_coin方法中对多头用从小到大,空头从大到小。笑拥了
- 多空选币的时候,先选多头,让空头的数量和多头数量一样。short_select_coin_num == ‘long_nums’,如果short_select_coin_num 为特定的值,则按照这个值选币
- 这里埋了一个雷,现货模式下,多头选币可以随便选,空头选币只能在有合约的大币里面选,而且涨跌幅和合约一样,因为空头只能在合约里面做(已老实)
- 失败告终,(痛苦面具)
这里的空头和多头 资金费率不一样
空头是卖出,不是买入,方式不一样,所以不能这么算
(啊啊啊啊)
看别人的首先方式,优化自己
- 这里的想法是:继续按照之前的多空去做,先calc_factor 然后select_short_and_long_coin,然后做多空头,这里存在的问题就是资金费率的计算不确定,另外只需要计算资金曲线
- 首先解决现货模式下,空头用swap的情况
- 资金费率的问题:资金费率是按照swap spot算的,这里修改玩空头的swap之后,资金费率被自然修正
- 还有一个问题就是资金曲线的计算方式:多头正常,空头怕是要取负数
涨跌幅 / 币 / H
资金曲线 / 币 / H
资金曲线 / H
涨跌幅 / H
- pool = multiprocessing.Pool(processes=3)
result1 = pool.apply_async(cal_net_value, (long_df, hold_period, trading_time_list))
result2 = pool.apply_async(cal_net_value, (short_df, hold_period, trading_time_list))
result3 = pool.apply_async(calc_swap_pos_net_value,
(select_coin, leverage, hold_period, margin_rate, trading_time_list))
这段直接从第一步到了第三步,所以可能在这里做的计算
resulet1和result2是在做 涨跌幅 / 币 / H 到 资金曲线 / H,result3是在做爆仓判断