使用python进行移动平均交叉

问题描述 投票:0回答:1

我目前正在做一个个人股票市场项目。

我做了一个函数,可以给出最新的黄金十字和死亡十字的日期

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 pandas stock moving-average
1个回答
0
投票

供将来参考:不要以为人们对金融数据很放心,尤其是使用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')]

视觉上:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.