def signal(gpdm, gpmc, start, m1, m, n, in_threshold, de_threshold): tdxday = Tdxday(gpdm) ohlc = tdxday.get_qfqdata(start=start) if ohlc.empty: return None ohlc.ta.doublebottom(append=True, m1=m1, m=m, n1=n1, n=n, in_threshold=in_threshold, de_threshold=de_threshold) sc = get_gpfl(gpdm)[0].upper() gpdm = f'{gpdm}.{sc}' gpmc1 = get_gpmc_fromdb(gpdm) ohlc = pd.merge(ohlc, gpmc1, on='date', how='outer') ohlc = ohlc.sort_index() ohlc['gpmc'].fillna(method='ffill', inplace=True) # 下句对于新股,数据库中还没有日期对应名称的情况进行处理 ohlc.loc[ohlc['gpmc'].isnull(), 'gpmc'] = gpmc ohlc = ohlc.assign(date=ohlc.index) start1 = '20180101' ohlc = ohlc.loc[(ohlc['date'] >= start1)] # ohlc1 = ohlc.loc[(ohlc['double_bott'] == 1)] # ohlc = selefirstsignal(ohlc) # if ohlc1.empty: # return None ohlc = ohlc.assign(gpdm=tdxday.gpdm) ohlc = ohlc.assign(ssdate=tdxday.ssdate) df = dfsortcolumns(ohlc, subset='gpdm,gpmc,ssdate,date,close') # 注意:df.iloc[-1]返回的是pandas.core.series.Series # 下句-1后面有冒号,返回的是pandas.core.frame.DataFrame。“:”不能少, # return df.iloc[-1:] return df
def signal(gpdm, start, m1, m, n, in_threshold, de_threshold): tdxday = Tdxday(gpdm) ohlc = tdxday.get_qfqdata(start=start) if ohlc.empty: return None ohlc.ta.doublebottom(append=True, m1=m1, m=m, n1=n1, n=n, in_threshold=in_threshold, de_threshold=de_threshold) try: # 新股由于交易天数少,无法计算,会出现没有返回 # double_bott,double_bott1列的情况 # signals = ohlc.loc[(ohlc['double_bott'] == 1)] # signals = ohlc.loc[(ohlc['double_bott1'] == 1)] signals = ohlc.loc[(ohlc['double_bott2'] == 1)] except: return None if not signals.empty: signals = signals.assign(date=signals.index) signals = signals.assign(gpdm=tdxday.gpdm) signals = signals.assign(gpmc=tdxday.gpmc) return dfsortcolumns(signals, subset='gpdm,gpmc,date') return None
def signal(gpdm): tdxday = Tdxday(gpdm) start = '20170101' ohlc = tdxday.get_qfqdata(start=start) if ohlc.empty: return None ohlc.ta.bottompattern(append=True) signals = ohlc.loc[(ohlc['BOTTOM_REVERSAL'] == 1)] if not signals.empty: signals['date'] = signals.index signals['gpdm'] = tdxday.gpdm signals['gpmc'] = tdxday.gpmc return signals[['date', 'gpdm', 'gpmc']] return None
def get_macd(df): columns = [] for col in ['macd_', 'macds_', 'macdh_']: matches = df.columns.str.match(col, case=False) match = [i for i, x in enumerate(matches) if x] if len(match) != 1: print('macd指标有误') return None columns.append(df.columns[match[0]]) return df[columns] if __name__ == '__main__': import sys filename = '603093' tdxday = Tdxday(filename) # stock = tdxday.get_data_yahoo(start='20180101') # stock = tdxday.get_qfqdata(start='20180101', otype='ohlc') # stock = tdxday.get_data_backtrader(start='20180101') # scdm = stock.scdm # stock.to_csv(f"{scdm}{filename}.csv") stock = tdxday.get_qfqdata(start='20130101') stock.ta.doublebottom(append=True, in_threshold=0.3, de_threshold=-0.2) stock.to_csv('tmp1.csv') sys.exit() stock.ta.alligator(append=True) stock.ta.macd(append=True) stock.ta.fractals(append=True) stock.ta.bottomreversal(append=True)
# [('Buy', 'buy'), ('Sell', 'sell'), ('Short', 'short'), ('Cover', 'cover')] for f_int, f_ext in zip(int_mask, ext_mask): obj = dataobj.get(f_ext) if isinstance(obj, pd.Series): df[f_int] = obj else: df[f_int] = None if any([isinstance(x, pd.Series) for x in list(df.values())]): return pd.DataFrame(df) return None if __name__ == '__main__': filename = '002456' tdxday = Tdxday(filename) ohlc = tdxday.get_qfqdata(start='20170101') sys.exit() # pybacktest.Backtest通过从python locals()提取交易原始数据 # pandas DataFrame的名称可以命名为'ohlc', 'bars', 'ohlcv' # 数据格式遵循Amibroker的命名约定,date(index),O(open),H(high), # L(low),C(close) # 信号Series的名称buy,sell,cover(Boy to Cover),short(Sell Short) ohlc = tdxday.get_data_pybacktest(start='20110101') ohlc.ta.fractals(high='H', low='L', open='O', close='C', append=True) ohlc.ta.bottomreversal(high='H', low='L', open='O', close='C', append=True) ohlc.ta.topreversal(high='H', low='L', open='O', close='C', append=True) scdm = ohlc.scdm ohlc.to_csv(f"{scdm}{filename}.csv") # buy买入,sell卖出,Buy to Cover 空单补回,Sell Short 卖空
author: huangyunbin email: [email protected] QQ: 592440193 """ from stock_pandas.tdx.tdxdayread import Tdxday from stock_pandas.tdx.tdxcfg import Tdx from stock_pandas.tdx.class_func import * import pandas_ta as ta if __name__ == '__main__': filename = '600138' tdxday = Tdxday(filename) df2 = tdxday.get_qfqdata(start='20190101') df2.ta.bottomreversal(append=True) # df2.to_csv('tmp1.csv') # df2.ta.alligator(append=True) # df2 = df2.assign(bias = 100 * (df2['close'] - df2['ALLIGATOR_TEETH_8_5']) / df2['ALLIGATOR_TEETH_8_5']) # df2.ta.fractals(append=True) # df2=df2.assign(A=(df2['bias']>15),B=(df2['bias']<-15)) #if __name__ == '__main__': # tdxday = Tdxday(r'D:\tdx\sz002294.day') # df = tdxday.get_data() # # df2 = get_data(r'D:\tdx\szlday\sz002294.day') #
QQ: 592440193 """ import pandas as pd import matplotlib.pyplot as plt import numpy as np from collections import OrderedDict from stock_pandas.tdx.tdxdayread import Tdxday from stock_pandas.tdx.tdxcfg import Tdx from stock_pandas.tdx.class_func import * import pandas_ta as ta filename = '600138' tdxday = Tdxday(filename) df = tdxday.get_qfqdata('20150101') rng_date = df.index df = df.reset_index() #重新按行号建立索引 def tick_category(frequency, step): ''' 刻度分类:根据频率和频数获取刻度的时间轴 frequency 可取值: 'year','month','day','hour','minute','second' ''' if frequency == 'year': df['frequency'] = rng_date.strftime('%Y') elif frequency == 'month':
for t in troughs.index: for p in peaks.index: if p > t: z = (peaks[p] / troughs[t] - 1) * 100 if (zf is None) or zf < z: zf = z tt = t pp = p return tt.strftime('%Y-%m-%d'), pp.strftime('%Y-%m-%d'), round(zf, 2) if __name__ == "__main__": gpdm = '002451' tdxday = Tdxday(gpdm) start = '20180101' end = '20191231' df = tdxday.get_qfqdata(start=start, end=end) ds = round(df['close'], 4) sys.exit() # 波峰:大于前一,同时大于后一或等于后一且大于后二 p = (ds.diff(1) > 0) & ((ds.diff(-1) > 0) | ((ds.diff(-1) == 0) & (ds.diff(-2) > 0))) peaks = ds.loc[p] # 波谷:小于前一,同时小于后一或等于后一且小于后二 t = (ds.diff(1) < 0) & ((ds.diff(-1) < 0) | ((ds.diff(-1) == 0) & (ds.diff(-2) < 0))) troughs = ds.loc[t] # 起始点 start = pd.Series([ds[0]], index=[ds.index[0]])
for n in maxset: df1 = hhv(ds, n) df = df.join(df1) for n in minset: df1 = llv(ds, n) df = df.join(df1) # df = df.drop(columns=[name]) return df maxmin.__doc__ = \ ''' 思路:假定股价经过较长时间的盘整,近期拉升,最近回调。通过查找n天内和n1天内的高点 如果两个高点重合,即确定该高点为近期高点(位置idxmax)。再从idxmax往前查找m天内和 m1天内点近远两个低点(idxmin,idxmin1), ''' if __name__ == '__main__': from stock_pandas.tdx.tdxdayread import Tdxday from stock_pandas.tdx.class_func import * gpdm = '600734' start = '20180101' tdxday = Tdxday(gpdm) ohlc = tdxday.get_qfqdata(start=start) close = ohlc.close df = maxmin(ohlc.close)
# sys.exit() data = [] j = 30 k = 20 n = 20 m = 60 ln = len(df) start_time = time.time() for i, gpxx in df.iterrows(): print(i, ln, gpxx.gpdm, gpxx.gpmc, gpxx.date) dm = gpxx.gpdm[:6] gpmc = gpxx.gpmc date = gpxx.date.strftime('%Y-%m-%d') tdxday = Tdxday(dm) ohlc = tdxday.get_qfqdata(start='20160101') data.append([gpxx.gpdm, gpmc, date] + supershort(ohlc, date, j, k, n, m)) if ((i + 1) % 50 == 0) or (i >= ln - 1): now_time = time.time() t1 = now_time - start_time # 每只股票秒数 p = t1 / (i - k + 1) # 估计剩余时间 t1 = t1 / 60 t2 = (ln - i) * p / 60 print('------已用时%d分钟,估计还需要%d分钟' % (t1, t2))
# -*- coding: utf-8 -*- """ Created on 2019-10-06 20:41:34 author: huangyunbin email: [email protected] QQ: 592440193 """ import pandas as pd import matplotlib.pyplot as plt import numpy as np from collections import OrderedDict from stock_pandas.tdx.tdxdayread import Tdxday from stock_pandas.tdx.tdxcfg import Tdx from stock_pandas.tdx.class_func import * import pandas_ta as ta filename = '600138' tdxday = Tdxday(filename) df = tdxday.get_qfqdata() rng_date = df.index df = df.reset_index()
# list(zip(int_mask, ext_mask)) # [('Buy', 'buy'), ('Sell', 'sell'), ('Short', 'short'), ('Cover', 'cover')] for f_int, f_ext in zip(int_mask, ext_mask): obj = dataobj.get(f_ext) if isinstance(obj, pd.Series): df[f_int] = obj else: df[f_int] = None if any([isinstance(x, pd.Series) for x in list(df.values())]): return pd.DataFrame(df) return None if __name__ == '__main__': filename = '600674' tdxday = Tdxday(filename) ohlc = tdxday.get_data_pybacktest(start='20180101') short_ma = 10 long_ma = 60 ms = ohlc['C'].rolling(short_ma).mean() ml = ohlc['C'].rolling(long_ma).mean() # buy买入,sell卖出,cover,Short sell做空 buy = (ms > ml) & (ms.shift() < ml.shift()) # ma cross up sell = (ms < ml) & (ms.shift() > ml.shift()) # ma cross down # buy = cover = (ms > ml) & (ms.shift() < ml.shift()) # ma cross up # sell = short = (ms < ml) & (ms.shift() > ml.shift()) # ma cross down #