如何利用python构建A股的可视化复盘流程

一,目标确定
利用大盘的成交量,红盘个股个数,同时结合南北资金的流动情况,可以大致观察到近期的市场热度,同时从技术层面来看,结合K线均线,也可以了解到目前的市场趋势。个股的运行,离不到行业的趋势,也离不开所在指数板块的趋势。指数的共振,造成了市场的综合走势。
通过分析以上的数据,得出近期市场的应对策略。

二,数据获取
数据获取,主要通过tushare获取。获取的包括南北向资金的数据、大盘基础数据还有相关指数的数据。下载后,为了更方便快捷地提取数据,也可以保存在本地。由于tushare其获取的数据为DataFrame模式为主,可以方便地进行相关的运算,期间会产生很多中间变量,所以不对所有数据进行保存,不然工作量相对较大,同时意义并不太大。其最终获取的数据,汇总主要如下:
在这里插入图片描述
三,数据清洗
在本次处理中,数据清洗主要围绕数据的格式进行,对于缺失数据,我们为了保持时间序列的连续性和真实性,并不做替代处理。比如,如果获取的是港股通的数据,由于不同的节假日,可能会造成数据缺失,但不代表其是坏数据。如果盲目删除,是不恰当的。部分数据清洗及格式转换的代码如下:

#市场热度的构建
#近期时间取值
now=datetime.now()
st=now-6*Day()
Endtime=now
Endtime=Endtime.strftime("%Y%m%d")

dates=pd.date_range(st,periods=7)
date_str=dates.strftime('%Y%m%d')
date_str
EarningEffect_arr=[EarningEffect1,EarningEffect2,EarningEffect3,EarningEffect4,EarningEffect5,EarningEffect6,EarningEffect7]
EarningEffect_arr.reverse()
EarningEffect_arr=np.nan_to_num(EarningEffect_arr) #此处把NAN值置于为0,方便后面绘图。
EarningEffect_arr=np.round(EarningEffect_arr,1)
EarningEffect_arr

四,数据整理与分析
第一部分:赚钱效应的分析
这部分主要通过近期成交量和红盘(即今日收盘价大于昨日收盘价 )家数进行分析 。通过可视化的手段,反映趋势。由于代码相对较多,主要提取核心部分进行分析:

#导入相关的库,用于构建系统时利用。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from datetime import  datetime
from pandas.tseries.offsets import Day

import seaborn as sns
from pyecharts import Bar,Line,Grid,Overlap,Gauge
from pyecharts import online
online() # needed for online viewing
#以下解决方案是针对可视化时,用pyecharts
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
#把提取的7天的行情数据保存起来。
df_dailys=[]
for i in range(0,7):
    df_dailys_temp=pro.daily(trade_date=date_str[i])
    df_dailys.append(df_dailys_temp)  

同时,我们需要对行情数据进行保存,共中倒数第7天的实现代码给出,其他天数的类似可得,我们把每天的赚钱效应,定义一个数组保存起来。

#倒7天的赚钱效应
D7_red_count=D7[D7.close>D7.pre_close].count().ts_code
D7_count=D7.ts_code.count()
EarningEffect7=(D7_red_count/D7_count*100)

#EarningEffect7=('%.2f' % (D7_red_count/D7_count*100))
#EarningEffect7=float(EarningEffect7)

EarningEffect_arr=[EarningEffect1,EarningEffect2,EarningEffect3,EarningEffect4,EarningEffect5,EarningEffect6,EarningEffect7]
EarningEffect_arr.reverse()
EarningEffect_arr=np.nan_to_num(EarningEffect_arr) #此处把NAN值置于为0,方便后面绘图。
EarningEffect_arr=np.round(EarningEffect_arr,1)
EarningEffect_arr

然后,把赚钱效应的数据先保存起来,在第一部分结束的时候,再结合市场热度,把它绘制在同一个图中,结合起来分析,更加直接高效。

Amount=[D7_amount,D6_amount,D5_amount,D4_amount,D3_amount,D2_amount,D1_amount]

Earn=list(EarningEffect_arr)
df_Amount_Earn=pd.DataFrame([date_str,Amount,Earn])
df_Amount_Earn=df_Amount_Earn.T
df_Amount_Earn=df_Amount_Earn.rename(columns={0:'日期',1:'成交量',2:'赚钱温度'})

df_Amount_Earn.to_excel('D:/PythonData/复盘/近一周赚钱效应0817.xlsx')

第一部分后半部分,是市场热度的构建,我们在这里引入pyecharts,借用overlap()将其绘制在一起,实现可视化,结果如下所示:
在这里插入图片描述
第一部分到此结束,前面部分,我们很快地构建了近期的复盘概貌,紧接着,我们分析南北资金的重要走向。

第二部分:南北资金分析

在这里,我们引入南北资金的流动情况,在于分析目前主要玩家对于当前市场的态度,这可以让我们决策多一步依据。其主要的实现过程如下:

attr=list(reversed(trade_date))

v1_temp=(Money_flow.hgt/100).round(1)
v1=list(reversed(v1_temp))

v2_temp=(Money_flow.sgt/100).round(1)
v2=list(reversed(v2_temp))

v3=(v1_temp+v2_temp).round(2)
v3=list(reversed(v3))

Money_flow_data=pd.DataFrame([attr,v1,v2,v3])
Money_flow_data.to_excel("D:/PythonData/北上资金近期流动情况.xlsx")

from pyecharts import Overlap

bar = Bar("北上资金近期流动情况","Hill编制:"+str(Endtime))
line=Line("")
bar.add("沪股通", attr, v1, is_stack=True)
bar.add("深股通", attr, v2, is_stack=True)
line.add("总流入",attr, v3)

overlap=Overlap()
overlap.add(bar)
overlap.add(line)

结果如下图:
在这里插入图片描述
从图中可以看出,当天北向资金呈现流出状态。这也是前一天过热之后的冷淡。对于市场情绪的观察,反过来,可以观察一下自身的情绪是否正常,做出的决策是否理智等。同时,如果我们想观察不同的周期下,其资金流动情况,可以通过将视窗口设置为滑动的模式,其主要代码实现如下:

days = Money_flow.trade_date
days_v1 = (Money_flow.north_money/100).round(1)
bar = Bar("北向资金流动情况(滑动查看)","Hill编制:"+Endtime)
bar.add(
    "",
    days,
    days_v1,
    # 默认为 X 轴,横向
    is_datazoom_show=True,
    datazoom_type="slider",
    datazoom_range=[1, 30],
    # 新增额外的 dataZoom 控制条,纵向
    is_datazoom_extra_show=True,
    datazoom_extra_type="slider",
    datazoom_extra_range=[-100, 100],
    is_toolbox_show=False,
    mark_line=['average'],
    mark_point=['max','min']
)
bar.render()
bar

运行,我们可以得到如下的bar图:
在这里插入图片描述
通过滑动下面的数据条,可以查看不同日期内的资金流动情况,比如只想查看近一周的,则可通过将下面的时间滑动到0714-0820即可。而通过右侧的数据条,则可以查看限定金额内的时间,如如说只想查看20亿以上的,则将工具条下方,滑动至20亿处即可。这样分析起来,比较方便,取决于我们的分析目的。

下面的代码,可帮助我们查看北向资金的具体持股情况
#获了北向持股名单 hk_hlod沪深港股通持股明细 ratio持股占比,vol持股数量(股)
SSH_stocks_all=pro.hk_hold(trade_date='20190819')

North_stocks_SH=pro.hk_hold(trade_date='20190819',exchange='SH')
North_stocks_SH.sort_values(by='ratio',inplace=True,ascending=False)

North_stocks_SZ=pro.hk_hold(trade_date='20190820',exchange='SZ')
North_stocks_SZ.sort_values(by='ratio',inplace=True,ascending=False)

North_stocks=pd.concat([North_stocks_SH,North_stocks_SZ])
North_stocks=North_stocks.sort_values(by='ratio',ascending=False)

North_stocks_SH
North_stocks_SZ

部分数据如下:
在这里插入图片描述
同时,如果我们想查看当天的top10股票,可通过以下代码实现:

df_hsgt_SHtop10=pro.hsgt_top10(trade_date='20190820', market_type='1')
df_hsgt_SZtop10=pro.hsgt_top10(trade_date='20190820', market_type='3')
df_hsgt_SZtop10
df_hsgt_SHtop10.sort_values(by='net_amount',ascending=False)

这样就可以得到北上当天交易的沪市前10股了:
在这里插入图片描述
第二部分到此结束。
第三部分:趋势评分系统的构建
趋势评分,主要对各大指数给出评级,评级依据为均线的强度,选取了20日近期均线,200日年线长期均线为参考,结合当天的点位情况进行判断。其核心代码如下:

#上证指数评分:最低为1分,最高为6分

#6分为多头区间;5分为震荡偏多区间;4分为震荡区间;3分为震荡区间;2分为震荡偏空区间,1分为空头区间
SHZ_Year=pro.index_daily(ts_code='000001.SH',start_date=Yeartime,end_date=Endtime).close.mean()
SHZ_Twenty=pro.index_daily(ts_code='000001.SH',start_date=TwentyDaystime,end_date=Endtime).close.mean()

SHZ_today=pro.index_daily(ts_code='000001.SH')
SHZ_today=SHZ_today.iloc[0,2]

#没有找到恰当的switch,还是用if_else吧
if (SHZ_today>SHZ_Twenty)&(SHZ_Twenty>SHZ_Year):  #此处表示上证指数目前位置高于20日均线,同时20日均线高于年线,多头空间,评分为max=6
    rank_SHZ=6
elif (SHZ_today>SHZ_Year)&(SHZ_Year>SHZ_Twenty):
    rank_SHZ=5
elif (SHZ_Twenty>SHZ_today)&(SHZ_today>SHZ_Year):
    rank_SHZ=4
elif (SHZ_Year>SHZ_today)&(SHZ_today>SHZ_Twenty):
    rank_SHZ=3
elif (SHZ_Twenty>SHZ_Year)&(SHZ_Year>SHZ_today):
    rank_SHZ=2
else:
    rank_SHZ=1
    
print(rank_SHZ)

上面的代码,得出了上证指数评级,同样对其他的6个指数也可以采用类似的方法实现。如深证成指,如下:

#深证指数评分:
SZC_Year=pro.index_daily(ts_code='399001.SZ',start_date=Yeartime,end_date=Endtime).close.mean()
SZC_Twenty=pro.index_daily(ts_code='399001.SZ',start_date=TwentyDaystime,end_date=Endtime).close.mean()

SZC_today=pro.index_daily(ts_code='399001.SZ')
SZC_today=SZC_today.iloc[0,2]

if (SZC_today>SZC_Twenty)&(SZC_Twenty>SZC_Year):  #此处表示上证指数目前位置高于20日均线,同时20日均线高于年线,多头空间,评分为max=6
    rank_SZC=6
elif (SZC_today>SZC_Year)&(SZC_Year>SZC_Twenty):
    rank_SZC=5
elif (SZC_Twenty>SZC_today)&(SZC_today>SZC_Year):
    rank_SZC=4
elif (SZC_Year>SZC_today)&(SZC_today>SZC_Twenty):
    rank_SZC=3
elif (SZC_Twenty>SZC_Year)&(SZC_Year>SZC_today):
    rank_SZC=2
else:
    rank_SZC=1
    
print(rank_SZC)

重复以上步骤,我们可以得到七个重要指数的评分了。
最后,我们综合评分:
首先,利用市值作为权重:

ranks=np.array([rank_SHZ,rank_SZC,rank_CYB,rank_ZXC,rank_SZ50,rank_HS300,rank_ZHZ500])
#采取市值方式赋权,这里可以采用其他方式赋权。
#8-17相应总市值(亿):中证500:74209;上证:319899;沪深300:350223;上证50:198903;深证成:204195;创业:51775;中小创:85129
ranks_Amount=np.array([319899,204195,51775,85129,198903,350223,319899])
ranks_Amount_sum=ranks_Amount.sum()
ranks_Amount_power=ranks_Amount/ranks_Amount_sum

print(ranks_Amount)
print(ranks_Amount_power)
print(ranks)
#采用评级重乘以权重,得到分值
rank=ranks_Amount_power*ranks
TrendRank=rank.sum()
TrendRank=round(TrendRank,2)
print(TrendRank)

结果如下:
在这里插入图片描述
而换一个思路,利用当天的成交量,可以得出不一致的结果,这个没有绝对的标准,我们只是希望找到一个赋权的参考。利用成交量,如下:

#采取当日成交量作为权重赋值
#上证指数000001.SH  沪深300指数000300.SH,上证50 000016.SH
#深证成指 399001.SZ  中小创399005.SZ  创业板399006.SZ  中证500指数 399905
df_float_mv = pro.index_dailybasic(trade_date='20190816', fields='ts_code,trade_date,float_mv,pe')
print(df_float_mv)

now_float_mv1=df_float_mv[df_float_mv.ts_code=='000001.SH'].float_mv
now_float_mv2=df_float_mv[df_float_mv.ts_code=='399001.SZ'].float_mv
now_float_mv3=df_float_mv[df_float_mv.ts_code=='399006.SZ'].float_mv
now_float_mv4=df_float_mv[df_float_mv.ts_code=='399005.SZ'].float_mv
now_float_mv5=df_float_mv[df_float_mv.ts_code=='000016.SH'].float_mv
now_float_mv6=df_float_mv[df_float_mv.ts_code=='000300.SH'].float_mv
now_float_mv7=df_float_mv[df_float_mv.ts_code=='399905.SZ'].float_mv  #这种提取方式有中括号

now_float_need=np.array([now_float_mv1.values,now_float_mv2.values,now_float_mv3.values,
                         now_float_mv4.values,now_float_mv5.values,now_float_mv6.values,now_float_mv7.values])

now_float_need=np.array(now_float_need).flatten()  #去掉ndarray中括号

now_float_need_sum=np.sum(now_float_need)
now_float_power=now_float_need/now_float_need_sum

print(ranks)
print(now_float_power)# after flatten

TrendRank_Float=np.sum(ranks*now_float_power)
TrankRenk_Float=np.round(TrendRank_Float,2)
TrankRenk_Float

结果如下:
在这里插入图片描述
评分等级的可视化:
在这里插入图片描述
最终参考仓位的可视化:
在这里插入图片描述
至此,我们的数据整理与分析到此结束。

第五部分:洞察与结论

数据的来源,可以来自于基面本,也可以来自于技术面。
而基本面的数据,自上而下,可以是宏观经济层面的,也可以中观行业层面,更可以是微观企业层面的。不同的数据分析维度都可以,这取决于我们对市场的判断标准。
技术面的数据,由远到近,由近到远,都可以,长中短周期的数据提取,也取决于我们的分析目标。
提取数据后,我们需要选取我们看重的维度进行思考,关心比例,还是关心趋势,还是关系彼此的关系,这些需要结合业务层面进行思考。
关心趋势,我们可以以时间序列为横轴,纵轴列出我们关心的时间的变化趋势;
关心比例,我们可以再总体和个体的关系通过饼图等方式呈现出来;
关心关系,则可以通过协方差,相关系数等项目计算出来,通过正负大小分析相关性。

通过趋势图,我们可以查看我们的结论。这里不做过多讨论了。在图表中,都给出了相关的说明。

不足:
这里思考到一个点,我们可以通过趋势线的相关共振历史,去预测趋势的变动情况。
这个属于回归与预测的内容,暂时不在这里展开了。

如果需要具体的代码,或者分析过程,或者对图表有解读不清楚的地方,可以与我联系。
Emai:[email protected]

猜你喜欢

转载自blog.csdn.net/Hill_L/article/details/99935011
今日推荐