Skip to content

Commit

Permalink
股票筛选输出前10大流通股东
Browse files Browse the repository at this point in the history
  • Loading branch information
axiaoxin committed Jul 17, 2021
1 parent e49815e commit 55ac42f
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 17 deletions.
42 changes: 31 additions & 11 deletions datacenter/eastmoney/free_holders.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,31 +16,51 @@ import (

// FreeHolder 流通股东
type FreeHolder struct {
EndDate string `json:"END_DATE"`
HolderName string `json:"HOLDER_NAME"`
HolderCode string `json:"HOLDER_CODE"`
HoldNum int `json:"HOLD_NUM"`
// 日期
EndDate string `json:"END_DATE"`
// 股东名称
HolderName string `json:"HOLDER_NAME"`
// 股东代码
HolderCode string `json:"HOLDER_CODE"`
// 持股数
HoldNum int `json:"HOLD_NUM"`
// 占流通股比
FreeHoldnumRatio float64 `json:"FREE_HOLDNUM_RATIO"`
FreeRatioQoq string `json:"FREE_RATIO_QOQ"`
IsHoldorg string `json:"IS_HOLDORG"`
HolderRank int `json:"HOLDER_RANK"`
// 环比增减
FreeRatioQoq string `json:"FREE_RATIO_QOQ"`
// 1:机构 0:个人
IsHoldorg string `json:"IS_HOLDORG"`
// 持股数排名
HolderRank int `json:"HOLDER_RANK"`
}

// FreeHolderList ...
type FreeHolderList []FreeHolder

func (f FreeHolderList) String() string {
s := []string{}
for i, h := range f {
fs := fmt.Sprintf("%d.%s|%.2f%%|%v", i+1, h.HolderName, h.FreeHoldnumRatio, h.FreeRatioQoq)
s = append(s, fs)
}
return strings.Join(s, "</br>")
}

// RespFreeHolders QueryFreeHolders 返回json结构
type RespFreeHolders struct {
Version string `json:"version"`
Result struct {
Pages int `json:"pages"`
Data []FreeHolder `json:"data"`
Count int `json:"count"`
Pages int `json:"pages"`
Data FreeHolderList `json:"data"`
Count int `json:"count"`
} `json:"result"`
Success bool `json:"success"`
Message string `json:"message"`
Code int `json:"code"`
}

// QueryFreeHolders 获取前十大流通股东信息
func (e EastMoney) QueryFreeHolders(ctx context.Context, secuCode string) ([]FreeHolder, error) {
func (e EastMoney) QueryFreeHolders(ctx context.Context, secuCode string) (FreeHolderList, error) {
apiurl := "https://datacenter.eastmoney.com/securities/api/data/v1/get"
params := map[string]string{
"reportName": "RPT_F10_EH_FREEHOLDERS",
Expand Down
13 changes: 8 additions & 5 deletions models/exportor_data.go
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,8 @@ type ExportorData struct {
NetcashFinance string `json:"netcash_finance" csv:"筹资现金流净额"`
// 自由现金流
NetcashFree string `json:"netcash_free" csv:"自由现金流"`
// 十大流通股东
FreeHoldersTop10 string `json:"free_holders_top_10" csv:"十大流通股东"`
}

// GetHeaderValueMap 获取以 csv tag 为 key 的 Data map
Expand Down Expand Up @@ -232,11 +234,12 @@ func NewExportorData(ctx context.Context, stock Stock) ExportorData {
),
JLL5Y: stock.HistoricalFinaMainData.ValueList(ctx, eastmoney.ValueListTypeJLL, 5, eastmoney.FinaReportTypeYear),

ListingDate: stock.BaseInfo.ListingDate,
NetcashOperate: goutils.YiWanString(stock.NetcashOperate),
NetcashInvest: goutils.YiWanString(stock.NetcashInvest),
NetcashFinance: goutils.YiWanString(stock.NetcashFinance),
NetcashFree: goutils.YiWanString(stock.NetcashFree),
ListingDate: stock.BaseInfo.ListingDate,
NetcashOperate: goutils.YiWanString(stock.NetcashOperate),
NetcashInvest: goutils.YiWanString(stock.NetcashInvest),
NetcashFinance: goutils.YiWanString(stock.NetcashFinance),
NetcashFree: goutils.YiWanString(stock.NetcashFree),
FreeHoldersTop10: stock.FreeHoldersTop10.String(),
}
}

Expand Down
16 changes: 16 additions & 0 deletions models/stock.go
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ type Stock struct {
NetcashFinance float64 `json:"netcash_finance"`
// 自由现金流
NetcashFree float64 `json:"netcash_free"`
// 十大流通股东
FreeHoldersTop10 eastmoney.FreeHolderList `json:"free_holders_top_10"`
}

// GetPrice 返回股价,没开盘时可能是字符串“-”,此时返回最近历史股价,无历史价则返回 -1
Expand Down Expand Up @@ -300,6 +302,20 @@ func NewStock(ctx context.Context, baseInfo eastmoney.StockInfo) (Stock, error)
}
}(ctx, s)

// 获取前10大流通股东
wg.Add(1)
go func(ctx context.Context, s *Stock) {
defer func() {
wg.Done()
}()
holders, err := datacenter.EastMoney.QueryFreeHolders(ctx, s.BaseInfo.Secucode)
if err != nil {
logging.Error(ctx, "NewStock QueryFreeHolders err:"+err.Error())
return
}
s.FreeHoldersTop10 = holders
}(ctx, s)

wg.Wait()

return *s, nil
Expand Down
2 changes: 2 additions & 0 deletions statics/html/stock_index.html
Original file line number Diff line number Diff line change
Expand Up @@ -322,6 +322,7 @@ <h4 class="center">筛选结果</h4>
<li><label><input id="sf_50" type="checkbox" /><span>投资现金流净额</span></label></li>
<li><label><input id="sf_51" type="checkbox" /><span>筹资现金流净额</span></label></li>
<li><label><input id="sf_52" type="checkbox" /><span>自由现金流</span></label></li>
<li><label><input id="sf_53" type="checkbox" /><span>十大流通股东</span></label></li>
</ul>
</div>
<div class="divider"></div>
Expand Down Expand Up @@ -383,6 +384,7 @@ <h4 class="center">筛选结果</h4>
<th class="hide st_50">投资现金流净额</th>
<th class="hide st_51">筹资现金流净额</th>
<th class="hide st_52">自由现金流</th>
<th class="hide st_53">十大流通股东</th>
</tr>
</thead>
<tbody>
Expand Down
5 changes: 4 additions & 1 deletion statics/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -258,6 +258,9 @@ $(document).ready(function () {
'<td class="hide st_52">' +
stock.netcash_free +
"</td>" +
'<td class="hide st_53">' +
stock.free_holders_top_10 +
"</td>" +
"</tr>"
);
});
Expand Down Expand Up @@ -398,7 +401,7 @@ $(document).ready(function () {
$(".dropdown-content>li>a").css("font-size", "11px");
$(".dropdown-content>li>a").css("font-weight", "normal");

for (let i = 1; i <= 52; i++) {
for (let i = 1; i <= 53; i++) {
$(`#sf_${i}`).change(function () {
checkboxCountCheck();
$(`.st_${i}`).toggleClass("hide");
Expand Down

0 comments on commit 55ac42f

Please sign in to comment.