思路:
- 首先和benchmar合并
- 然后resample成周期数据
这里需要弄明白,原始周期和resample周期分别是多长
持仓周期分别为小时和日级别。
代码在
# ===合并benchmark之后调用的方法:主要用于引入其他需要外部数据、设置外部数据在resample时需要进行的处理等。
factor_dict, data_dict = {}, {} # 创建空字典用于resample,factor_dict仅在转换日线的时候使用,data_dict是在转换到交易周期的时候使用
df, factor_dict, data_dict = Strategy.after_merge_index(df, symbol, symbol_type, factor_dict, data_dict)
# 合并其他数据之后,如果df为空,则处理下一个币种
if df.empty:
return pd.DataFrame()
这里需要细究
然后,需要制定以下筹码因子的resample周期
- 存在问题
对于筹码因子的选股情况不清楚,即resample,原来选股中的resample什么意思,在选币的时候应该如何使用。
计算出筹码因子之后,要按照从大到小的顺序排序,上方筹码因子越大,表示越分散
然后需要resample
after_merge_index中的factor_dict和data_dict分别表示什么意思。为什么需要两次resample,第二次resample是干嘛的
signal函数是什么时候被调用的
这里首先merge了benchmark,然后merge了额外数据,接着计算出需要的因子,然后resample
!!! resample这里需要再看看
这里的resample在calc_factors中的trans_period_for_day
factor_dict:这里的factor_dict表示计算因子的时候,不在最终结果保留
data_dict:表示只在最终结果保留,不在计算因子的时候使用。
从大到小排序这部分是在Strategy_筹码.py中完成的。需要修改
# 选币因子信息列表,用于`2_选币_单offset.py`,`3_计算多offset资金曲线.py`共用计算资金曲线
# 这里的True和False代表了对因子排序的顺序,其中True表示从小到大,False表示从大到小
factor_list = [('筹码', False, 3, 1)]
总结一下,总的流程为:
这里首先merge了benchmark,然后merge了额外数据,这里的额外数据指的是计算所需因子需要的数据,接着计算出需要的因子,然后resample周期转换
计算因子的时候用了factor_dict进行因子计算
resample周期转换的时候,用了data_dict进行周期映射
fact_dict进行resample的时候是对因子进行resample
这里的两次resample是什么意思呐?
第一次的resample是将小时级别转化为日线级别数据时,计算因子的映射方式
第二次的resample的意思是,持仓周期为月时,对日线数据进行resample
第一次resample是天,第二次的resample还是天,感觉第二次的resample在这里没什么用
没有弄明白,到底哪里规定了对筹码集中度因子的resample方式
也没有弄明白对筹码集中度因子到底应该怎么样resample
我认为这里出了一点错:
对于筹码集中度因子,从小时到日线数据时,应该首先重新计算分位点,然后基于分位点,计算筹码集中度,计算出来的筹码集中度只有一个
对于日线数据的分位数的计算:
已有小时级别的价格分位数,要计算日线级别的价格分位数:
1 可以求均值
2 可以加权平均
3 对每个成交数据的精确计算(做不到)
4 目前使用的是first,可以改进
流程:
1 merge benchmark
2 merge 额外数据
3 计算因子 (计算因子的时候,需要用factor_list周期转换)
4 resample周期转换(用data_list周期转换)
如果周期为天,首先将小时级别的数据转化为日线数据,在这里进行分位数的处理,然后通过signa函数计算因子
分位数的计算
分位数:https://www.cnblogs.com/gispathfinder/p/5770091.html
找分位数的时候,对数据按照从小到大的顺序排序,然后根据公式计算出分位数所在位置,如果是整数,则计算完成,如果是小数,需要做插值处理。
[12, 15, 14, 10, 18, 20, 22, 25, 30, 33]
首先,将数据从小到大排序:
[10, 12, 14, 15, 18, 20, 22, 25, 30, 33]
确定分位数位置
假设我们要计算第75%分位数(即第三四分位数Q3)。
计算位置: ( L = 0.75 \times (n + 1) ),这里的n是样本数量。
[ n = 10 ]
所以,位置: (L = 0.75 \times (10 + 1) = 0.75 \times 11 = 8.25)
插值计算
因为8.25不是整数,我们需要进行插值计算。
- ( k = 8 )(整数部分),对应排序数据的第8个数据。
- ( d = 0.25 )(小数部分)。
所以,排序数据的第8个值是25,第9个值是30。
使用插值公式计算:
[ X_L = X_k + d \times (X_{k+1} - X_k) ]
[ X_{8.25} = 25 + 0.25 \times (30 - 25) ]
[ X_{8.25} = 25 + 0.25 \times 5 ]
[ X_{8.25} = 25 + 1.25 ]
[ X_{8.25} = 26.25 ]
因此,这组数据的第75%分位数(Q3)是26.25。
通过以上步骤,我们成功计算了这组数据的第75%分位数为26.25,这说明在这组数据中,有75%的数据在26.25以下。这个计算过程包括了数据排序、位置确定和插值计算步骤,能帮助我们理解分位数在数据分析中的应用。
股票的价格分位数的计算
累计买入数量的计算方法非常简单,它是根据价格从低到高逐步累加买入数量得到的。下面通过一个具体的例子来说明。
假设有以下数据
价格 (Price) | 买入数量 (Volume) |
---|---|
10 | 100 |
12 | 200 |
14 | 150 |
16 | 300 |
18 | 250 |
20 | 100 |
计算累计买入数量
我们从最低价格开始,将每个价格点的买入数量累加起来:
-
第一个价格点: 价格为10,买入数量是100。
- 累计买入数量 = 100
-
第二个价格点: 价格为12,买入数量是200。
- 累计买入数量 = 100(前面的累计) + 200(当前买入量) = 300
-
第三个价格点: 价格为14,买入数量是150。
- 累计买入数量 = 300(前面的累计) + 150(当前买入量) = 450
-
第四个价格点: 价格为16,买入数量是300。
- 累计买入数量 = 450(前面的累计) + 300(当前买入量) = 750
-
第五个价格点: 价格为18,买入数量是250。
- 累计买入数量 = 750(前面的累计) + 250(当前买入量) = 1000
-
第六个价格点: 价格为20,买入数量是100。
- 累计买入数量 = 1000(前面的累计) + 100(当前买入量) = 1100
最终结果
所以最后的累计买入数量表如下:
价格 (Price) | 买入数量 (Volume) | 累计买入数量 |
---|---|---|
10 | 100 | 100 |
12 | 200 | 300 |
14 | 150 | 450 |
16 | 300 | 750 |
18 | 250 | 1000 |
20 | 100 | 1100 |
累计买入数量的计算就是将每个价格点的买入量与之前所有买入量累加,逐步得到每个价格点的累计买入量。这个累计值可以用于进一步的分位数分析。
疑问:
怎么计算?
怎么调用的?
检查分位数的逻辑
对于不同天数的想法:
天数的list在config.py文件的factor_param_list
手动跑天数是在:strategy_筹码.py的factor_list里面的第三个参数
需要做的事情:
1 想一下为什么要这么改,可以做改进吗:
改进之后的因子的基本思想是:过去n天内的筹码波动率越大,股票表现越好。即过去n天内买入的价格越分散,股票表现越好,越集中,表现越差。
2 继续对因子的计算做思考:***