python :tushare 唐奇安通道

唐奇安通道(Donchian Channel)指标是由 Richard Donchian 提出的一个由三条线组成的通道指标,这三条线分别是过去n日的最高价、过去n日的最低价以及过去n日最高价和最低价的均值,形状看起来很像通道,所以叫这个名字。

stock_dc.py

# coding: utf-8
import os, sys
#import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import tushare as ts

if len(sys.argv) ==2:
    code = sys.argv[1]
else:
    print('usage: python stock_dc.py stockcode ')
    sys.exit(1)

if len(code) !=6:
    print('stock code length: 6')
    sys.exit(2)

# help(ts.get_k_data) 了解参数
df = ts.get_k_data(code, start='2021-01-01')
#print(df.head())
# 7日移动均线
df['ma7'] = df['close'].rolling(window=7).mean()

# 唐奇安通道(Donchian Channel)取过去20日的最高价,20日的最低价
df['up20'] = df['high'].shift(1).rolling(window=20).max()
df['down'] = df['low'].shift(1).rolling(window=20).min()
df['mid20'] = (df['up20']+df['down'])/2 
#print(df.head())
# 取样 2022年以后的数据
d2 = df[ df.date >'2022-01-01']
print(d2.tail())
d2.index = pd.to_datetime(d2.date)
# 画股价走势图
d2[['close','up20','mid20','down']].plot(grid=True, title=code)
plt.legend(loc='best', shadow=True)
plt.show()

运行 python stock_dc.py 600030

 

首先需要导入需要使用的库,其中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') ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值