如何解决Pandas DataFrame 中的止损
虽然这个问题与金融数据和算法交易有关,但我会尽量以最容易理解的方式来表述。
我有一个(非常大的)pandas DataFrame,我在这里展示了它的头部:
Open High Low Close Volume SMA1 SMA2 \
0 7228.80 7238.88 7225.64 7228.09 80.976766 7217.034 7197.7682
1 7227.12 7233.84 7226.79 7232.77 35.869685 7218.304 7198.7750
2 7232.06 7236.07 7229.65 7234.08 25.800914 7219.691 7199.8568
3 7234.57 7234.97 7228.08 7232.30 60.018355 7221.072 7200.7492
4 7232.61 7235.00 7229.70 7230.49 20.199962 7222.878 7201.5848
Vol_Diff Buy Price Stop Loss Sell Price Position Buy Signal \
0 49.797035 0 0 0 0 0
1 -45.107081 0 0 0 0 0
2 -10.068771 0 0 0 0 0
3 34.217441 0 0 0 0 0
4 -39.818393 0 0 0 0 0
Sell Signal
0 0
1 0
2 0
3 0
4 0
我想迭代并根据某些条件是否满足涉及 SMA1、SMA2 和 Vol_Diff 的条目我需要将买入信号更改为 1,将买入价格设置为收盘价,然后更改每个条目仓位为 1,直到我收到卖出信号(此条目更改为 1),此后仓位条目均为零。卖出信号来自止损条目,我希望这个止损根据“高”价格偏离(正)买入价的程度而改变。本质上,根据买入信号,我希望设置止损低于买入价 1%。如果最高价比买入价高出 1.5%,我希望止损移动到买入价并保持到它可能会随着最高价上涨 1.5%。这种动态变化是我最终想要改变的东西,使其更加动态并遵循累积最大值,但一次一个!当低价变得小于或等于止损价时,卖出信号就会出现,此时,正如我所说,一切都会重置,止损再次变为零。
这是我对迭代代码的尝试:
if data['Position'][i-1] == 0:
if (data['SMA1'][i-1] < data['SMA2'][i-1]) & (data['SMA1'][i] > data['SMA2'][i]) & (data['Vol_Diff'][i] > 0):
data['Buy Signal'][i] = 1
data['Buy Price'][i] = data['Open'][i]
data['Stop Loss'][i] = data['Open'][i]*0.99
data['Position'][i] = 1
else:
data['Buy Signal'][i] = 0
data['Position'][i] = 0
else:
if (data['Stop Loss'][i-1] < data['High'][i]*0.974) & (data['Stop Loss'][i-1] > data['Low'][i]):
data['Stop Loss'][i] = data['High'][i]*0.985
data['Position'][i] = 1
elif data['Low'][i] < data['Stop Loss'][i-1]:
data['Sell Signal'][i] = 1
data['Sell Price'][i] = data['Stop Loss'][i-1]
data['Stop Loss'][i] = 0
data['Position'][i] = 0
else:
data['Stop Loss'][i] = data['Stop Loss'][i-1]
data['Position'][i] = 1
但 Python 似乎并不喜欢这个。我相当确定,就我想为该策略做的事情的基本逻辑而言,一切都是有道理的,但我显然在编码逻辑中犯了错误。这是我尝试运行它时得到的错误:
File "/Users/charleyscotford/Machine_Learning/lib/python3.8/site-packages/pandas/core/indexes/base.py",line 3080,in get_loc
return self._engine.get_loc(casted_key)
File "pandas/_libs/index.pyx",line 70,in pandas._libs.index.IndexEngine.get_loc
File "pandas/_libs/index.pyx",line 101,in pandas._libs.index.IndexEngine.get_loc
File "pandas/_libs/hashtable_class_helper.pxi",line 1625,in pandas._libs.hashtable.Int64HashTable.get_item
File "pandas/_libs/hashtable_class_helper.pxi",line 1632,in pandas._libs.hashtable.Int64HashTable.get_item
KeyError: -1
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "/Users/charleyscotford/PycharmProjects/Backtesting/main.py",line 59,in <module>
if data['Position'][i-1] == 0:
File "/Users/charleyscotford/Machine_Learning/lib/python3.8/site-packages/pandas/core/series.py",line 853,in __getitem__
return self._get_value(key)
File "/Users/charleyscotford/Machine_Learning/lib/python3.8/site-packages/pandas/core/series.py",line 961,in _get_value
loc = self.index.get_loc(label)
File "/Users/charleyscotford/Machine_Learning/lib/python3.8/site-packages/pandas/core/indexes/base.py",line 3082,in get_loc
raise KeyError(key) from err
KeyError: -1
如果有人对我以后如何实施更动态的止损以密切关注高价有任何提示,我们将不胜感激。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。