julia分析股市的【春季躁动】(1)—— 个股在Q3被基金持仓与该股本次春季躁动中的涨跌幅分析

前言

又到了一年一度的春季躁动时期,最近看了一些研报,自己也学着动手实现一些研报里面的东西,感谢研报。
免责声明:本文为自己写着玩的,仅供参考,请勿照搬结论去实操。

摘要

本文关注点:Q3季度被基金加仓的股票,它在即将到来的春季躁动(统计范围:头年12年到次年4月)里涨跌幅有什么变化?

【1】持股基金家数的影响:
不是基金持有的家数越多,春季躁动就越能躁,正好相反,基金持有越少的股票,波动越大。

【2】持股占流通市值比例的影响
✦ 总体来看,持股占比大的个股,不一定就能够上涨
✦ 持股占比越小,股价波动越大
✦ 持股占比不超过15%的时候,上涨的概率平均为53%
✦ 持股占比在3% - 5.5%区间,上涨的概率平均为55.9%

【3】加减仓带来的影响:
用【加减仓幅度占当时流通市值的百分比】作为一个观察指标,观察它与【春季躁动涨跌幅】的关系

加仓情况:
总体情况:上涨次数4514次,下跌次数3743次,上涨概率54.7%, 下跌概率45.3%。基金加仓的股票赢面比较大,特别是当加仓幅度占比流通市在0~4%的时候,区间的上涨概率平均达到56%

减仓情况:
总体情况:上涨次数2775次,下跌次数2712次,上涨概率50.6%, 下跌概率49.4%,基金减仓不一定必然下跌。
甚至小幅减仓的股票,减仓幅度在(0~4%)的股票,春季躁动上涨概率达到51.4%。

【4】最优方案
持股占流通市值比例 在0~5.6%
加仓占流通市值比例 在0~4%

【5】希望在本次春季躁动中吃到肉的朋友,应该关注更多的因素
✦ 十四五规划
✦ 近期的多次经济会议
✦ 美国大选(关注政策,因为涉及到贸易、人才网来、技术交流,特别是芯片相关产业被制裁状况。。。。。大豆。。。。。。种子。。。。。。)
✦ 分析历史上各个板块甚至各只股票在春季躁动中的表现,挖掘一些关联因素
✦ 题材和新闻

正文开始

image.png

一、源数据——Q3基金持仓与春季躁动涨跌幅信息

二、Q3季度基金持仓与涨跌幅的散点图

y轴是春季躁动的涨跌幅(%),x轴是持有该股的基金的家数。
(一)散点图分析:
👉👉观点:从图像上看,持仓家数很多的股票,春季躁动时大幅波动的可能性比较小。
👉👉猜测:多家基金持仓的股票,市值比较大,不容易躁动。
从图上看,上涨幅度大于下跌的幅度

(二)相关性分析:【Q3持仓的基金家数】与【春季躁动涨跌幅】之间,线性相关的系数为:0.0022541672526532022。几乎无关。

image.png

附:基金重仓的个股一览


image.png

(三)分析【持股占流通市值比例%】与【涨跌幅%】的关系

【持股占流通市值比例%】与【涨跌幅%】


image.png

总体来看,持股所占比例越小,股价长得越好。这个图可以对比【持股家数】与【涨跌幅】关系。

在指标【持股占流通市值比例%】的各个阶段,【上涨次数】和【下跌次数】观察


image.png

image.png

从图上看,在10%以内,上涨次数显著大于下跌次数,也就是取胜的概率比较大。

取胜的次数观察


image.png

取胜的概率


image.png
image.png

上涨概率与持股比例 的 线性相关系数为:-0.6317735418647588

👉👉结论
✦ 总体来看,持股占比大的个股,不一定就能够上涨
✦ 持股占比越小,股价波动越大
✦ 持股占比不超过15%的时候,上涨的概率平均为53%
✦ 持股占比在3% - 5.5%区间,上涨的概率平均为55.9%

三、【Q3季度加仓】与【春季躁动涨跌幅】的关系

(一) 图形总结:
👉👉粗略来看:加仓不一定上涨,减仓不一定下跌,加减仓幅度为0%附近的波动最大。

image.png

(二)相关系数: 【季报持仓变动(万股)】与【春季躁动涨跌幅】之间,线性相关的系数为:0.005090697804711154,基本为0

(三)加仓时上涨与下跌次数统计*

(1)加仓的情况:
👉👉总体情况:上涨次数4514次,下跌次数3743次,上涨概率54.7%, 下跌概率45.3%。基金加仓的股票赢面比较大

image.png

#代码
df1 = q_df |> copy
df1[!,"加减仓flag"] = df1[!,"季报持仓变动(万股)"] .|> val-> val > 0.0 ? "+" : "-"
df1_up = @linq df1 |> where((:加减仓flag .== "+").&(:chg .>= 0.0))
println("加仓情况下,春季躁动上涨的家数:$(size(df1_up)[1])")
df1_down = @linq df1 |> where((:加减仓flag .== "+").&(:chg .<= 0.0))
println("加仓情况下,春季躁动下跌的家数:$(size(df1_down)[1])")

4514 / (4514 + 3743)  
3743 / (4514 + 3743)
draw_gain_line2(@linq df1 |> where((:加减仓flag .== "+")))

**(2)减仓的情况:
👉👉总体情况:上涨次数2775次,下跌次数2712次,上涨概率50.6%, 下跌概率49.4%,基金减仓不一定必然下跌。

👉👉猜测:应该细分基金减仓的原因,如果是基本面变坏或者黑天鹅,另当别论,不然一般的减仓,春季躁动时,股价不一定必然下跌

image.png

#减仓时上涨与下跌的次数统计
df1 = q_df |> copy
df1[!,"加减仓flag"] = df1[!,"季报持仓变动(万股)"] .|> val-> val > 0.0 ? "+" : "-"
df1_up = @linq df1 |> where((:加减仓flag .== "-").&(:chg .>= 0.0))
println("减仓情况下,春季躁动上涨的家数:$(size(df1_up)[1])")
df1_down = @linq df1 |> where((:加减仓flag .== "-").&(:chg .<= 0.0))
println("减仓情况下,春季躁动下跌的家数:$(size(df1_down)[1])")

四、统一刻度,【加减仓万股】 统一成 【加减仓占流通市值比例】,统一量纲,方便分析

image.png
#👉👉统一x轴后的图形👉👉
df3 = q_df |> copy
df3[!,"上季报持股总量(万股)"] = df3[!,"持股总量(万股)"] .- df3[!,"季报持仓变动(万股)"]
df3[!,"上季报持股占流通股比(%)"] = df3[!,"上季报持股总量(万股)"]  .*  df3[!,"持股占流通股比(%)"] ./ df3[!,"持股总量(万股)"]
df3[!,"加减仓占流通股比(%)"] = df3[!,"持股占流通股比(%)"] .- df3[!,"上季报持股占流通股比(%)"]
CSV.write("data/df3.csv",df3) 

#画图
x = df3[!,"加减仓占流通股比(%)"]
y = df3.chg
p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
display(p1)

计算相关性:

cor(df3[!,"加减仓占流通股比(%)"],q_df.chg)|> println

0.014869453164465881


image.png
image.png

加减仓处在什么范围内时,胜率最高
上涨次数与下跌次数的观察

image.png

上涨次数是否多余下跌的次数【上涨次数-下跌次数】


image.png

上涨的概率
加仓幅度占流通市值百分比处在(0,4%)以内的时候,上涨概率大于50%且最稳定,平均值为56%,


image.png

五、个人冒昧总结:

本文关注点:Q3季度被基金加仓的股票,它在即将到来的春季躁动(统计范围:头年12年到次年4月)里涨跌幅有什么变化?

【1】持股基金家数的影响:
不是基金持有的家数越多,春季躁动就越能躁,正好相反,基金持有越少的股票,波动越大。(详见 二、(二))
【2】持股占流通市值比例的影响
✦ 总体来看,持股占比大的个股,不一定就能够上涨
✦ 持股占比越小,股价波动越大
✦ 持股占比不超过15%的时候,上涨的概率平均为53%
✦ 持股占比在3% - 5.5%区间,上涨的概率平均为55.9%
【3】加减仓带来的影响:
用【加减仓幅度占当时流通市值的百分比】作为一个观察指标,观察它与【春季躁动涨跌幅】的关系
加仓情况:
总体情况:上涨次数4514次,下跌次数3743次,上涨概率54.7%, 下跌概率45.3%。基金加仓的股票赢面比较大,特别是当加仓幅度占比流通市在0~4%的时候,区间的上涨概率平均达到56%

减仓情况:
总体情况:上涨次数2775次,下跌次数2712次,上涨概率50.6%, 下跌概率49.4%,基金减仓不一定必然下跌。
甚至小幅减仓的股票,减仓幅度在(0~4%)的股票,春季躁动上涨概率达到51.4%。

【4】希望在本次春季躁动中吃到肉的朋友,应该关注更多的因素
✦ 十四五规划
✦ 近期的多次经济会议
✦ 美国大选(关注政策,因为涉及到贸易、人才网来、技术交流,特别是芯片相关产业被制裁状况。。。。。大豆。。。。。。种子。。。。。。)
✦ 分析历史上各个板块甚至各只股票在春季躁动中的表现,挖掘一些关联因素
✦ 题材和新闻

本文结束,拍砖的朋友手下留情,附上草稿代码(未作整理,自己留底用)。

六、猜测的最优方案

image.png
image.png
image.png
image.png
image.png

七、附录:分析时用到的手稿代码

julia + juno + jqdata

using CSV
using DataFrames
using DataFramesMeta
using Dates
using XLSX
using Statistics

include("common.jl")

#👉👉读取各年的基金持股信息,放入一个表中👈👈
all_years = 2010:2020
all_df = DataFrame()
for years in all_years
    println(years)
    df = DataFrame(XLSX.readtable("data/各年Q3被基金重仓后的股票/重仓持股(汇总)$(years)年Q3.xlsx","Sheet1")...)
    df[!,"躁动年份"] .= years + 1
    append!(all_df,df)
end
all_df
all_df |> names |> println

#👉👉读取春季躁动各年的 统计时间段👈👈
kpc_df = DataFrame(XLSX.readtable("data/年份开平仓日期.xlsx","sheet1")...)
kpc_dict = Dict()
for r in kpc_df |> eachrow
    years = r.年份
    kc_date = r.开仓日期
    pc_date = r.平仓日期
    kpc_dict[years] = (开仓日期 = kc_date, 平仓日期 = pc_date)
end
kpc_dict

#👉👉增加开仓时点和平仓时点【春季躁动起始时段】👈👈
all_df[!,"开仓日期"] .= Date("1970-01-01")
all_df[!,"平仓日期"] .= Date("1970-01-01")

for r in eachrow(all_df)
    躁动年份 = r.躁动年份
    if 躁动年份 ∈  [y for y in 2011:2020]
        r.开仓日期 = kpc_dict[躁动年份].开仓日期
        r.平仓日期 = kpc_dict[躁动年份].平仓日期
    end
end


first(all_df,10) |> println
#读取股票的k线数据,保存到dict里面
codes = all_df.代码 |> unique

#👉👉读取沪深300的数据👈👈
kind = "指数"
stock = "399300"
kline_directory = "D:/juliaWorkSpace/k线"  #k线位置
df300 = read_kline(kind, stock, kline_directory)
df300 |> display

#👉👉读取股票信息表👈👈
stocks_dict = Dict()
for stock in codes
    println(stock)
    kind = "股票"
    stock = split(stock,".")[1] |> string
    if length(stock) < 6 #有港股代码,需要排除
        continue #for
    end

    kline_directory = "D:/juliaWorkSpace/k线"  #k线位置
    df = read_kline(kind, stock, kline_directory)

    #判断停牌,用沪深300来判断,左连接操作
    df = leftjoin(select(df300, ["day"]), df, on = :day)
    df[!, "停牌"] = df.close .|> ismissing

    #填补空值 ismissing的值,用上一个单元格的值来填补
    for idx = 1:size(df)[1]
        if idx > 1
            for col in names(df)
                if ismissing(df[idx, col])
                    df[idx, col] = df[idx-1, col]
                end
            end
        end
    end

    stocks_dict[stock] = df
end

stocks_dict

#👉👉生成涨跌幅数据👈👈
all_df[!, "chg"] .= 0.0
for r in eachrow(all_df)
    code = split(r.代码, ".")[1] |> string
    if code |> length == 6
        chg = get_price_chg(code, r.开仓日期, r.平仓日期, stocks_dict).期末涨幅
        r.chg = chg == "no_price" ? NaN : chg
        if isnan(r.chg)
            println(code,r.开仓日期)
        end
    end
end
all_df

CSV.write("data/ddddd.csv",all_df)
first(all_df,10) |> println


#👉👉分析数据👉👉
q_df = @linq all_df |> where(:躁动年份 .< 2021)
gd = groupby(q_df,[:躁动年份,:所属行业])
tj_df = combine(gd,nrow,:chg => mean)
tj_df = sort(tj_df,[:躁动年份,:chg_mean],rev = true)
CSV.write("data/各年各行业春季躁动最佳行业.csv",tj_df)

cor(q_df.持有基金数,q_df.chg)|> println


#👉👉画图分析👈👈
using Plots
gr()
Plots.GRBackend()

"""
功能:画收益曲线,包含【回测组合收益线】 + 【基准收益线】
输入:dataframe,,包含“基准”和“组合”的价格时间系列,【日期】,【基准】,【组合】
输出:data/收益曲线.svg
"""
function draw_gain_line(df)
    x = df.持有基金数
    y = df.chg
    p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
    #savefig("data/收益曲线.svg")
    #println("收益曲线保存在:data/收益曲线.svg")
    display(p1)
end

draw_gain_line(q_df)

"""
【季报持仓变动】与【涨跌幅】关系
"""
function draw_gain_line2(df)
    x = df[!,"季报持仓变动(万股)"]
    y = df.chg
    p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
    #savefig("data/收益曲线.svg")
    #println("收益曲线保存在:data/收益曲线.svg")
    display(p1)
end

cor(q_df[!,"季报持仓变动(万股)"],q_df.chg)|> println

draw_gain_line2(q_df)

q_df |> names

#【持仓占流通市值比例】与【chg】的关系
x = q_df[!,"持股占流通股比(%)"]
y = q_df.chg
p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
display(p1)


#👉👉加仓时上涨与下跌次数统计👉👉
df1 = q_df |> copy
df1[!,"加减仓flag"] = df1[!,"季报持仓变动(万股)"] .|> val-> val > 0.0 ? "+" : "-"
df1_up = @linq df1 |> where((:加减仓flag .== "+").&(:chg .>= 0.0))
println("加仓情况下,春季躁动上涨的家数:$(size(df1_up)[1])")
df1_down = @linq df1 |> where((:加减仓flag .== "+").&(:chg .<= 0.0))
println("加仓情况下,春季躁动下跌的家数:$(size(df1_down)[1])")

4514 / (4514 + 3743)
3743 / (4514 + 3743)
draw_gain_line2(@linq df1 |> where((:加减仓flag .== "+")))

#👉👉减仓时上涨与下跌的次数统计👉👉
df1 = q_df |> copy
df1[!,"加减仓flag"] = df1[!,"季报持仓变动(万股)"] .|> val-> val > 0.0 ? "+" : "-"
df1_up = @linq df1 |> where((:加减仓flag .== "-").&(:chg .>= 0.0))
println("减仓情况下,春季躁动上涨的家数:$(size(df1_up)[1])")
df1_down = @linq df1 |> where((:加减仓flag .== "-").&(:chg .<= 0.0))
println("减仓情况下,春季躁动下跌的家数:$(size(df1_down)[1])")
draw_gain_line2(@linq df1 |> where((:加减仓flag .== "-")))

2775 / (2775 + 2712)
2712 / (2775 + 2712)

#👉👉统一x轴后的图形👉👉
df3 = q_df |> copy
df3[!,"上季报持股总量(万股)"] = df3[!,"持股总量(万股)"] .- df3[!,"季报持仓变动(万股)"]
df3[!,"上季报持股占流通股比(%)"] = df3[!,"上季报持股总量(万股)"]  .*  df3[!,"持股占流通股比(%)"] ./ df3[!,"持股总量(万股)"]
df3[!,"加减仓占流通股比(%)"] = df3[!,"持股占流通股比(%)"] .- df3[!,"上季报持股占流通股比(%)"]
CSV.write("data/df3.csv",df3)

#画图
x = df3[!,"加减仓占流通股比(%)"]
y = df3.chg
p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
display(p1)

cor(df3[!,"加减仓占流通股比(%)"],q_df.chg)|> println

#持仓占比与chg的关系
#画图
x = df3[!,"持股占流通股比(%)"]
y = df3.chg
p1 = plot(x,y,w = 1,seriestype = :scatter,size=(800,400),legend = false,  bg = RGB(0.2, 0.2, 0.2))
display(p1)

#👉👉加仓时上涨与下跌次数统计👉👉
df4 = df3 |> copy
df4[!,"加减仓flag"] = df4[!,"季报持仓变动(万股)"] .|> val-> val > 0.0 ? "+" : "-"
df4_up = @linq df4 |> where((:加减仓flag .== "+").&(:chg .>= 0.0))
println("加仓情况下,春季躁动上涨的家数:$(size(df1_up)[1])")
df4_down = @linq df4 |> where((:加减仓flag .== "+").&(:chg .<= 0.0))
println("加仓情况下,春季躁动下跌的家数:$(size(df1_down)[1])")

4514 / (4514 + 3743)
3743 / (4514 + 3743)
#画图
f(df4) = begin
    x = df4[!, "加减仓占流通股比(%)"]
    y = df4.chg
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = false,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end

f(@linq df4 |> where(:加减仓flag .== "+" ))
f(@linq df4 |> where(:加减仓flag .== "-" ))
cor(df4_up[!,"加减仓占流通股比(%)"],df4_up.chg)|> println

"""
细分刻度后,统计加减仓每个刻度区间的胜率
"""
function fenxi(pct_start,pct_end,df3)
    q_df = df3[df3[!,"加减仓占流通股比(%)"] .|> (val) -> pct_start < val <= pct_end,:]  #注意,不能全闭或者全开
    CSV.write("data/q_df111.csv",q_df)
    println(size(q_df))
    if size(q_df,1) > 0
        up_df = @linq q_df |> where(:chg .>= 0.0)
        println("up:",size(up_df,1))
        down_df = @linq q_df |> where(:chg .<= 0.0)
        println("down:",size(down_df,1))
        (up = size(up_df,1),down = size(down_df,1) )
    else
        (up = 0,down = 0 )
    end
end

"""
给定一个区间,按照步进值,划分成小区间
"""
function gen_pct_step()
    step_pct = 0.5
    start_pct = -40
    end_pct = 40

    current_pct = 0.0
    res = []
    for i in 1:10000
        pct1 = start_pct
        pct2 = pct1 + step_pct
        push!(res,[pct1,pct2])
        if pct2 < end_pct
            start_pct += step_pct
        else
            break
        end
    end
    res
end

pcts = gen_pct_step()
pcts .|> println

res_df = DataFrame(pct1 = [],pct2 = [],ups = [],downs = [])
for (pct1,pct2) in pcts
    println(pct1,pct2)
    res = fenxi(pct1,pct2,df3)
    push!(res_df,[pct1,pct2,res.up,res.down])
end
res_df
CSV.write("data/res_df.csv",res_df)

#👉👉画图 显示在各个区间里面,上涨次数和下跌的次数👉👉
f(df4) = begin
    x = df4.pct2
    y = [df4.ups,df4.downs]
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df)


#👉👉显示在各个区间里面,【上涨次数】减去【下跌次数】👉👉
res_df[!,"和"] = res_df.ups .+ res_df.downs
res_df[!,"上涨减下跌次数"] = res_df.ups .- res_df.downs

f(df4) = begin
    x = df4.pct2
    y = df4.上涨减下跌次数
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df)


#👉👉上涨的概率分析👉👉
res_df[!,"上涨概率"] .= 0.0
for r in eachrow(res_df)
    if r.和 > 0.0
        r.上涨概率 = r.ups / r.和  * 100
    end
end
f(df4) = begin
    x = df4.pct2
    y = df4.上涨概率
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df)

cor(res_df.pct2,res_df.上涨概率) |> println

CSV.write("data/res_df.csv",res_df)

#👉👉分析【持股占流通市值比例】 与 【chg】之间的关系👉👉
"""
统计【持仓占流通市值比例】的细分刻度区间,上涨的概率
"""
function fenxi2(pct_start,pct_end,df3)
    q_df = df3[df3[!,"持股占流通股比(%)"] .|> (val) -> pct_start < val <= pct_end,:]  #注意,不能全闭或者全开
    if size(q_df,1) > 0
        up_df = @linq q_df |> where(:chg .>= 0.0)
        println("up:",size(up_df,1))
        down_df = @linq q_df |> where(:chg .<= 0.0)
        println("down:",size(down_df,1))
        (up = size(up_df,1),down = size(down_df,1) )
    else
        (up = 0,down = 0 )
    end
end

"""
给定一个区间,按照步进值,划分成小区间
"""
function gen_pct_step2(step_pct,start_pct,end_pct)
    step_pct = step_pct
    start_pct = start_pct
    end_pct = end_pct

    current_pct = 0.0
    res = []
    for i in 1:10000
        pct1 = start_pct
        pct2 = pct1 + step_pct
        push!(res,[pct1,pct2])
        if pct2 < end_pct
            start_pct += step_pct
        else
            break
        end
    end
    res
end

pcts = gen_pct_step2(0.5,0.0,60.0)
pcts .|> println

res_df2 = DataFrame(pct1 = [],pct2 = [],ups = [],downs = [])
for (pct1,pct2) in pcts
    println(pct1,pct2)
    res = fenxi2(pct1,pct2,df3)
    push!(res_df2,[pct1,pct2,res.up,res.down])
end
res_df2
CSV.write("data/res_df2.csv",res_df2)


#👉👉画图 显示在各个区间里面,上涨次数和下跌的次数👉👉
f(df4) = begin
    x = df4.pct2
    y = [df4.ups,df4.downs]           #line 
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df2)


#👉👉显示在各个区间里面,【上涨次数】减去【下跌次数】👉👉
res_df2[!,"和"] = res_df2.ups .+ res_df2.downs
res_df2[!,"上涨减下跌次数"] = res_df2.ups .- res_df2.downs

f(df4) = begin
    x = df4.pct2
    y = df4.上涨减下跌次数
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df2)


#👉👉上涨的概率分析👉👉
res_df2[!,"上涨概率"] .= 0.0
for r in eachrow(res_df2)
    if r.和 > 0.0
        r.上涨概率 = r.ups / r.和  * 100
    end
end
f(df4) = begin
    x = df4.pct2
    y = df4.上涨概率
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df2)

f(df4) = begin
    x = df4.pct2
    y = df4.上涨概率
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df2)

CSV.write("data/res_df2.csv",res_df2)
cor(res_df2.pct2,res_df2.上涨概率) |> println

#👉👉猜测的最优方案验证👉👉
#加仓占比在 【0%-4%】  持股占比【0-10%】
df3 |> names |> println

df33 = df3 |> copy
df33 =  df33[df33[!,"加减仓占流通股比(%)"] .|> item-> 0.0 < item <= 4.0,:]
df33 =  df33[df33[!,"持股占流通股比(%)"] .|> item-> 0.0 < item <= 10.0,:]

f(df4) = begin
    x = df4[!,"持股占流通股比(%)"] 
    y = df4.chg
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(df33)

cor(df33[!,"持股占流通股比(%)"] ,df33.chg) |> println


pcts = gen_pct_step2(0.2,0.0,10.0)
pcts .|> println

res_df3 = DataFrame(pct1 = [],pct2 = [],ups = [],downs = [])
for (pct1,pct2) in pcts
    println(pct1,pct2)
    res = fenxi2(pct1,pct2,df33)
    push!(res_df3,[pct1,pct2,res.up,res.down])
end
res_df3


#👉👉画图 显示在各个区间里面,上涨次数和下跌的次数👉👉
f(df4) = begin
    x = df4.pct2
    y = [df4.ups,df4.downs]           #line 
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df3)


#👉👉显示在各个区间里面,【上涨次数】减去【下跌次数】👉👉
res_df3[!,"和"] = res_df3.ups .+ res_df3.downs
res_df3[!,"上涨减下跌次数"] = res_df3.ups .- res_df3.downs

f(df4) = begin
    x = df4.pct2
    y = df4.上涨减下跌次数
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df3)


#👉👉上涨的概率分析👉👉
res_df3[!,"上涨概率"] .= 0.0
for r in eachrow(res_df3)
    if r.和 > 0.0
        r.上涨概率 = r.ups / r.和  * 100
    end
end
f(df4) = begin
    x = df4.pct2
    y = df4.上涨概率
    p1 = plot( x,y,w = 1,seriestype = :line,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df3)

f(df4) = begin
    x = df4.pct2
    y = df4.上涨概率
    p1 = plot( x,y,w = 1,seriestype = :scatter,size = (800, 400),legend = true,bg = RGB(0.2, 0.2, 0.2),)
    display(p1)
end
f(res_df3)

CSV.write("data/res_df3.csv",res_df3)

cor(res_df3.上涨概率 ,res_df3.pct2) |> println

res_df31 = @linq res_df3 |> where(0.0 .< :pct2 .< 5.6)

cor(res_df31.上涨概率 ,res_df31.pct2) |> println

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容