python抢茅台_利用python进行股票技术分析--以茅台为例

"""

利用python进行股票技术分析--以茅台为例

通过下述策略对利用python进行股票技术分析,可以举一反三,并且能够实现复杂的技术分析策略,同时可以同python的宏观数据、公司基本面数据、舆情等分析结合起来。

策略原理:在股票下跌过程中,当出现上涨锤子线,显示行情先继续下跌后出现大幅反弹,行情可能由此反转;

利用均线识别下跌趋势,以下跌趋势中出现锤子线,同时以RSI出现超卖,三种信号出现作为开仓信号;

采用移动止损方式进行止损,止损条件:当天最低价 < max(均价-观察期内一定倍数的标准差,开仓价-开仓时标准差)

"""

# 1、设置参数变量

stock_code='600519' #股票代码

start_time='2018-01-01' #开始时间

end_time='2020-02-15' #截止时间

body_range=0.05 #实体线波动范围

head_length=0.5 #上影线长度

tail_length=2 #下影线长度

ma_period=9 #均线周期

rsi_period=5 #rsi周期

rsi_oversell=30 #超卖

stoplose_std=2 #止损标准差倍数

# 2、抓取股票日线数据并加工处理

stock_data=ts.get_k_data(stock_code,start=start_time,end=end_time)

stock_data.sort_index(ascending=True,inplace=True)

stock_data.reset_index(inplace=True)

del stock_data['volume']

del stock_data['code']

stock_data=pd.DataFrame(stock_data)

#计算每天的收益变化

stock_data['perday_change']=stock_data['close'].pct_change()

#计算指标,当天交易的时候只能用上一天的数据:

stock_data['ma']=ta.SMA(np.asarray(stock_data['close']),timeperiod=ma_period)

stock_data['rsi']=ta.RSI(np.asarray(stock_data['close']),timeperiod=rsi_period)

stock_data['std']=stock_data['close'].rolling(ma_period).std()

stock_data['y_ma']=stock_data['ma'].shift(1)

stock_data['y_rsi']=stock_data['rsi'].shift(1)

stock_data['y_std']=stock_data['std'].shift(1)

#计算锤子线形态并判断是否为锤子线:实体线变化范围在一定范围内,下影线要是实体线的一定倍数,上影线要小于下影线一定倍数,当天交易的时候只能用上一天的数据:

stock_data['st_body']=abs(stock_data['open']-stock_data['close'])

stock_data['s_head']=stock_data['high']-stock_data[['open','close']].max(axis=1)

stock_data['x_tail']=stock_data[['open','close']].min(axis=1)-stock_data['low']

stock_data['r_body']=np.where(stock_data['st_body']/stock_data['open']

stock_data['r_head']=np.where(stock_data['s_head']==0,False,stock_data['s_head']/stock_data['x_tail']

stock_data['r_tail']=np.where(stock_data['st_body']==0,True,stock_data['x_tail']/stock_data['st_body']>tail_length)

stock_data['chuizi']=stock_data[['r_body','r_head','r_tail']].all(axis=1)

stock_data['y_chuizi']=stock_data['chuizi'].shift(1)

#3、绘图显示股票的价格、均线、RSI

# 对ts获取到的数据转换成candlestick_ohlc()方法可读取的格式

data_list = []

data_ma=[]

for dates,row in stock_data.iterrows():

# 将时间转换为数字

date_time = datetime.datetime.strptime(row['date'],'%Y-%m-%d')

t = date2num(date_time)

open,high,low, close= row[['open','high','low','close']]

datas = (t,open,high,low,close)

data_list.append(datas)

data_ma.append(t)

# 创建子图

fig, ax = plt.subplots(figsize=(20, 10))

fig.subplots_adjust(bottom=0.2)#子图所在区域的边界

ax.xaxis_date()# 设置X轴刻度为日期时间

plt.xticks()

plt.yticks()

plt.title("股价走势K线图")

plt.xlabel("时间")

plt.ylabel("股价(元)")

mpf.candlestick_ohlc(ax,data_list,width=0.5,colorup='r',colordown='green')

plt.plot(data_ma,stock_data['y_ma'],color='b')

plt.legend()

plt.grid()

fig, ax = plt.subplots(figsize=(20, 10))

fig.subplots_adjust(bottom=0.2)#子图所在区域的边界

ax.xaxis_date()# 设置X轴刻度为日期时间

plt.plot(data_ma,stock_data['y_rsi'],color='r')

plt.title('RSI指标')

plt.legend()

plt.grid()

#4、计算交易过程和逻辑编写:只有同时满足均线、RSI和锤子线三者条件才下单,并计算收益和止损

flag=0 #flag表示持仓记录,0代表空仓,1代表持仓

for i in range(2*ma_period,len(stock_data)):

if flag==0:

#满足三个条件才开仓,并计算收益

if stock_data.loc[i-ma_period,'y_ma']>stock_data.loc[i,'y_ma'] and stock_data.loc[i,'y_rsi']

flag=1

long_openprice=stock_data.loc[i,'open']

long_gap=stock_data.loc[i,'y_std']

stock_data.loc[i,'return']=stock_data.loc[i,'close']/stock_data.loc[i,'open']-1

stock_data.loc[i,'mark']=100

if flag==1:

#设置止损价格,达到止损条件平仓

long_stoplose=max(stock_data.loc[i,'y_ma']-stoplose_std*stock_data.loc[i,'y_std'],long_openprice-long_gap)

if stock_data.loc[i,'low']

flag=0

stock_data.loc[i,'return']=min(stock_data.loc[i,'open'],long_stoplose)/stock_data.loc[i-1,'close']-1

stock_data.loc[i,'mark']=-100

else:

#持仓过程中计算收益

stock_data.loc[i,'return']=stock_data.loc[i,'close']/stock_data.loc[i-1,'close']-1

stock_data.loc[i,'mark']=200

#5、计算策略收益率并绘图,通过曲线图直观显示收益情况,从图表中显示最终获得收益为1.63倍。

stock_data['return'].fillna(0,inplace=True)

stock_data['strategy_return']=(stock_data['return']+1).cumprod()

stock_data['stock_return']=(stock_data['perday_change']+1).cumprod()

fig2 = plt.figure(figsize=(20,10))

ax2 = fig2.add_subplot(1,1,1)

ax2.plot(stock_data.stock_return,color='b')

ax2.plot(stock_data.strategy_return,color='r')

plt.title(stock_code)

plt.legend()

plt.grid()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值