Python怎么写:60日均线连续10个交易日平行或上移
时间: 2024-02-16 08:30:17 浏览: 22
你可以使用pandas库中的rolling函数来计算60日均线,然后利用numpy库中的where函数来判断连续10个交易日是否平行或上移。具体代码如下:
```python
import pandas as pd
import numpy as np
# 假设股票数据存储在DataFrame对象df中,其中Close列表示收盘价
df['MA60'] = df['Close'].rolling(window=60).mean()
# 判断MA60是否连续10个交易日平行或上移
cond = ((np.diff(np.sign(np.diff(df['MA60']))) >= 0)
& (np.diff(np.sign(np.diff(df['MA60'])), prepend=np.nan) >= 0))
result = np.where(cond, 1, 0)
```
在这段代码中,我们首先利用rolling函数计算60日均线,将结果存储在MA60列中。然后,我们使用np.diff函数计算MA60的一阶差分,再将结果传给np.sign函数计算符号函数,得到一个序列,表示MA60的上升、下降或持平状态。接下来,我们再次使用np.diff函数计算MA60的一阶差分,但是在计算时需要在序列开头处添加一个NaN值,这是因为一阶差分会少掉第一个元素。然后,我们再将结果传给np.sign函数计算符号函数,得到一个序列,表示MA60的上升、下降或持平状态。最后,我们使用np.where函数将连续10个交易日平行或上移的位置设为1,其余位置设为0。
相关问题
请用Python写一个双均线交易模型
双均线交易模型是一种常见的量化交易策略,它基于两条移动平均线的交叉来进行买卖决策。下面是一个用Python实现的简单双均线交易模型的示例代码:
```python
import pandas as pd
# 读取历史股票数据
data = pd.read_csv('stock_data.csv')
# 计算短期均线和长期均线
data['short_ma'] = data['close'].rolling(window=10).mean()
data['long_ma'] = data['close'].rolling(window=30).mean()
# 生成交易信号
data['signal'] = 0
data.loc[data['short_ma'] > data['long_ma'], 'signal'] = 1
data.loc[data['short_ma'] < data['long_ma'], 'signal'] = -1
# 计算持仓
data['position'] = data['signal'].diff()
# 回测收益
data['return'] = data['position'] * data['close'].pct_change()
cumulative_return = (1 + data['return']).cumprod()
# 输出结果
print(cumulative_return)
```
上述代码中,我们首先读取历史股票数据,然后计算短期均线和长期均线。根据短期均线和长期均线的交叉情况,生成交易信号。根据交易信号计算持仓,并计算每日的收益率。最后,通过累计收益率来评估策略的表现。
请注意,上述代码只是一个简单的示例,实际的交易策略可能需要更多的细节和参数调整。此外,还需要考虑交易成本、止损策略等因素来完善交易模型。
用python 写一个双均线交易策略
好的,下面是一个简单的双均线交易策略的Python代码示例:
```
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 读取数据
df = pd.read_csv('data.csv')
# 计算移动平均线
def MA(df, n):
MA = pd.Series(df['Close'].rolling(n, min_periods=n).mean(), name='MA_' + str(n))
df = df.join(MA)
return df
# 计算交易信号
def signals(df, short_window=20, long_window=50):
signals = pd.DataFrame(index=df.index)
signals['signal'] = 0.0
# 计算短期均线和长期均线
signals['short_ma'] = df['Close'].rolling(window=short_window, min_periods=1, center=False).mean()
signals['long_ma'] = df['Close'].rolling(window=long_window, min_periods=1, center=False).mean()
# 交叉信号
signals['signal'][short_window:] = np.where(signals['short_ma'][short_window:]
> signals['long_ma'][short_window:], 1.0, 0.0)
# 计算买入和卖出信号
signals['positions'] = signals['signal'].diff()
return signals
# 回测策略
def backtesting(df, signals):
# 初始化资本规模,交易方向和股票持仓
initial_capital = 10000.0
positions = pd.DataFrame(index=signals.index).fillna(0.0)
positions['Position'] = 100 * signals['positions']
portfolio = positions.multiply(df['Close'], axis=0)
pos_diff = positions.diff()
# 计算资本和持仓的变化
portfolio['holdings'] = (positions.multiply(df['Close'], axis=0)).sum(axis=1)
portfolio['cash'] = initial_capital - (pos_diff.multiply(df['Close'], axis=0)).sum(axis=1).cumsum()
portfolio['total'] = portfolio['cash'] + portfolio['holdings']
portfolio['returns'] = portfolio['total'].pct_change()
return portfolio
# 绘制交易曲线
def plot_strategy(df, signals, portfolio):
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(111, ylabel='Price')
df['Close'].plot(ax=ax1, color='black', lw=2.)
signals[['short_ma', 'long_ma']].plot(ax=ax1, lw=2.)
ax1.plot(signals.loc[signals.positions == 1.0].index,
signals.short_ma[signals.positions == 1.0],
'^', markersize=10, color='g')
ax1.plot(signals.loc[signals.positions == -1.0].index,
signals.short_ma[signals.positions == -1.0],
'v', markersize=10, color='r')
ax2 = fig.add_subplot(212, ylabel='Portfolio value in $')
portfolio['total'].plot(ax=ax2, lw=2.)
plt.show()
# 运行交易策略
df = MA(df, 20)
df = MA(df, 50)
s = signals(df)
p = backtesting(df, s)
plot_strategy(df, s, p)
```
其中,`data.csv` 是包含了股票价格数据的CSV文件,包括 `Date` 和 `Close` 列。以上的交易策略是一个简单的双均线交易策略,如果短期均线在长期均线的上方,则发出买入信号,如果短期均线在长期均线的下方,则发出卖出信号。策略会进行回测,并绘制交易曲线。