首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将使用不同参数运行相同计算的代码简化为不同的输出变量?

如何将使用不同参数运行相同计算的代码简化为不同的输出变量?
EN

Stack Overflow用户
提问于 2021-07-02 23:22:42
回答 2查看 62关注 0票数 0

我有一个数据,df,包含140万行数据,每一行代表2018年至2020年BTC的1分钟开放、高、低和关闭价格。我想将MACD (流行交易指标)添加到我的df中,但不要只计算macd 1分钟的时间框架,如下所示:

代码语言:javascript
复制
ShortEMA = df.Close.ewm(span=12, adjust=False).mean()
LongEMA = df.Close.ewm(span=26, adjust=False).mean()
MACD = ShortEMA - LongEMA
signal = MACD.ewm(span=9, adjust=False).mean()

df["MACD"] = MACD
df["Signal Line"] = signal

我想计算每一个时间框架1分钟,15分钟,30分钟,1小时,等等。

我这样做是用以下代码(花费了很长时间):

代码语言:javascript
复制
MySet = [1, 5, 15, 30, 60, 240, 360, 720, 1440, 10080]

ShortEMA1 = df.Close.ewm(span=12 * MySet[0], adjust=False).mean()
LongEMA1 = df.Close.ewm(span=26 * MySet[0], adjust=False).mean()
MACD1 = ShortEMA1 - LongEMA1
signal1 = MACD.ewm(span=9 * MySet[0], adjust=False).mean()

ShortEMA5 = df.Close.ewm(span=12 * MySet[1], adjust=False).mean()
LongEMA5 = df.Close.ewm(span=26 * MySet[1], adjust=False).mean()
MACD5 = ShortEMA5 - LongEMA5
signal5 = MACD.ewm(span=9 * MySet[1], adjust=False).mean()

ShortEMA15 = df.Close.ewm(span=12 * MySet[2], adjust=False).mean()
LongEMA15 = df.Close.ewm(span=26 * MySet[2], adjust=False).mean()
MACD15 = ShortEMA15 - LongEMA15
signal15 = MACD.ewm(span=9 * MySet[2], adjust=False).mean()

ShortEMA30 = df.Close.ewm(span=12 * MySet[3], adjust=False).mean()
LongEMA30 = df.Close.ewm(span=26 * MySet[3], adjust=False).mean()
MACD30 = ShortEMA30 - LongEMA30
signal30 = MACD.ewm(span=9 * MySet[3], adjust=False).mean()

ShortEMA60 = df.Close.ewm(span=12 * MySet[4], adjust=False).mean()
LongEMA60 = df.Close.ewm(span=26 * MySet[4], adjust=False).mean()
MACD60 = ShortEMA60 - LongEMA60
signal60 = MACD.ewm(span=9 * MySet[4], adjust=False).mean()

ShortEMA240 = df.Close.ewm(span=12 * MySet[5], adjust=False).mean()
LongEMA240 = df.Close.ewm(span=26 * MySet[5], adjust=False).mean()
MACD240 = ShortEMA240 - LongEMA240
signal240 = MACD.ewm(span=9 * MySet[5], adjust=False).mean()

ShortEMA360 = df.Close.ewm(span=12 * MySet[6], adjust=False).mean()
LongEMA360 = df.Close.ewm(span=26 * MySet[6], adjust=False).mean()
MACD360 = ShortEMA360 - LongEMA360
signal360 = MACD.ewm(span=9 * MySet[6], adjust=False).mean()

ShortEMA720 = df.Close.ewm(span=12 * MySet[7], adjust=False).mean()
LongEMA720 = df.Close.ewm(span=26 * MySet[7], adjust=False).mean()
MACD720 = ShortEMA720 - LongEMA720
signal720 = MACD.ewm(span=9 * MySet[7], adjust=False).mean()

ShortEMA1440 = df.Close.ewm(span=12 * MySet[8], adjust=False).mean()
LongEMA1440 = df.Close.ewm(span=26 * MySet[8], adjust=False).mean()
MACD1440 = ShortEMA1440 - LongEMA1440
signal1440 = MACD.ewm(span=9 * MySet[8], adjust=False).mean()

ShortEMA10080 = df.Close.ewm(span=12 * MySet[9], adjust=False).mean()
LongEMA10080 = df.Close.ewm(span=26 * MySet[9], adjust=False).mean()
MACD10080 = ShortEMA10080 - LongEMA10080
signal10080 = MACD.ewm(span=9 * MySet[9], adjust=False).mean()


df["MACD1"] = MACD1
df["Signal Line1"] = signal1

df["MACD5"] = MACD1
df["Signal Line5"] = signal5

df["MACD15"] = MACD1
df["Signal Line15"] = signal15

df["MACD30"] = MACD1
df["Signal Line30"] = signal30

df["MACD60"] = MACD60
df["Signal Line60"] = signal60

df["MACD240"] = MACD240
df["Signal Line240"] = signal240

df["MACD360"] = MACD360
df["Signal Line360"] = signal360

df["MACD720"] = MACD720
df["Signal Line720"] = signal720

df["MACD1440"] = MACD1440
df["Signal Line1440"] = signal1440

df["MACD10080"] = MACD10080
df["Signal Line10080"] = signal10080

我如何简化整个过程?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-07-02 23:28:14

不要让Short1Short5是单独的变量,只有一个Shorts字典,并有15等键。因此:

代码语言:javascript
复制
MySet = [1, 5, 15, 30, 60, 240, 360, 720, 1440, 10080]
Shorts = {}
Longs = {}
MACDs = {}
Signals = {}

for val in MySet:
  Shorts[val] = df.Close.ewm(span=12 * val, adjust=False).mean()
  Longs[val] = df.Close.ewm(span=26 * val, adjust=False).mean()
  MACDs[val] = Shorts[val] - Longs[val]
  Signals[val] = MACDs[val].ewm(span=9 * val, adjust=False).mean()

  df[f'MACD{val}'] = MACDs[val]
  df[f'Signal Line{val}'] = Signals[val]
票数 2
EN

Stack Overflow用户

发布于 2021-07-02 23:45:08

如果唯一的持久输出是存储在DataFrame中的值,并且中间Series不会在以后被使用或重用,那么最好在每次迭代中只更新DataFrame并使用f-string分配列:

代码语言:javascript
复制
MySet = [1, 5, 15, 30, 60, 240, 360, 720, 1440, 10080]
for val in MySet:
    ShortEMA = df.Close.ewm(span=12 * val, adjust=False).mean()
    LongEMA = df.Close.ewm(span=26 * val, adjust=False).mean()
    df[f"MACD{val}"] = ShortEMA - LongEMA
    df[f"Signal Line{val}"] = df[f"MACD{val}"].ewm(span=9 * val, adjust=False).mean()

如果以后需要访问值,则可以通过DataFrame访问它们。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68232120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档