首先需要导入需要使用的库,其中tushare和pandas为数据处理库,talib为技术指标库,openpyxl为导出excel所需的库。
```python
import tushare as ts
import pandas as pd
import talib as ta
from openpyxl import Workbook
```
接下来需要通过tushare的pro版本获取股票数据,这里以获取某只股票的日线数据为例。
```python
# 获取日线数据
pro = ts.pro_api('输入你的token')
df = pro.daily(ts_code='股票代码', start_date='开始日期', end_date='结束日期')
df = df.sort_values('trade_date', ascending=True)
df = df.reset_index(drop=True)
```
接下来需要计算出唐奇安通道的上轨和下轨。
```python
# 计算唐奇安通道上轨和下轨
high_list = df['high'].rolling(window=20).max()
low_list = df['low'].rolling(window=20).min()
df['upperband'] = high_list.shift(1)
df['lowerband'] = low_list.shift(1)
```
同时也需要计算出MACD指标的值。
```python
# 计算MACD指标
df['dif'], df['dea'], df['hist'] = ta.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
```
接下来需要编写一个函数来根据唐奇安通道和MACD指标来判断买入和卖出信号。
```python
# 根据唐奇安通道和MACD指标来判断买入和卖出信号
def get_signal(df):
signal_list = []
for i in range(len(df)):
if df.loc[i, 'close'] > df.loc[i, 'upperband'] and df.loc[i, 'hist'] > 0:
signal = 'sell'
elif df.loc[i, 'close'] < df.loc[i, 'lowerband'] and df.loc[i, 'hist'] < 0:
signal = 'buy'
else:
signal = ''
signal_list.append(signal)
return signal_list
df['signal'] = get_signal(df)
```
最后需要将结果导出到excel文件中。
```python
# 导出结果到excel文件
wb = Workbook()
ws = wb.active
headers = ['trade_date', 'open', 'high', 'low', 'close', 'upperband', 'lowerband', 'dif', 'dea', 'hist', 'signal']
ws.append(headers)
for i in range(len(df)):
row = [df.loc[i, 'trade_date'], df.loc[i, 'open'], df.loc[i, 'high'], df.loc[i, 'low'], df.loc[i, 'close'], df.loc[i, 'upperband'], df.loc[i, 'lowerband'], df.loc[i, 'dif'], df.loc[i, 'dea'], df.loc[i, 'hist'], df.loc[i, 'signal']]
ws.append(row)
wb.save('result.xlsx')
```
整合以上代码,得到完整的策略代码如下:
```python
import tushare as ts
import pandas as pd
import talib as ta
from openpyxl import Workbook
# 获取日线数据
pro = ts.pro_api('输入你的token')
df = pro.daily(ts_code='股票代码', start_date='开始日期', end_date='结束日期')
df = df.sort_values('trade_date', ascending=True)
df = df.reset_index(drop=True)
# 计算唐奇安通道上轨和下轨
high_list = df['high'].rolling(window=20).max()
low_list = df['low'].rolling(window=20).min()
df['upperband'] = high_list.shift(1)
df['lowerband'] = low_list.shift(1)
# 计算MACD指标
df['dif'], df['dea'], df['hist'] = ta.MACD(df['close'].values, fastperiod=12, slowperiod=26, signalperiod=9)
# 根据唐奇安通道和MACD指标来判断买入和卖出信号
def get_signal(df):
signal_list = []
for i in range(len(df)):
if df.loc[i, 'close'] > df.loc[i, 'upperband'] and df.loc[i, 'hist'] > 0:
signal = 'sell'
elif df.loc[i, 'close'] < df.loc[i, 'lowerband'] and df.loc[i, 'hist'] < 0:
signal = 'buy'
else:
signal = ''
signal_list.append(signal)
return signal_list
df['signal'] = get_signal(df)
# 导出结果到excel文件
wb = Workbook()
ws = wb.active
headers = ['trade_date', 'open', 'high', 'low', 'close', 'upperband', 'lowerband', 'dif', 'dea', 'hist', 'signal']
ws.append(headers)
for i in range(len(df)):
row = [df.loc[i, 'trade_date'], df.loc[i, 'open'], df.loc[i, 'high'], df.loc[i, 'low'], df.loc[i, 'close'], df.loc[i, 'upperband'], df.loc[i, 'lowerband'], df.loc[i, 'dif'], df.loc[i, 'dea'], df.loc[i, 'hist'], df.loc[i, 'signal']]
ws.append(row)
wb.save('result.xlsx')
```