如何将其转换为输出为CSV的forloop

2024-04-24 09:12:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着整理一段通用代码:

  1. 为一些价格数据取一个时间序列并将其划分为十分位数,例如,取过去1800万黄金价格并将其划分为十分位数[完成,见下文]

    date        4. close   decile                
    2017-01-03    1158.2       0
    2017-01-04    1166.5       1
    2017-01-05    1181.4       2
    2017-01-06    1175.7       1
             ...     ...
    2018-04-23    1326.0       7
    2018-04-24    1333.2       8
    2018-04-25    1327.2       7
    [374 rows x 2 columns]
    
  2. 提取特定十分位数的日期,然后创建一个附加30天的辅助日期列表

     #So far only for a single decile at a time
     firstdecile = gold.loc[gold['decile'] == 1]
     datelist = list(pd.to_datetime(firstdecile.index))
     datelist2 = list(pd.to_datetime(firstdecile.index) + pd.DateOffset(months=1))
    
  3. 以每十分之一30天的平均价格回报为例

    level1 = gold.ix[datelist]
    level2 = gold.ix[datelist2]
    level2.index = level2.index - pd.DateOffset(months=1)
    result = pd.merge(level1,level2, how='inner', left_index=True, right_index=True)
    
    def ret(one, two):
      return (two - one)/one
    
    pricereturns = result.apply(lambda x :ret(x['4. close_x'], x['4. close_y']), axis=1)
    mean = pricereturns.mean()
    
  4. 返回单个CSV文件中所有10个平均值的列表

到目前为止,我已经能够把一些功能,做步骤1-3,但只有一个十分位,但我正在努力扩展到一个循环代码,所有10个十分位一次与一个干净的CSV输出


Tags: to代码列表closedatetimeindexonelist
1条回答
网友
1楼 · 发布于 2024-04-24 09:12:31
  1. 首先在t + 1 month处追加收盘价,作为整个数据帧上的一个新列。你知道吗

    gold2_close = gold.loc[gold.index + pd.DateOffset(months=1), 'close']
    gold2_close.index = gold.index
    gold['close+1m'] = gold2_close
    

    然而,实际相关的应该是交易日的数量,即你不会有周末或节假日的价格。因此,我建议您按行数而不是按日期范围(即接下来的20个交易日)移动

    gold['close+20'] = gold['close'].shift(periods=-20)
    
  2. 现在计算每行的预期收益

    gold['ret'] = (gold['close+20'] - gold['close']) / gold['close']
    

    也可以结合步骤1。和2。直接移动,这样就不需要额外的列(仅当您按行数移动时,而不是由于重新索引而按固定日期范围移动时)

    gold['ret'] = (gold['close'].shift(periods=-20) - gold['close']) / gold['close']
    
  3. 既然你已经有了小数点,你只需要^{}小数点,然后用mean()来聚合收益

    gold_grouped = gold.groupby(by="decile").mean()
    

放入一些随机数据,你会得到下面的数据帧。closeret是每十分位数的平均值。您可以通过^{}从数据帧创建csv

              close       ret
decile                       
0       1238.343597 -0.018290
1       1245.663315  0.023657
2       1254.073343 -0.025934
3       1195.941312  0.009938
4       1212.394511  0.002616
5       1245.961831 -0.047414
6       1200.676333  0.049512
7       1181.179956  0.059099
8       1214.438133  0.039242
9       1203.060985  0.029938

相关问题 更多 >