0

这是我的代码。我需要向上识别 %k 到 %d 的交叉线此外,根据第二个 y 过滤检测到的样本,其值从 0 到 100,并且只保留出现在图表的 20 水平红线以下的交叉。

from ta.volatility import BollingerBands
import matplotlib.pyplot as plt
import pandas_datareader as pdr
import pandas as pd
import datetime as dt    

ticker = "BTC-USD"
df = pdr.get_data_yahoo(ticker, dt.datetime(2021,1,1))
#BollingerBands :
bb_indicator = BollingerBands(df['Close'])
df['upper_band'] = bb_indicator.bollinger_hband()
df['lower_band'] =  bb_indicator.bollinger_lband()
df['moving_average'] = bb_indicator.bollinger_mavg()
df['datetime'] = df.index
#Stochastic :
high14 = df['High'].rolling(14).max()
low14 = df['Low'].rolling(14).min()
df['%K'] = (df['Close'] - low14)*100/(high14-low14)
df['%D'] = df['%K'].rolling(3).mean()

#Plot :
fig,axes = plt.subplots(nrows=1, ncols=1,figsize=(8,5))
df[['Low', 'Close', 'upper_band', 'lower_band']].plot(ax=axes)
axes.color=['green', 'orange', 'yellow','red']
axes.set_title('Strategy')
axes.fill_between(df.index, df['lower_band'], df['upper_band'], facecolor='orange', alpha=0.1)


df[['%K','%D']].plot(ax=axes, secondary_y=True)
is80 = axes.right_ax.axhline(80, c='r', alpha=0.8,linestyle='--')
is20 = axes.right_ax.axhline(20, c='r', alpha=0.8,linestyle='--')

FilterLowSmallerThanLowerBand = df['Low'] <= df['lower_band']
FilterHighBiggerThanUpperBand = df['High'] >= df['upper_band']
**FilterKPercentCrossesUpDPercent = "??? "
FilterDPercentBelow20 = "??? When %D is below the value of 20 Stochastic"**

dfFilteredPriceBelowLowerBand = df[FilterLowSmallerThanLowerBand]
dfFilteredPriceAboveUpperBand = df[FilterHighBiggerThanUpperBand]

for i in range(len(dfFilteredPriceBelowLowerBand)):
    TempDfFilteredPriceBelowLowerBand = dfFilteredPriceBelowLowerBand.iloc[i]
    SizeXY = (TempDfFilteredPriceBelowLowerBand['Low'] * 5) / 100
    axes.annotate('L',xy =(TempDfFilteredPriceBelowLowerBand.datetime, TempDfFilteredPriceBelowLowerBand.Low - SizeXY),xytext =(TempDfFilteredPriceBelowLowerBand.datetime,TempDfFilteredPriceBelowLowerBand.Low - SizeXY),arrowprops = dict(facecolor ='green',shrink = 0.05,alpha=0.25))
    
for i in range(len(dfFilteredPriceAboveUpperBand)):
    TempDfFilteredPriceAboveUpperBand = dfFilteredPriceAboveUpperBand.iloc[i]    
    SizeXY = (TempDfFilteredPriceAboveUpperBand['High'] * 5) / 100
    axes.annotate('S',xy =(TempDfFilteredPriceAboveUpperBand.datetime, TempDfFilteredPriceAboveUpperBand.High + SizeXY),xytext =(TempDfFilteredPriceAboveUpperBand.datetime,TempDfFilteredPriceAboveUpperBand.High + SizeXY),arrowprops = dict(facecolor ='red',shrink = 0.05,alpha=0.25))

部分%K线交叉的黄色高光在%D线上方

部分%K线交叉的黄色高光在%D线上方

4

0 回答 0