由于量化交易涉及到很多具体的细节问题,需要根据具体的交易策略进行编写,因此下面给出一个简单的股票均线策略的代码实现,并进行简单的验证。

首先,我们需要导入需要的库,包括pandas、numpy和matplotlib等:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

接下来,我们需要获取股票的历史数据以及计算均线。这里我们以某只股票为例进行说明,假设我们要获取2019年到2020年的数据:

# 获取股票历史数据
df = pd.read_csv('stock.csv', index_col=0)
df.index = pd.to_datetime(df.index)
df = df['2019-01-01':'2020-12-31']

# 计算10日和30日均线
df['ma10'] = df['close'].rolling(window=10).mean()
df['ma30'] = df['close'].rolling(window=30).mean()

接下来,我们可以根据均线的交叉情况来判断买入和卖出的时机。假设当10日均线上穿30日均线时买入,当10日均线下穿30日均线时卖出。我们可以将交易信号保存在一个列表中,然后使用pandas的shift函数将信号向后移动一天,以便在第二天进行交易:

# 计算交易信号和持仓情况
df['signal'] = np.where(df['ma10'] > df['ma30'], 1, 0)
df['position'] = df['signal'].shift()

# 将买入信号标记为1,卖出信号标记为-1
df['position'] = np.where(df['position'] == 1, 1, np.where(df['position'] == 0, 0, -1))

接下来,我们可以根据持仓情况计算每天的收益情况。当持仓为1时,我们假设每天的收益率等于股票当天的涨跌幅;当持仓为0时,收益率为0;当持仓为-1时,我们假设每天的收益率等于股票当天的负涨跌幅。最后,我们可以计算出总收益率和年化收益率,并将其输出到屏幕上:

# 计算每天的收益率
df['returns'] = df['close'].pct_change() * df['position'].shift()
df['returns'] = np.where(df['position'] == -1, -df['returns'], df['returns'])

# 计算总收益率和年化收益率
total_return = (df['returns'] + 1).cumprod()[-1]
annualized_return = (total_return ** (252 / len(df))) - 1

print(f'Total return: {total_return:.2f}')
print(f'Annualized return: {annualized_return:.2f}')

最后,我们可以将股票价格和均线画在一张图上,以便更直观地观察交易策略的效果:

# 画出股票价格和均线
plt.figure(figsize=(10, 6))
plt.plot(df['close'], label='Price')
plt.plot(df['ma10'], label='MA10')
plt.plot(df['ma30'], label='MA30')
plt.title('Stock Price and Moving Averages')
plt.legend(loc='upper left')
plt.show()

完整代码如下:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

# 获取股票历史数据
df = pd.read_csv('stock.csv', index_col=0)
df.index = pd.to_datetime(df.index)
df = df['2019-01-01':'2020-12-31']

# 计算10日和30日均线
df['ma10'] = df['close'].rolling(window=10).mean()
df['ma30'] = df['close'].rolling(window=30).mean()

# 计算交易信号和持仓情况
df['signal'] = np.where(df['ma10'] > df['ma30'], 1, 0)
df['position'] = df['signal'].shift()
df['position'] = np.where(df['position'] == 1, 1, np.where(df['position'] == 0, 0, -1))

# 计算每天的收益率
df['returns'] = df['close'].pct_change() * df['position'].shift()
df['returns'] = np.where(df['position'] == -1, -df['returns'], df['returns'])

# 计算总收益率和年化收益率
total_return = (df['returns'] + 1).cumprod()[-1]
annualized_return = (total_return ** (252 / len(df))) - 1

print(f'Total return: {total_return:.2f}')
print(f'Annualized return: {annualized_return:.2f}')

# 画出股票价格和均线
plt.figure(figsize=(10, 6))
plt.plot(df['close'], label='Price')
plt.plot(df['ma10'], label='MA10')
plt.plot(df['ma30'], label='MA30')
plt.title('Stock Price and Moving Averages')
plt.legend(loc='upper left')
plt.show()
你作为一个股票量化交易师用python写一个量化交易代码并进行验证

原文地址: https://www.cveoy.top/t/topic/bGLD 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录