Mar*_*ale 5 python trading algorithmic-trading pandas
从雅虎获得 SPY 的数据后,我创建了一个收盘价通道,如下所示,最大和最小滚动窗口。色谱柱是 HC 和 HL。
我需要创建一个列(我称之为标志),当收盘价等于 HC 时显示 1,并且该值会持续到收盘价等于 HL。此时Flag的值为-1。如您所见,非常简单,Flag 可以只有两个值;1 或 -1。
简单的公式是这样的:
我尝试了几件事,包括下面的代码,但都没有成功。此代码的问题在于显示了 0 值。而且我不知道如何通过条件使其消失:
import pandas as pd
import pandas_datareader as dr
import numpy as np
from datetime import date
df = dr.data.get_data_yahoo('SPY',start='01-01-2019',end=date.today())
df['HC'] = df['Close'].rolling(20).max()
df['LC'] = df['Close'].rolling(20).min()
df['Flag'] = [1 if (df.loc[ei, 'Close'] == df.loc[ei, 'HC']) else
-1 if (df.loc[ei, 'Close'] == df.loc[ei, 'LC']) else
0 for ei in df.index]
Run Code Online (Sandbox Code Playgroud)
下面你可以看到我的代码的结果是蓝色的,我需要的结果是红色的。
有没有一种简单的方法可以做到这一点?如果有人可以帮助我,我将不胜感激。谢谢!
尽管已经回答了这个问题,但是计算这种结果的最快方法通常是使用np.where如下:
import pandas as pd\nimport pandas_datareader as dr\nimport numpy as np\nfrom datetime import date\n\ndf = dr.data.get_data_yahoo('SPY',start='01-01-2019',end=date.today())\n\ndf['HC'] = df['Close'].rolling(20).max() \ndf['LC'] = df['Close'].rolling(20).min() \nRun Code Online (Sandbox Code Playgroud)\n\n下面有一个嵌套的逻辑:
\n\ndf['Flag'] = np.where((df.Close == df.HC), 1, \n np.where(df.Close == df.LC, -1, np.full(df.Close.count(), np.nan)))\ndf.Flag.fillna(method='ffill', inplace=True)\nRun Code Online (Sandbox Code Playgroud)\n\n在性能方面:
\n\n%%timeit\ndf['Flag'] = np.where((df.Close == df.HC), 1, \n np.where(df.Close == df.LC, -1, np.full(df.Close.count(), np.nan)))\ndf.Flag.fillna(method='ffill', inplace=True)\nRun Code Online (Sandbox Code Playgroud)\n\n912 \xc2\xb5s \xc2\xb1 49.2 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 1000 loops each)\nRun Code Online (Sandbox Code Playgroud)\n\n这绝对比循环或嵌套 if 条件更好。
\n\n例如@Tim Mironov 的回答:
\n\n%%timeit\npos_indexes = (df.Close == df.HC)\nneg_indexes = (df.Close == df.LC)\n\ndf.loc[pos_indexes, 'Good_Flag'] = 1\ndf.loc[neg_indexes, 'Good_Flag'] = -1\n\ndf.fillna(method='ffill', inplace=True)\nRun Code Online (Sandbox Code Playgroud)\n\n4.43 ms \xc2\xb1 92 \xc2\xb5s per loop (mean \xc2\xb1 std. dev. of 7 runs, 100 loops each)\nRun Code Online (Sandbox Code Playgroud)\n