代码之家  ›  专栏  ›  技术社区  ›  Jas Mahay

使用日期和日历:需要社区帮助来提高工作表的效率

  •  0
  • Jas Mahay  · 技术社区  · 1 年前

    我正在使用一张处理大宗商品未来数据的表格(财务数据,几乎像股票数据一样,但每月的到期日期可能长达两到三年)。

    我的数据有符号、到期价和收盘价,大约有600行。例如,每种商品都有一个两个字符的代码;

    商品代码/符号

    S&P 500 E-Mini ES

    纳斯达克100指数E-Mini NQ

    罗素2000 E-Mini RTY

    道琼斯期货迷你YM

    黄金GC

    玉米ZC

    大豆ZS

    每种商品都有多个月的到期日,最长可达3年或更长时间,但我只想工作两年。每个月都有一个字符代码,表示一个月和年份的最后两位数字。例如,2024年1月被编码为“F24”。

    月份:一月二月三月四月五月六月七月八月九月十月十一月十二月

    符号:F G H J K M N Q U V X Z

    准备数据表(固定表)的懒惰方式: [延迟到期日历数据:图像]( https://i.sstatic.net/nSp9NBQP.png )

    在惰性方法四年(48列“月”)日历中,表示未来到期月份,“锚定列C4”中只有动态值是年。月份列有固定的月份代码,从一月代码“F”开始,以此类推;

       |← Current year - 1 →|← Current year → | ← Current year+1 → |← Current year+2 →|
    

    一个明显的问题是,例如,当当前月份是八月“Q”时,前8列是空的,我想在另一张紧凑的工作表中显示此日历的范围,因此空值对工作表没有好处!

    **动态数据表(Dynamic SHEET):** 为了显示24个月的价值数据(约两年),锚定列B1(用于月份)和B2(用于月份和年份代码)将第一列中的当前月份作为月份(NOW()),然后使用此公式计算C1至Z1中的下一个24个月;

    =月份(EOMONTH(NOW(),0)+30+(如果(MOD(B1,2)=1,1,0))

    后续立柱将在30、60、90、120天内锚固立柱B1。如果一个月有31天,则通过公式If(MOD(B1,2)=1,1,0)增加一天

    为了对年份和月份代码的最后2位数字进行编码,我在锚列B2中使用了这个公式;

    =选择(B1、“F”、“G”、“H”、“J”、“K”、“M”、“N”、“Q”、“U”、“V”、“X”、“Z”)&右(年份(现在),2) 则后续到期列C2、D2…Z2的计算如下:

    =选择(C1、“F”、“G”、“H”、“J”、“K”、“M”、“N”、“Q”、“U”、“V”、“X”、“Z”)&右(年(EOMONTH(NOW(),0)+30+(如果(MOD(A1,2)=1,1,0)),2)

    为了自动计算年份,我增加了额外的天数30,30..720。

    要玩图纸,请复制一份:

    https://docs.google.com/spreadsheets/d/1ThGY8cH0zRTQSWM2k7aHCwZrnVpd88gXXS7jgx9Iy2s/edit?usp=sharing

    到目前为止,我的应用程序正在工作,我正在用它来交易期货合约,我想知道我是否可以提高性能或效率。

    1 回复  |  直到 1 年前
        1
  •  0
  •   doubleunary    1 年前

    DYNAMIC!1:2 正在重复 now() 很多。该函数刷新 每一个 编辑电子表格的时间。在the CONFIG 床单,放 =today() 在单元格中,并替换以下所有实例 now() 参照该单元格。

    公式在 动态!1:2 每个过滤器都单独过滤数据,这比仅仅进行查找在计算上更密集。您可以删除 filter() 这样地:

    =arrayformula(ifna(vlookup( 
      A3:A50 & B2:Z2, { CONFIG!G2:G & CONFIG!H2:H, CONFIG!I2:I }, 2, false 
    )))
    

    清除行 DYNAMIC!B3:3 并将公式放入单元格中 B3 。它将给出与您当前在该行中的多个公式相同的结果。

    要进一步提高电子表格的性能,请参阅我的 optimization tips .