等级: 免费版
- 注册:
- 2024-4-19
- 曾用名:
|
[size=1em][size=1em][size=1em]#!/usr/bin/env python
[size=1em]# coding: utf-8
[size=1em]# In[7]:
[size=1em]import pandas as pd
[size=1em]import matplotlib.pyplot as plt
[size=1em]import datetime
[size=1em]date=datetime.datetime.now()
[size=1em]# In[4]:
[size=1em]#可调节参数
[size=1em]A = 8 #均线
[size=1em]M = 0.04 #阀门
[size=1em]K = 0.001 #漂移函数 drift=time* K
[size=1em]C = 0.06#大波保护
[size=1em]D = C*0.9 #大波保护提升
[size=1em]E = 250 #长线保护
[size=1em]# In[5]:
[size=1em]def ma_math(stock_data,A):
[size=1em] return pd.Series.rolling(stock_data,window=A).mean()
[size=1em]# In[9]:
[size=1em]#参数
[size=1em]N = 500 #以过去N天为历史
[size=1em]stock = '002568.XSHE' #股票代码
[size=1em]stock_data = get_price(stock,count = N + A, end_date=date,fields = ['close'])['close']
[size=1em]ma = ma_math(stock_data,A)
[size=1em]plt.figure(figsize=[30,15])
[size=1em]plt.plot(stock_data,label='股价')
[size=1em]plt.plot(ma,label='10日均线')
[size=1em]#if len(stock_data) > 250:
[size=1em]# ma250 = ma_math(stock_data,250)
[size=1em]# plt.plot(ma250,label='250日均线')
[size=1em]#设置极值, 极值点Extreme Point(ep)
[size=1em]K_EPs = pd.DataFrame(columns=['date','trend','ep','lineno','groupno']) # 极值日期,极值方向(上为1,下为0),极值数值,在ma中的行号,多空组号(连续出现的多空方向一样的:同一组)
[size=1em]extreme_price = f_max = f_min = ma[A]
[size=1em]_groupno = 0
[size=1em]_last_trend = 2 # 为了不跟1,0相同,随便赋一个值
[size=1em]for i in range(A,len(ma)):
[size=1em] if ma > ((extreme_price * M) + extreme_price):
[size=1em] if _last_trend != 1:
[size=1em] _last_trend = 1
[size=1em] _groupno += 1 # 方向改变,组号+1
[size=1em] extreme_price = f_max = ma
[size=1em] K_EPs = K_EPs.append({'date':ma.index,'trend':1, 'ep':extreme_price,'lineno':i,'groupno': _groupno}, ignore_index=True)
[size=1em] if ma < (extreme_price - (extreme_price * M)):
[size=1em] if _last_trend != 0:
[size=1em] _last_trend = 0
[size=1em] _groupno += 1 # 方向改变,组号+1
[size=1em] extreme_price = f_min = ma
[size=1em] K_EPs = K_EPs.append({'date':ma.index,'trend':0, 'ep':extreme_price,'lineno':i,'groupno': _groupno}, ignore_index=True)
[size=1em]#
[size=1em]K_EPs.set_index('date',drop=True,inplace=True)
[size=1em]# print("目前值大为:",f_max)
[size=1em]# print("目前值小为:",f_min)
[size=1em]#画极值
[size=1em]fa_number=10 #画图极值的长度
[size=1em]for i in range(len(K_EPs)):
[size=1em] _lineno = K_EPs['lineno']
[size=1em] plt.plot(pd.Series(K_EPs['ep'] ,index = ma.index[_lineno:_lineno+fa_number]), color='red' if K_EPs['trend'] == 1 else 'green')
[size=1em]#画drift波段保护线
[size=1em]# 连续的同方向的极值点,是同一组,只保留最后一个(因为下降趋势是下降的,上升趋势是上升的,所以,下降时最后一个最小,或者上升时最后一个最大)
[size=1em]transit_points = K_EPs.drop_duplicates(subset=['groupno'], keep='last') # 同一组只保留最后一条记录
[size=1em]transit_points.reset_index(drop=True,inplace=True) # 重新索引
[size=1em]# 画漂移价格:极值*(1+n*K)
[size=1em]for i in range(len(transit_points)):
[size=1em] if i < (len(transit_points)-2):
[size=1em] s_drift = pd.Series(0.000 ,index = ma.index[transit_points['lineno']: transit_points['lineno'][i+2]]) # 从当前日期画到下一次同方向(trend)出现的日期
[size=1em] else:
[size=1em] s_drift = pd.Series(0.000 ,index = ma.index[transit_points['lineno']: ]) # 最后两个漂移线因空间不足另作处理
[size=1em] #
[size=1em] f_ep = transit_points['ep']
[size=1em] for j in range(len(s_drift)):
[size=1em] s_drift[j] = f_ep*(1 + j*K)
[size=1em] #
[size=1em] plt.plot(s_drift, color='red' if transit_points['trend']==1 else 'green')
[size=1em]
[size=1em]#drift大波保护线 两个参数一个是满足条件C,一个是提升项D,C尽可能的取大,D取相对C一半左右,C=40,D=20
[size=1em]# 要用到的数据 10日均线,只有处于下跌的极值数据方向为0,对应数据日期
[size=1em]#规则,每从最低点涨幅超过10%,上调5%
[size=1em]transit_0 = transit_points[transit_points.trend==0].reset_index(drop=True)
[size=1em]for i in range(len(transit_0)):
[size=1em] if i < (len(transit_0)-1):
[size=1em] s_protector = pd.Series(0.000, index=ma.index[transit_0['lineno']: transit_0['lineno'][i+1]]) # 一上一下,这一个波段经历的交易日
[size=1em] else:
[size=1em] s_protector = pd.Series(0.000, index=ma.index[transit_0['lineno']: ]) # 最后一个0突变点
[size=1em] #
[size=1em] midA = midB = transit_0['ep']
[size=1em] for j in range(len(s_protector)):
[size=1em] if s_protector.index[j] in K_EPs.index: # 如果是极值点
[size=1em] if K_EPs['ep'][s_protector.index[j]] > midB*(1+C): # ep>保护条件
[size=1em] midA = midB = midB*(1+D)
[size=1em] else:
[size=1em] midA = midA*(1+K)
[size=1em] else:
[size=1em] midA = midA*(1+K)
[size=1em] #
[size=1em] s_protector[j] = midA
[size=1em] #
[size=1em] plt.plot(s_protector, color='black')
[size=1em]#
[size=1em]plt.legend(loc='best')
[size=1em]plt.show()
[size=1em]# In[ ]:
|
|
|