我目前正在做一个个人股票市场项目。
我做了一个函数,可以给出最新的黄金十字和死亡十字的日期
def check_golden_cross(data):
golden_crosses = []
death_crosses = []
for i in range(1, len(data.index)):
if data["Moving_50"][i] >= data["Moving_200"][i] and data["Moving_50"][i-1] <= data["Moving_200"][i-1]:
golden_crosses.append(data.index[i])
elif data["Moving_50"][i] <= data["Moving_200"][i] and data["Moving_50"][i-1] >= data["Moving_200"][i-1]:
death_crosses.append(data.index[i])
return golden_crosses, death_crosses
有人可以帮我检查一下这个功能吗? 我计算移动平均线如下:
def calculate_moving_average(data, period):
data[f"Moving_{period}"] = data["Close"].rolling(period).mean()
return data
请帮助我。我遇到了安静的麻烦。
供将来参考:不要以为人们对金融数据很放心,尤其是使用Python。大多数人使用 R 来实现此目的。现在,这就是你应该如何处理这个问题:
import pandas as pd
import yfinance as yf
import matplotlib.pyplot as plt
ticker_symbol = 'AAPL'
ticker_data = yf.Ticker(ticker_symbol)
data = ticker_data.history(period='1d', start='2010-1-1', end='2021-1-1')
def calculate_moving_average(data, period):
data[f"Moving_{period}"] = data["Close"].rolling(window=period, min_periods=period).mean()
return data
def check_golden_cross(data):
golden_crosses = []
death_crosses = []
if data['Moving_50'].isnull().any() or data['Moving_200'].isnull().any():
print("Warning: NaN values found in moving averages. Check initial data points.")
for i in range(1, len(data)):
if not pd.isna(data["Moving_50"][i]) and not pd.isna(data["Moving_200"][i]):
if data["Moving_50"][i] >= data["Moving_200"][i] and data["Moving_50"][i-1] < data["Moving_200"][i-1]:
golden_crosses.append(data.index[i])
elif data["Moving_50"][i] <= data["Moving_200"][i] and data["Moving_50"][i-1] > data["Moving_200"][i-1]:
death_crosses.append(data.index[i])
return golden_crosses, death_crosses
data = calculate_moving_average(data, 50)
data = calculate_moving_average(data, 200)
golden_crosses, death_crosses = check_golden_cross(data)
print("Golden Crosses:", golden_crosses)
print("Death Crosses:", death_crosses)
plt.figure(figsize=(14, 7))
plt.plot(data['Close'], label='Close Price')
plt.plot(data['Moving_50'], label='50-Day MA')
plt.plot(data['Moving_200'], label='200-Day MA')
if golden_crosses:
plt.scatter(golden_crosses, data.loc[golden_crosses, 'Moving_50'], color='gold', label='Golden Cross', marker='^', s=100)
if death_crosses:
plt.scatter(death_crosses, data.loc[death_crosses, 'Moving_50'], color='red', label='Death Cross', marker='v', s=100)
plt.title('Stock Price and Moving Averages')
plt.xlabel('Date')
plt.ylabel('Price')
plt.legend()
plt.show()
用您自己的股票代码替换它。对于这个:
Golden Crosses: [Timestamp('2013-09-10 00:00:00-0400', tz='America/New_York'), Timestamp('2016-08-30 00:00:00-0400', tz='America/New_York'), Timestamp('2019-05-06 00:00:00-0400', tz='America/New_York')]
Death Crosses: [Timestamp('2012-12-10 00:00:00-0500', tz='America/New_York'), Timestamp('2015-08-28 00:00:00-0400', tz='America/New_York'), Timestamp('2018-12-21 00:00:00-0500', tz='America/New_York')]
视觉上: