菜牛保

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 267|回复: 0

ETF基金交易分析,超详细

[复制链接]

135

主题

135

帖子

415

积分

中级会员

Rank: 3Rank: 3

积分
415
发表于 2022-4-17 22:08:12 | 显示全部楼层 |阅读模式
基金的类型有许多种类,包括股票,债券,货币基金等,ETF是一种独特的基金,开放型交易基金,同时存在一级,二级市场,一般会出现折价,溢价的期情况,实物申购,实物赎回的特色交易方式,2个市场价格不同就会有套利机会,普通投资者一般进行不了套利,因为资金要求达不到,我们通过akshare获取ETF基金的数据,进行分析,我们也可以通过爬虫爬取东方财富ETF基金历史数据,数据如下



需要解析的数据如下



我们可以看到基金没有像股票那样数据多,我们进行数据转换在分析,我们提供macd,boll,rsi,均线系统等技术指标分析,同时通过QQ邮箱发生分析报告

我们将函数操作进行改进形成图形界面,方便我们进行分析,我们同时提供单一ETF基金分析,也提供多只ETF基金同时进行分析,多只ETF基金包括

funds=['512170','159981','516780','512760','','516160','515220','515790','512690']

    names=['医疗','能源化工','稀土','芯片','纳指','新能源','煤炭','光伏','白酒']

程序运行特别简单,选点击获取数据按钮,在进行相应的技术指标分析效果



我们点击获取数据按钮,效果





我们随便点击macd指标分析,效果



macd数据





我们也可以点击同时进行多只ETF分析按钮,效果



程序代码

from cgitb import text

from random import seed

import pandas as pd

import matplotlib.pyplot as plt

import akshare as ak

import easyquant

import quantstats as qs

from finta import TA

import mplfinance as mpf

import quantstats as qs

import yagmail

import PySimpleGUI as sg

import tkinter as tk

root=tk.Tk()

root.wm_title('图形界面')

root.geometry('500x600')

root.title('ETF基金交易分析')

#获取etf基金数据

def etf_fund_get_data(fund=None,name=None):

    fund=sg.popup_get_file('输入基金代码比如159981')

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df1=ak.fund_etf_fund_info_em(fund=fund)

    df=df1.sort_index(ascending=False)

    df['date']=df['净值日期']

    df['high']=df['单位净值'].rolling(window=4).max()

    df['low']=df['单位净值'].rolling(window=4).min()

    df['open']=df['单位净值'].rolling(window=4).mean()

    df['close']=df['单位净值'].rolling(window=5).mean()

    df['sma5']=df['单位净值'].rolling(window=5).mean()

    df['sma10']=df['单位净值'].rolling(window=10).mean()

    df['sma20']=df['单位净值'].rolling(window=20).mean()

    df['sma30']=df['单位净值'].rolling(window=30).mean()

    df['sma60']=df['单位净值'].rolling(window=60).mean()

    df['sma5-sma10']=df['sma5']-df['sma10']

    df['sma10-sma20']=df['sma10']-df['sma20']

    df['close-sma30']=df['单位净值']-df['sma30']

    df['close-sma60']=df['单位净值']-df['sma60']

    def sma5_sma10(x):

        if x>=0:

            return '买进'

        else:

            return '卖出'

    df['sma5-sma10交易记录']=df['sma5-sma10'].apply(sma5_sma10)

    df['sma10-sma30']=df['sma10']-df['sma30']

    df['sma30-sma60']=df['sma30']-df['sma60']

    def sma10_sma30(x):

        if x>=0:

            return '买进'

        else:

            return '卖出'

    df['sma10-sma30交易记录']=df['sma10-sma30'].apply(sma10_sma30)

    def zs(x):

        if x>=0:

            return '上升趋势,买进'

        else:

            return '下降趋势,卖出'

    df['趋势']=df['close-sma60'].apply(zs)

    df.to_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    print('获取基金数据')

    print(df)

#etf基金指标分析

def etf_fund_indicotor_analysis_macd(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    '''

    基金名称

    '''

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    macd=TA.MACD(df)

    macd['macd-signal']=macd['MACD']-macd['SIGNAL']

    def fx(x):

        if x>=0:

            return '上升趋势'

        else:

            return '下将趋势'

    macd['趋势']=macd['macd-signal'].apply(fx)

    def qrs(x):

        if x>=0:

            return '强势'

        else:

            return '弱势'

    macd['强弱势']=macd['SIGNAL'].apply(qrs)

    #检测金叉与死叉

    Type=[]

    for i in range(len(macd['MACD'].tolist())-1):

        MACD_pre=macd['MACD'].tolist()

        signal_pre=macd['SIGNAL'].tolist()

        MACD_now=macd['MACD'].tolist()[i+1]

        signal_now=macd['SIGNAL'].tolist()[i+1]

        if MACD_pre<signal_pre and MACD_now>signal_now:

            Type.append('普通金叉')

        elif MACD_pre>signal_pre and MACD_now<signal_now:

            Type.append('普通死叉')

        else:

            Type.append('无')

    Type.insert(0,'无')

    data=pd.DataFrame({'data':df['date'].tolist(),'MACD':macd['MACD'].tolist(),'SIGNAL':macd['SIGNAL'].tolist(),'macd-signal':macd['macd-signal'].tolist(),

    '趋势':macd['趋势'].tolist(),'强弱势':macd['强弱势'].tolist(),'金叉与死叉情况':Type})

    data.to_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}macd分析.xlsx'.format(name))

    print('macd分析')

    print(data)

#etf基金boll指标分析

def etf_fund_indicotor_analysis_boll(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    boll=TA.BBANDS(df)

    data=pd.DataFrame({'date':df['date'].tolist(),'open':df['open'].tolist(),'close':df['close'].tolist(),'high':df['high'].tolist(),'low':df['low'].tolist(),

    '上布林线':boll['BB_UPPER'].tolist(),'中布林线':boll['BB_MIDDLE'].tolist(),'下布林线':boll['BB_LOWER'].tolist()})

    data['close-上布林线']=data['close']-data['上布林线']

    def close_上布林线(x):

        if x>=0:

            return '加速上升趋势,但注意回撤'

        else:

            return '无'

    data['close-中布林线']=data['close']-data['中布林线']

    def close_中布林线(x):

        if x>=0:

            return '上升趋势,买入'

        else:

            return '下降趋势,卖出'

    data['close-下布林线']=data['close']-data['下布林线']

    def close_下布林线(x):

        if x<=0:

            return '超跌,有反弹反弹可以'

        else:

            return '无'

    data['上布林线-下布林线']=data['上布林线']-data['下布林线']

    data['趋势']=data['close-中布林线'].apply(close_中布林线)

    data['加速上升情况']=data['close-上布林线'].apply(close_上布林线)

    data['超跌情况']=data['close-下布林线'].apply(close_下布林线)

    data.to_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}boll分析.xlsx'.format(name))

    print('boll线分析')

    print(data)

#绘制etf基金股票图

def etf_fund_analysis_plot(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    plt.subplot(211)

    plt.rcParams['font.family']='SimHei'

    plt.rcParams['axes.unicode_minus']=False

    plt.plot(df['净值日期'],df['单位净值'],label='单位净值')

    plt.plot(df['净值日期'],df['sma5'],'--m',label='5日均线')

    plt.plot(df['净值日期'],df['sma10'],'--g',label='10日均线')

    plt.title(name)

    #显示多个标签

    plt.legend()

    plt.subplot(212)

    plt.rcParams['font.family']='SimHei'

    plt.rcParams['axes.unicode_minus']=False

    df['日增长率sma5']=df['日增长率'].rolling(window=5).mean()

    df['日增长率sma10']=df['日增长率'].rolling(window=10).mean()

    plt.plot(df['净值日期'],df['日增长率sma5'],'--g',label='5日均线')

    plt.plot(df['净值日期'],df['日增长率sma10'],'--r',label='10日均线')

    plt.plot(df['净值日期'],df['日增长率'],label='日涨跌幅')

    plt.title('日增长率')

    plt.legend()

    plt.show()

    #去掉无效数据

    df1=df.dropna()

    #重命名索引

    df1.rename(columns={'净值日期':'Date','open':'Open','close':'Close','high':'High','low':'Low'},inplace=True)

    #时间格式转换

    df1['Date']=pd.to_datetime(df1['Date'])

    #出现设置索引

    df1.set_index(['Date'],inplace=True)

    #设置股票颜色

    mc=mpf.make_marketcolors(up='g',down='r',edge='i')

    #设置系统

    s=mpf.make_mpf_style(marketcolors=mc)

    #绘制股票图,5,10,20日均线

    mpf.plot(df1,type='candle',style=s,mav=(5,10,20))

    #显示

    plt.show()

    df3=df1

    boll=TA.BBANDS(df3)

    plt.subplot(211)

    plt.rcParams['font.family']='SimHei'

    plt.rcParams['axes.unicode_minus']=False

    plt.plot(boll['BB_UPPER'],'--r',label='上轨线')

    plt.plot(boll['BB_MIDDLE'],'--m',label='中轨线')

    plt.plot(boll['BB_LOWER'],'--r',label='上轨线')

    plt.plot(df['净值日期'],df['单位净值'],label='单位净值')

    plt.rcParams['font.family']='SimHei'

    plt.rcParams['axes.unicode_minus']=False

    plt.title('boll')

    plt.legend()

    plt.subplot(212)

    plt.rcParams['font.family']='SimHei'

    plt.rcParams['axes.unicode_minus']=False

    macd=TA.MACD(df3)

    plt.plot(macd['MACD'],label='MACD')

    plt.axhline(y=0,color='m')

    plt.plot(macd['SIGNAL'],label='SIGNAL')

    plt.title('技术分析MACD'+name)

    plt.legend()

    plt.show()

#etf基金量化指标分析

def etf_quant_analysis(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    df.index=pd.to_datetime(df['date'])

    qs.extend_pandas()

    result=qs.reports.metrics(df['单位净值'])

    print(result)

#etf基金重要买卖点

def etf_fund_importtant_buy_sell(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    #检测大的波动,3%为标准

    def bd(x):

        if x>=0.03:

            return '上涨大波动'

        elif x<=-0.3:

            return '下跌大波动'

        else:

            return '无'

    df['波动']=df['日增长率'].apply(bd)

    gt=[]

    for x,y,m,z in zip(df['open'].tolist(),df['close'].tolist(),df['high'].tolist(),df['low'].tolist()):

        if x==z and y==m and y>x:

            gt.append('光头光脚大阳线')

        elif x==m and y==z and y<x:

            gt.append('光头光脚大阴线')

        else:

            gt.append('无')

    df=pd.DataFrame(({'date':df['date'].tolist(),'open':df['open'].tolist(),'close':df['close'].tolist(),

    'high':df['high'].tolist(),'low':df['low'].tolist(),'K线':gt,'大波动':df['波动'].tolist()}))

    df.to_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}重要买卖点.xlsx'.format(name))

    print('重要K线分析')

    print(df)

#etf基金均线系统分析

def etf_fund_mean_line_analysis(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    def sma30_line(x):

        if x>=0:

            return '30日上升趋势'

        else:

            return '30日下降趋势'

    df['30日趋势']=df['close-sma30'].apply(sma30_line)

    jc_1=[]

    for i in range(0,len(df['sma5'].tolist())-1):

        pre_sma5=df['sma5'].tolist()

        pre_sma10=df['sma10'].tolist()

        now_sma5=df['sma5'].tolist()[i+1]

        now_sma10=df['sma10'].tolist()[i+1]

        if pre_sma5<=pre_sma10 and now_sma5>now_sma10:

            jc_1.append('一线金叉,买进')

        elif pre_sma5>=pre_sma10 and now_sma5<now_sma10:

            jc_1.append('一线死叉,卖出')

        else:

            jc_1.append('无')

    jc_1.insert(0,0)

    jc_2=[]

    for i in range(0,len(df['sma10'].tolist())-1):

        pre_sma10=df['sma10'].tolist()

        pre_sma30=df['sma30'].tolist()

        now_sma10=df['sma10'].tolist()[i+1]

        now_sma30=df['sma30'].tolist()[i+1]

        if pre_sma10<=pre_sma30 and now_sma10>now_sma30:

            jc_2.append('二线金叉,买进')

        elif pre_sma10>=pre_sma30 and now_sma10<now_sma30:

            jc_2.append('二线死叉,卖出')

        else:

            jc_2.append('无')

    jc_2.insert(0,0)

    jc_3=[]

    for i in range(0,len(df['sma30'].tolist())-1):

        pre_sma30=df['sma30'].tolist()

        pre_sma60=df['sma60'].tolist()

        now_sma30=df['sma30'].tolist()[i+1]

        now_sma60=df['sma60'].tolist()[i+1]

        if pre_sma30<=pre_sma60 and now_sma30>now_sma60:

            jc_3.append('三线金叉,买进')

        elif pre_sma30>=pre_sma60 and now_sma30<now_sma60:

            jc_3.append('三线死叉,卖出')

        else:

            jc_3.append('无')

    jc_3.insert(0,0)

    data=pd.DataFrame({'date':df['date'].tolist(),'5日均线':df['sma5'].tolist(),'10日均线':df['sma10'].tolist(),'30日均线':df['sma30'].tolist(),

    '60日均线':df['sma60'].tolist(),'30趋势':df['30日趋势'].tolist(),'一线金叉情况':jc_1,'二线金叉情况':jc_2,'三线金叉情况':jc_3})

    data.to_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}均线分析.xlsx'.format(name))

    print('均线分析')

    print(data)

#发送qq邮箱报告

def etf_fund_seed_email(name=None):

    name=sg.popup_get_file('输入ETF名称比如新能源')

    yag=yagmail.SMTP(user='1752515969@qq.com',password='ijhfyywgoxjabdec',host='smtp.qq.com')

    text=[]

    df=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    import ffn

    max_drawdowm=ffn.calc_max_drawdown(df['close'])

    max_drawdowm_30=ffn.calc_max_drawdown(df['close'][-30:])

    text.append('股票最近一个月的最大回撤为{}'.format(max_drawdowm_30))

    text.append('股票最近一个月的压力位{}'.format(max(df['close'].tolist()[-30:])))

    text.append('股票现价距离压力位还有{}'.format(max(df['close'].tolist()[-30:])-df['close'].tolist()[-1]))

    text.append('股票最近一个月的支撑位{}'.format(min(df['close'].tolist()[-30:])))

    text.append('股票现价距离支撑位位还有{}'.format(df['close'].tolist()[-1]-min(df['close'].tolist()[-30:])))

    text.append('最近5天股票数据分析情况')

    data=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}数据.xlsx'.format(name))

    text.append(data[-5:])

    text.append('最近5天均线分析情况')

    data_mean_5=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}均线分析.xlsx'.format(name))

    text.append(data_mean_5[-5:])

    text.append('macd最近5天数据分析情况')

    data_macd=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}macd分析.xlsx'.format(name))

    text.append(data_macd[-5:])

    text.append('boll最近5天数据分析情况')

    data_boll=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}boll分析.xlsx'.format(name))

    text.append(data_boll[-5:])

    text.append('重要买卖点最近5天数据分析情况')

    data_buy_sell=pd.read_excel(r'C:\Users\Administrator\Desktop\etf基金交易分析\{}重要买卖点.xlsx'.format(name))

    text.append(data_buy_sell[-5:])

    yag.send(to='1029762153@qq.com',contents=text,subject='{}基金分析报告'.format(name))

    print('{}基金报告邮箱发送成功'.format(name))

#同时进行多只etf基金分析

def more_etf_fund():

    funds=['512170','159981','516780','512760','','516160','515220','515790','512690']

    names=['医疗','能源化工','稀土','芯片','纳指','新能源','煤炭','光伏','白酒']

    for i in range(len(funds)):

        #获取基金数据,处理数据

        etf_fund_get_data(fund=funds,name=names)

        #boll指标分析

        etf_fund_indicotor_analysis_boll(name=names)

        #macd指标分析

        etf_fund_indicotor_analysis_macd(name=names)

        #重要买卖点分析

        etf_fund_importtant_buy_sell(name=names)

        #均线系统分析

        etf_fund_mean_line_analysis(name=names)

        #发送研究报告

        etf_fund_seed_email(name=names)

tk.Label(text='ETF基金交易分析',bg='yellow',width=70,font=20).grid()

tk.Label(text='运行方式,先点击获取数据按钮,在点击其他分析方式',bg='red',width=70,font=20).grid()

tk.Button(root,text='获取处理ETF基金数据',command=etf_fund_get_data,font=20).grid()

tk.Button(root,text='ETF基金数据macd指标分析',command=etf_fund_indicotor_analysis_macd,font=20).grid()

tk.Button(root,text='ETF基金数据boll指标分析',command=etf_fund_indicotor_analysis_boll,font=20).grid()

tk.Button(root,text='ETF基金数据股票图绘制',command=etf_fund_analysis_plot,font=20).grid()

tk.Button(root,text='ETF基金量化指标分析',command=etf_quant_analysis,font=20).grid()

tk.Button(root,text='ETF基金重要买卖点分析',command=etf_fund_importtant_buy_sell,font=20).grid()

tk.Button(root,text='ETF基金均线系统分析',command=etf_fund_mean_line_analysis,font=20).grid()

tk.Button(root,text='ETF基金发送qq邮箱报告',command=etf_fund_seed_email,font=20).grid()

tk.Button(root,text='同时进行多个ETF基金分析',command=more_etf_fund,font=20).grid()

root.mainloop()
         
作者:数据分析与运用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|菜牛保

GMT+8, 2024-11-28 11:41 , Processed in 0.036184 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表