如何根据观察值设置触发器

2024-04-26 11:00:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我是新来使用熊猫,所以请指出任何最佳做法,我可能已经错过了我的代码。我编写了下面的python代码,从Yahoo Finance下载股票行情数据,只保留AAPL和MSFT的每日调整收盘值。然后我在dataframe中创建了一个新的列,其中包含AAPL的每日调整收盘价除以MSFT的每日调整收盘价(a),以及另一个列,它是相同计算的100天移动平均值(B)。最后一列是(A)/(B),最后一列是第二列的日变化百分比。你知道吗

import pandas as pd
pd.core.common.is_list_like = pd.api.types.is_list_like
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
yf.pdr_override()
import matplotlib.pyplot as plt
import pandas as pd

# Define the instruments to download. We would like to see Apple, and Microsoft
tickers = ['AAPL', 'MSFT']

# We would like all available data from 01/01/2000 until 12/31/2016.
start_date = '2010-01-01'
end_date = '2016-12-31'

# User pandas_reader.data.DataReader to load the desired data. As simple as that.
df = pdr.get_data_yahoo(tickers, start_date, end_date)['Adj Close']

df["AAPL/MSFT"] = df['AAPL']/df['MSFT']
df["100Day-MA APPL/MSFT"] = (df['AAPL']/df['MSFT']).rolling(window=100).mean()
df["AAPL/MSFT / MA"] = df["AAPL/MSFT"]/df["100Day-MA APPL/MSFT"]
df["% change AAPL/MSFT / MA"] = df["AAPL/MSFT / MA"].pct_change()

print(df.tail(9))

输出如下。我的问题是,我如何设置这样的条件语句,即观察每日价格的趋势,并根据这些信号发出买入/卖出信号。例如,df的最后一列表示连续5天增加的百分比变化。或者最后一列连续5天增加,但仍低于1。如有任何见解,我们将不胜感激:)

                  AAPL       MSFT           ...             AAPL/MSFT / MA  % change AAPL/MSFT / MA
Date                                        ...
2016-12-19  113.490685  61.435783           ...                   0.965480                -0.014949
2016-12-20  113.792313  61.358532           ...                   0.969278                 0.003933
2016-12-21  113.899338  61.358532           ...                   0.970376                 0.001133
2016-12-22  113.150139  61.368191           ...                   0.963949                -0.006623
2016-12-23  113.373917  61.068832           ...                   0.970687                 0.006990
2016-12-27  114.093948  61.107452           ...                   0.976266                 0.005748
2016-12-28  113.607445  60.827412           ...                   0.976658                 0.000401
2016-12-29  113.578247  60.740505           ...                   0.977934                 0.001307
2016-12-30  112.692825  60.006588           ...                   0.982284                 0.004448

Tags: to代码importpandasdfdatadateas
2条回答

一种方法是计算差异,然后创建一个列,如果差异大于0,则为1,否则为0。然后对最后一列做滚动求和,如果你得到5,你就做点什么。你知道吗

df['diff'] = df["AAPL/MSFT / MA"].diff()
df.loc[df['diff'] > 0, 'sign'] = 1
df.loc[df['diff'] <= 0, 'sign'] = 0
df['sum'] = df['sign'].rolling(5).sum()
if len(df.loc[df['sum'] == 5, 'sum']) > 0:
    all_your_stocks_are_belong_to_us()

这假设所有连续的天都存在,并且时间序列中没有漏洞。如果不是这样的话,你需要更多的诡计。你知道吗

你的问题问得太多了。我将告诉你如何找到连续增长。你知道吗

从数据帧的简化版本开始:

         Date        AAPL       MSFT    change        MA
0  2016-12-19  113.490685  61.435783  0.965480 -0.014949
1  2016-12-20  113.792313  61.358532  0.969278  0.003933
2  2016-12-21  113.899338  61.358532  0.970376  0.001133
3  2016-12-22  113.150139  61.368191  0.963949 -0.006623
4  2016-12-23  113.373917  61.068832  0.970687  0.006990
5  2016-12-27  114.093948  61.107452  0.976266  0.005748
6  2016-12-28  113.607445  60.827412  0.976658  0.000401
7  2016-12-29  113.578247  60.740505  0.977934  0.001307
8  2016-12-30  112.692825  60.006588  0.982284  0.004448

我们将询问change列是否比前一天增加:

df['inc'] = df['change'] > df['change'].shift()

这给我们留下了:

         Date        AAPL       MSFT    change        MA    inc
0  2016-12-19  113.490685  61.435783  0.965480 -0.014949  False
1  2016-12-20  113.792313  61.358532  0.969278  0.003933   True
2  2016-12-21  113.899338  61.358532  0.970376  0.001133   True
3  2016-12-22  113.150139  61.368191  0.963949 -0.006623  False
4  2016-12-23  113.373917  61.068832  0.970687  0.006990   True
5  2016-12-27  114.093948  61.107452  0.976266  0.005748   True
6  2016-12-28  113.607445  60.827412  0.976658  0.000401   True
7  2016-12-29  113.578247  60.740505  0.977934  0.001307   True
8  2016-12-30  112.692825  60.006588  0.982284  0.004448   True

然后我们要求在一个尾随的5天窗口上的最小值;该值将是True当且仅当所有5天都是True

df['inc5'] = df['inc'].rolling(5).min().fillna(0).astype('bool')

因此我们有:

         Date        AAPL       MSFT    change        MA    inc   inc5
0  2016-12-19  113.490685  61.435783  0.965480 -0.014949  False  False
1  2016-12-20  113.792313  61.358532  0.969278  0.003933   True  False
2  2016-12-21  113.899338  61.358532  0.970376  0.001133   True  False
3  2016-12-22  113.150139  61.368191  0.963949 -0.006623  False  False
4  2016-12-23  113.373917  61.068832  0.970687  0.006990   True  False
5  2016-12-27  114.093948  61.107452  0.976266  0.005748   True  False
6  2016-12-28  113.607445  60.827412  0.976658  0.000401   True  False
7  2016-12-29  113.578247  60.740505  0.977934  0.001307   True  False
8  2016-12-30  112.692825  60.006588  0.982284  0.004448   True   True

相关问题 更多 >