最近在写形态分析,目前综合交易模型还支持行业概念,行业成分股等


行业成分股分析识别游戏

文化传媒

分析的原理
双重底是经典的形态选股策略,市场认可度比较高。要准确的实现双重底,还是需要一定的计算量,根据算法的灵活度越大,计算量越大。

算法自定义词汇说明:
- 以实际交易日期为X横坐标,某只股票的价格为Y纵坐标; 2. 一个交易日,就会出现一条K线。以当前需要回测的日期为终点,往历史时间选择一个大区间N天;
- 将大区间一分为二,简化处理,两个小区间完全相等,分别包含N/2条K线。命名为:可变化区间1,可变化区间2,简称区间1,区间2.
算法实现过程:
<pre class="public-DraftStyleDefault-pre" data-offset-key="146qn-0-0"><pre class="Editable-styled" data-block="true" data-editor="en50e" data-offset-key="146qn-0-0"><div data-offset-key="146qn-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="146qn-0-0"><span data-text="true"># 1. 找区间1的极小值,为左底
2. 找区间2的极小值,为右底
3. 找左底与右底之间区域的极大值
4. 比较左底与右底的涨幅,是否相差<3%
5. 比较左底与右底的macd值,是否形成底背离
6. 终点日期收盘价,是否突破颈线位
以下条件可选
7. 比较左底与右底的成交额,是否左底成交额>右底成交额
8. 比较左底与极大值之间涨跌幅,是否>N%(判断颈线位幅度)
9. 比较左底与右底之间,是否出现过涨停(判断股性活跃程度)
10. 其他</span></span></div></pre></pre>
里面有一个参数n可用选择不同的时间一般40-60
程序分析的效果比如股票 002368


对比同花顺

可转债
123205

对比同花顺

etf基金
159869

对比同花顺

长周期比如120日



结果

调用例子的源代码
<pre class="public-DraftStyleDefault-pre" data-offset-key="lju9-0-0"><pre class="Editable-styled" data-block="true" data-editor="en50e" data-offset-key="lju9-0-0"><div data-offset-key="lju9-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="lju9-0-0"><span data-text="true">#统一数据接口,支持股票,可转债,etf
from trader_tool.unification_data import unification_data
data=unification_data(trader_tool='qmt')
data=data.get_unification_data()
行业板块数据
东方财富
from stock_industry_data.stock_industry_em_data import stock_industry_em_data
同花顺行业数据
from stock_industry_data.stock_industry_ths_data import stock_industry_ths_data
industry_data=stock_industry_em_data()
形态分析
from stock_pattern_recognition.stock_pattern_recognition import stock_pattern_recognition
获取数据
通达信数据
from trader_tool.tdx_data import tdx_data
tdx_data=tdx_data()
tdx_data.connect()
股票
stock='002368'
df=data.get_hist_data_em(stock=stock)
show显示分析结果股票
models=stock_pattern_recognition(df=df,show=True,name=stock)
print(models.get_stock_w_bottom(n=120))
可转债
stock='123205'
df=data.get_hist_data_em(stock=stock)
show显示分析结果股票
models=stock_pattern_recognition(df=df,show=True,name=stock)
print(models.get_stock_w_bottom(n=120))
ETF
stock='159869'
df=data.get_hist_data_em(stock=stock)
show显示分析结果股票
models=stock_pattern_recognition(df=df,show=True,name=stock)
print(models.get_stock_w_bottom(n=120))
</span></span></div></pre></pre>
综合交易模型计算的源代码
<pre class="public-DraftStyleDefault-pre" data-offset-key="2ge7u-0-0"><pre class="Editable-styled" data-block="true" data-editor="en50e" data-offset-key="2ge7u-0-0"><div data-offset-key="2ge7u-0-0" class="public-DraftStyleDefault-block public-DraftStyleDefault-ltr"><span data-offset-key="2ge7u-0-0"><span data-text="true">def get_stock_w_bottom(self,n=60):
'''
W底 n整数
1. 找区间1的极小值,为左底
# 2. 找区间2的极小值,为右底
# 3. 找左底与右底之间区域的极大值
# 4. 比较左底与右底的涨幅,是否相差<3%
# 5. 比较左底与右底的macd值,是否形成底背离
# 6. 终点日期收盘价,是否突破颈线位
# 以下条件可选
# 7. 比较左底与右底的成交额,是否左底成交额>右底成交额
# 8. 比较左底与极大值之间涨跌幅,是否>N%(判断颈线位幅度)
# 9. 比较左底与右底之间,是否出现过涨停(判断股性活跃程度)
# 10. 其他
算法自定义词汇说明:
1. 以实际交易日期为X横坐标,某只股票的价格为Y纵坐标;
2. 一个交易日,就会出现一条K线。以当前需要回测的日期为终点,往历史时间选择一个大区间N天;
3. 将大区间一分为二,简化处理,两个小区间完全相等,分别包含N/2条K线。命名为:可变化区间1,可变化区间2,简称区间1,区间2.
————————————————
'''
try:
#一半的数据
n_2=int(n/2)
#最近N天
df=self.df[-n:]
#价格列表
close_list=df['close'].tolist()
#开始的价格
open_price=close_list[0]
#现在的价格
last_price=close_list[-1]
#左边的数据
left_df=df[-n:-n_2]
#右边的数据
right_df=df[-n_2:]
# 1. 找区间1的极小值,为左底
#左边的最小值
left_min_value=min(left_df['close'].tolist())
#最小值的位置
left_min_value_index=close_list.index(left_min_value)
# 2. 找区间2的极小值,为右底
#右边的最小值
right_min_value=min(right_df['close'].tolist())
#右边最小值的位置
right_min_value_index=close_list.index(right_min_value)
# 3. 找左底与右底之间区域的极大值
#中间最大的价格,是否突破颈线位
middle_max_value=max(df[left_min_value_index:right_min_value_index]['close'].tolist())
# 4. 比较左底与右底的涨幅,是否相差<3%,不同周期不一样
up_and_down=((right_min_value-left_min_value)/left_min_value)*100
# 5. 比较左底与右底的macd值,是否形成底背离
# 6. 终点日期收盘价,是否突破颈线位
break_through=''
if last_price>=middle_max_value:
break_through=True
else:
break_through=False
# 以下条件可选
# 7. 比较左底与右底的成交额,是否左底成交额>右底成交额
left_volume=left_df['volume'].sum()
right_volume=right_df['volume'].sum()
trading_volume=''
if left_volume>=right_volume:
trading_volume=True
else:
trading_volume=False
# 8. 比较左底与极大值之间涨跌幅,是否>N%(判断颈线位幅度)
# 9. 比较左底与右底之间,是否出现过涨停(判断股性活跃程度)
df['涨停']=df['涨跌幅'].apply(lambda x: '涨停' if round(x)==10 else '不涨停')
limt_stats=''
if df[df['涨停']=='涨停'].shape[0]>0:
limt_stats=True
else:
limt_stats=False
#目前颈线位核限制价格的涨跌幅
mid_return=((last_price-middle_max_value)/middle_max_value)*100
#通用我w底,其他的条件可以自己价
#绘制突破
if self.show==True:
w_list=[]
for i in close_list:
if i in [open_price,last_price,left_min_value,right_min_value,middle_max_value]:
w_list.append(i)
else:
w_list.append(None)
self.plot_kline_figure(df=df,name_list=['底','线'],data_type=['点','线'],data_list=[w_list,middle_max_value,df['close'].tolist()])
else:
pass
if left_min_value<=right_min_value and mid_return>=3:
return True
else:
return False
except:
return False</span></span></div></pre></pre>
源代码+交易模型领取、QMT开通、策略分享、问题答疑,评论区留言或私信。