上證50股票數(shù)據(jù)聚合

照貓畫虎完成上證50結(jié)構(gòu)可視化
貓?jiān)谶@里 Visualizing the stock market structure

畫虎的大致步驟

  • 第一步课锌,使用tushare獲取上證50股票列表
  • 第二步,使用tushare獲取每只股票的歷史交易數(shù)據(jù)
  • 第三步涌穆,對(duì)數(shù)據(jù)進(jìn)行處理,使用sklearn的相關(guān)模型進(jìn)行嵌套梳码,根據(jù)算法獲得分類化的輸出
  • 第四步斜筐,使用sklearn,做一次局部線性嵌入邓夕,數(shù)據(jù)降為二維
  • 第五步刘莹,使用matplotlib,二維數(shù)據(jù)可視化

既然說了是照貓畫虎焚刚,原理什么的自然是無(wú)力解釋点弯,相關(guān)概念還是靠搜索引擎吧。

完整代碼

from datetime import datetime
import tushare as ts
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.collections import LineCollection
from sklearn import cluster, covariance, manifold

# 第一步
pool = ts.get_sz50s()
names = pool.name
pool.head(10)
image.png
# 第二步
d1 = '2014-01-01'
d2 = '2017-09-30'
variation = pd.DataFrame()
for code in pool.code:
    k = ts.get_k_data(code, d1, d2).set_index('date')
    var = k['close'] - k['open']
    var.name = code
    variation = pd.concat([variation, var], axis=1)

可能是網(wǎng)速原因矿咕,有時(shí)候拿數(shù)據(jù)很慢抢肛,為了便于數(shù)據(jù)的重復(fù)利用,可以把得到的結(jié)果暫時(shí)保存起來

variation.fillna(method='ffill', inplace=True)
# variation.fillna(0,inplace=True)
variation.to_csv('sz50.csv')

不同的缺省值處理會(huì)造成不同的分類結(jié)果碳柱,但是差異不大捡絮。如果把缺省部分全部處理成0,調(diào)試的時(shí)候會(huì)遇到 ‘the system is too ill-conditioned for this solver’莲镣。難道是數(shù)據(jù)量不夠福稳?
anyway,該死的停牌剥悟。

# 第三步
variation = pd.read_csv('sz50.csv', index_col=0)
# 缺省值處理
variation.fillna(0,inplace=True)

edge_model = covariance.GraphLassoCV()
X = variation.copy()
X /= X.std(axis=0)
edge_model.fit(X)

_, labels = cluster.affinity_propagation(edge_model.covariance_)
n_labels = labels.max()

print labels

for i in range(n_labels + 1):
    print('Cluster %i: %s' % ((i + 1), ', '.join(names[labels == i])))
[ 6  6  0 12 10  6  6  0  1  6 10  2  1  1  4  3  1 10  4  5 10 10  6  0  6
  6  7 10 12  8  6  6  6  6  7  6  6  6  7 10  9 10  7  6  0 11 10 12  6 12]
Cluster 1: 中國(guó)石化, 中國(guó)聯(lián)通, 中國(guó)神華, 中國(guó)石油
Cluster 2: 同方股份, 信威集團(tuán), 康美藥業(yè), 綠地控股
Cluster 3: 華夏幸福
Cluster 4: 山東黃金
Cluster 5: 貴州茅臺(tái), 伊利股份
Cluster 6: 江蘇銀行
Cluster 7: 浦發(fā)銀行, 民生銀行, 招商銀行, 保利地產(chǎn), 上汽集團(tuán), 大秦鐵路, 興業(yè)銀行, 北京銀行, 農(nóng)業(yè)銀行, 中國(guó)平安, 交通銀行, 新華保險(xiǎn), 工商銀行, 中國(guó)太保, 中國(guó)人壽, 光大銀行, 中國(guó)銀行
Cluster 8: 中國(guó)鐵建, 中國(guó)中鐵, 中國(guó)建筑, 中國(guó)交建
Cluster 9: 上海銀行
Cluster 10: 中國(guó)中車
Cluster 11: 中信證券, 北方稀土, 海通證券, 東方證券, 招商證券, 東興證券, 華泰證券, 光大證券, 方正證券
Cluster 12: 中國(guó)銀河
Cluster 13: 南方航空, 國(guó)泰君安, 中國(guó)核電, 中國(guó)重工
# 第四步
node_position_model = manifold.LocallyLinearEmbedding(
    n_components=2, eigen_solver='dense', n_neighbors=6)

embedding = node_position_model.fit_transform(X.T).T
# 第五步
font = {'family': 'SimHei',
          'color': 'black',
          'weight': 'normal',
          'size': 18,
          }

plt.figure(1, facecolor='w', figsize=(10, 8))
plt.clf()
ax = plt.axes([0., 0., 1., 1.])
plt.axis('off')

partial_correlations = edge_model.precision_.copy()
d = 1 / np.sqrt(np.diag(partial_correlations))
partial_correlations *= d
partial_correlations *= d[:, np.newaxis]
non_zero = (np.abs(np.triu(partial_correlations, k=1)) > 0.02)

plt.scatter(embedding[0], embedding[1], s=100 * d ** 2, c=labels,
            cmap=plt.cm.spectral)

start_idx, end_idx = np.where(non_zero)

segments = [[embedding[:, start], embedding[:, stop]]
            for start, stop in zip(start_idx, end_idx)]
values = np.abs(partial_correlations[non_zero])
lc = LineCollection(segments,
                    zorder=0, cmap=plt.cm.hot_r,
                    norm=plt.Normalize(0, .7 * values.max()))
lc.set_array(values)
lc.set_linewidths(15 * values)
ax.add_collection(lc)

for index, (name, label, (x, y)) in enumerate(
        zip(names, labels, embedding.T)):
    dx = x - embedding[0]
    dx[index] = 1
    dy = y - embedding[1]
    dy[index] = 1
    this_dx = dx[np.argmin(np.abs(dy))]
    this_dy = dy[np.argmin(np.abs(dx))]
    if this_dx > 0:
        horizontalalignment = 'left'
        x = x + .002
    else:
        horizontalalignment = 'right'
        x = x - .002
    if this_dy > 0:
        verticalalignment = 'bottom'
        y = y + .002
    else:
        verticalalignment = 'top'
        y = y - .002
    plt.text(x, y, name, fontdict=font, size=10,
             horizontalalignment=horizontalalignment,
             verticalalignment=verticalalignment,
             bbox=dict(facecolor='w',
                       edgecolor=plt.cm.spectral(label / float(n_labels)),
                       alpha=.6))

plt.xlim(embedding[0].min() - .15 * embedding[0].ptp(),
         embedding[0].max() + .10 * embedding[0].ptp(),)
plt.ylim(embedding[1].min() - .03 * embedding[1].ptp(),
         embedding[1].max() + .03 * embedding[1].ptp())

plt.show()
image.png

回頭再看看被分類的股票

選出兩組灵寺,看看所選時(shí)間段內(nèi)是否真的走勢(shì)相近

中國(guó)鐵建, 中國(guó)中鐵, 中國(guó)建筑, 中國(guó)交建

貴州茅臺(tái), 伊利股份

fit = [ True if name in [u'中國(guó)鐵建', u'中國(guó)中鐵', u'中國(guó)建筑', u'中國(guó)交建', u'貴州茅臺(tái)', u'伊利股份'] else False for name in pool.name]
picked = pool[fit]
print picked
      code  name
14  600519  貴州茅臺(tái)
18  600887  伊利股份
26  601186  中國(guó)鐵建
34  601390  中國(guó)中鐵
38  601668  中國(guó)建筑
42  601800  中國(guó)交建
close = pd.DataFrame()
for code in picked.code:
    p = ts.get_k_data(code, d1, d2).set_index('date')['close']
    p = p/p.mean()
    p.name = code
    close = pd.concat([close, p], axis=1)
close.head()
image.png
close.loc[:,['600519','600887']].plot()
plt.show()
image.png
close.loc[:,['601186', '601390', '601668', '601800']].plot()
plt.show()
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末曼库,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子略板,更是在濱河造成了極大的恐慌毁枯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叮称,死亡現(xiàn)場(chǎng)離奇詭異种玛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)瓤檐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門赂韵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挠蛉,你說我怎么就攤上這事祭示。” “怎么了谴古?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵质涛,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我掰担,道長(zhǎng)汇陆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任带饱,我火速辦了婚禮毡代,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺疼。我一直安慰自己教寂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布执庐。 她就那樣靜靜地躺著孝宗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耕肩。 梳的紋絲不亂的頭發(fā)上因妇,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音猿诸,去河邊找鬼婚被。 笑死,一個(gè)胖子當(dāng)著我的面吹牛梳虽,可吹牛的內(nèi)容都是我干的址芯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼谷炸!你這毒婦竟也來了北专?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤旬陡,失蹤者是張志新(化名)和其女友劉穎拓颓,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體描孟,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驶睦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了匿醒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片场航。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖廉羔,靈堂內(nèi)的尸體忽然破棺而出溉痢,到底是詐尸還是另有隱情,我是刑警寧澤憋他,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布适室,位于F島的核電站,受9級(jí)特大地震影響举瑰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蔬螟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一此迅、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旧巾,春花似錦耸序、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至廓握,卻和暖如春搅窿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背隙券。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工男应, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娱仔。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓沐飘,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子耐朴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容