私はすでにBTCのRSIを計算しましたが、うまくいきました。現在の位置が長いか短いかを示す新しい列 [Position] をデータフレームに追加したいと考えています。今、私はループを実行しようとしています.Longing または Shorting BTC の場合、出力が得られるはずです。考え方は次のとおりです。RSI が買われ過ぎの状態 (>70) にあり、再び 70 を下回った場合、アウトプット ポジションはショートになります。Rsi が売られ過ぎの状態 (<30) にあり、30 を超え始めた場合、シグナルはロングになります。IF RSI が上昇しており、最後のシグナルがロングだった場合、ショートシグナルが発生するまでの間のすべての値もロングである必要があります (逆の場合も同様です)。
さらに、2016 年 3 月 13 日 (時系列の開始) に計算された最初の RSI は 40.41 であり、上昇しています。これが、短いシグナルが生成されるまでの最初の値が、私が統合しなかった長い値に設定されていると素晴らしい理由です。私のコードではまだ、誰かがこれを実装する方法を知っていますか?
私のコードは次のようになります。
import pandas as pd
import numpy as np
import datetime
import matplotlib.pyplot as plt
from pandas_datareader import data as pdr
btc = pdr.get_data_yahoo('BTC-USD',
start=datetime.datetime(2016, 2, 28),
end=datetime.datetime(2020, 2, 27))
btc.tail()
btc = btc.reset_index()
def computeRSI (data, time_window):
diff = data.diff(1).dropna() # diff in one field(one day)
#this preservers dimensions off diff values
up_chg = 0 * diff
down_chg = 0 * diff
# up change is equal to the positive difference, otherwise equal to zero
up_chg[diff > 0] = diff[ diff>0 ]
# down change is equal to negative deifference, otherwise equal to zero
down_chg[diff < 0] = diff[ diff < 0 ]
# calculate EMAs
up_chg_avg = up_chg.ewm(com=time_window-1 , min_periods=time_window).mean()
down_chg_avg = down_chg.ewm(com=time_window-1 , min_periods=time_window).mean()
rs = abs(up_chg_avg/down_chg_avg)
rsi = 100 - 100/(1+rs)
return rsi
btc['RSI'] = computeRSI(btc['Close'], 14)
# get rid of the first 14 NA values
rsibtc = btc[-1448:]
rsibtc.head()
Position = []
for i in range(0,rsibtc.shape[0]):
if rsibtc['RSI'].iloc[i] < 70 and rsibtc['RSI'].iloc[i-1] >70
Position.append('Short')
elif rsibtc['RSI'].iloc[i] >30 and rsibtc['RSI'].iloc[i-1]<30
Position.append('Long')
else Position.append(Position.iloc[i-1])
rsibtc['Position'] = Position
rsibtc.tail()
ループで構文エラーが発生します...このループを実行する方法を教えてください。
ご支援ありがとうございました!皆さんからのすべてのアイデアに感謝します!
万全を期して節約しましょう!