algo trading第一课:企业相关性分析

想法产生

对于股票,交易数据是时间序列的数据。在我看来,要将交易过程量化,就是通过一系列的手段,寻找市场规律,帮助人类自己做决策。这也是机器学习能够发挥作用的地方。如何帮助人类做决策呢?接下来我就举个简单的例子。

通常来看,如果两只或几只股票的涨跌情况很相似的时候,那么就可以认为这几家公司的业务类型有很高的相似性,或者他们之间有一些不可告人的小秘密。

股票聚类的基本原因就是从股市中选取一部股票进行投资。对一般的投资模型来说300条股票也太多了,当然我们这样做,只是为了验证假设。

按照投资组合优化理论选取标准为: 

(1)资产数越多越好 

(2)资产之间相关系数越低越好(实验目的)

实施过程

在计算机中如何表示这一现象呢?首先我会通过python来获取一些股票的交易数据,之后会计算出一些指标,然后用机器学习中的聚类算法,将其分为几类。

当然,最主要的是能够将结果可视化,这样也会加强结果的可解释性。

如何获取股票数据呢?现在网络上有很多现成的并且非常好用的API,比如tushare,其可以获取各种财经类数据,比较有趣的是它还可以获取一些基本面数据,比如新浪中的新闻,甚至电影的票房数据也可以通过它来获取:

# 首先我需要定义下获取股票数据的区间

start_date = "2014-01-01"

end_date = "2018-01-01"

如果此时我手动去上网查看有哪些公司的股票处于交易状态,并且还得将它们整理成python中的字典类型,最后再通过request来一个个爬取数据,设计规则......那样就太浪费时间了,有了tushare,妈妈再也不用担心我的数据源

# 查看股票列表,选取一些作为实验对象

import tushare as ts

stocks = ts.get_stock_basics()

stocks['code'] = stocks.index

此时stocks对象中包含了很多列

['name', 'industry', 'area', 'pe', 'outstanding', 'totals',

'totalAssets', 'liquidAssets', 'fixedAssets', 'reserved',

'reservedPerShare', 'esp', 'bvps', 'pb', 'timeToMarket', 'undp',

'perundp', 'rev', 'profit', 'gpr', 'npr', 'holders', 'code']

这些我就不一一解释了,通过字面我们就可以看出一些端倪,其中有个字段叫做‘timeToMarket’,它代表着公司股票允许在交易所进行交易的开始日期,我看了下这个字段的类型,竟然是 int 类型。哈哈,tushare的作者太有心了,这样我们在选取区域的时候就不用再写函数将日期转来转去的。

由于tushare无法获取到时间太早的交易数据(印象中好像是2013年左右),所以,在这里我打算选取2014年之后允许交易的企业,并且随机选取300只股票作为实验对象。

select_stock = stocks[stocks['timeToMarket'] < 20140101]

select_stock = select_stock.sample(300)

这时候,为了后面能够让公司的股票代码与名称很好的对应起来,建立一个字典来存储它们

symbol_dict = {item['code']:item['name'] for _, item in select_stock.iterrows()}

symbols, names = np.array(sorted(symbol_dict.items())).T

我发现所选的这些股票中,虽然交易区间都是从20140101至20180101,但是交易时长并不一致,得到的结果为:

均值:883.2633333333333

最大值:977

最小值:365

故接下来我们只选择交易市场大于882天的股票,所以

quotes = {}

newDict = {}

for symbol in symbols:

    print('Fethching quote history for {}'.format(symbol))

    data = ts.get_k_data(code=symbol, start=start_date, end=end_date)   # 获取单只股票的历史交易数据

    # data.to_csv('./data/{}.csv'.format(symbol),index=None)    # 存储起来以便循环利用

    if len(data) > 882:

        quotes[symbol] = data

        newDict[symbol] = symbol_dict[symbol]

    time.sleep(np.random.rand(1))

ok,到此为止,我们手上已经有了300只股票的历史交易数据。由于这些股票的交易时长并不一致,在这里方便起见,选择平均值处理,也就是说,只要交易时长如果大于882天,那么我就选取它作为实验对象,并且选取最后的882组交易数据。

# open 为第2列, close 为第3列

close_prices = np.vstack([q.iloc[-882:, 2] for _, q in quotes.items()])

open_prices = np.vstack([q.iloc[-882:, 1] for _, q in quotes.items()])

# 计算出每天的涨跌值

variation = close_prices - open_prices

利用GraphLasso在少数样本中学习协方差和稀疏精度。

edge_model = covariance.GraphLassoCV()  # GraphLasso 会自动调节alpha值

X = variation.copy().T

X /= X.std(axis=0)

edge_model.fit(X)

接下来就要用到聚类方法了,这里选用的是AP聚类,此聚类方法是在07年被提出的,一般被翻译为近邻传播聚类。

它有以下优点:

不需要制定最终聚类族的个数

已有的数据点作为最终的聚类中心,而不是新生成一个族中心。 

模型对数据的初始值不敏感。 

对初始相似度矩阵数据的对称性没有要求。 

相比与k-means聚类方法,其结果的平方差误差较小。

当然,在这里,你不能用kmeans聚类方法,因为你不确定中心点数。你也可以在这里用基于密度的聚类方法,比如DBSCAN,但在高维度数据中,其分布是非常稀疏的,密度也就难以定义了。

除了这种聚类算法,这里还可以延伸一下,利用t检验来检验两只股票的相关性,其算法也可以通过sklearn实现。后续有时间我会加个实验。

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

n_labels = labels.max()

for i in range(n_labels + 1):

    print('Cluster {}: {}'.format(i+1, ', '.join(selectNames[labels == i])))

 输出结果为:

Cluster 1: 富奥股份, 中钢国际, 奥克股份

Cluster 2: 华意压缩, 雪迪龙, 华平股份, 海泰发展

Cluster 3: 小天鹅A, 老板电器, 浙江广厦, 烽火通信

Cluster 4: 高新发展, 漳州发展, 云投生态, 世联行

Cluster 5: 韶钢松山, 广联达, 迪威迅, 申通地铁

Cluster 6: 华侨城A, 威孚高科, 德美化工, 粤 水 电, 紫鑫药业, 佛慈制药, 美亚光电, *ST沪科, 四川长虹, 岳阳林纸

Cluster 7: 大港股份, 西南证券

Cluster 8: 巨轮智能, 立讯精密, 同花顺

Cluster 9: 亚太股份, 顺灏股份, 长荣股份, 中路股份

Cluster 10: 粤高速A, 恒邦股份, 泰和新材, 双星新材, 华泰股份, *ST厦工, 中国中铁

Cluster 11: 利君股份, 南方航空, 卧龙电气

Cluster 12: 东方海洋, 南风股份, 潜能恒信, 东睦股份, 华发股份, 新五丰

Cluster 13: 湖北宜化, 双成药业, 万邦达, 唐山港

Cluster 14: 赣锋锂业, 蓝色光标

Cluster 15: 数字政通, 秋林集团

Cluster 16: 顺络电子, 奥飞娱乐, 新联电子, 思创医惠, 聚龙股份, 聚光科技, 澄星股份

Cluster 17: 银禧科技, 新莱应材, 隆华节能

Cluster 18: 精艺股份, 天汽模, 民生银行, 中国石化, 新华保险, 中国交建

Cluster 19: 深圳能源, 长安汽车, 浙江震元, 贵州百灵, 中直股份, 中国卫星, 航天动力, 西昌电力, 隧道股份

Cluster 20: 二六三, 以岭药业, 开山股份, 瑞茂通

Cluster 21: 中金岭南, 闽东电力, 嘉欣丝绸, 福建金森, 福日电子

Cluster 22: 冀中能源, 海鸥住工, 阳泉煤业, 精伦电子, 恒源煤电

Cluster 23: 深圳机场, 天健集团, 大冷股份, 新华联, 三木集团, 友阿股份, 天喻信息, 西藏天路, 国机汽车, 亚宝药业

Cluster 24: 通润装备, 安诺其, 鲁商置业, 江西铜业, 新钢股份

Cluster 25: ST成城, 京能电力

Cluster 26: 九阳股份, 哈尔斯, 外高桥, 天地源

Cluster 27: 中集集团, 中联重科, 柳 工, 江铃汽车, 泰山石油, 顺发恒业, *ST南风, 普洛药业, 承德露露, 大亚圣象, 金陵药业, 华润三九, 黔源电力, 广百股份, 福晶科技, 恩华药业, 东方雨虹, 西部建设, 大北农, 长青股份, 巨星科技, 天业通联, 东软载波, 舒泰神, 明星电力, 三峡水利, 生益科技, 两面针, 外运发展, 华丽家族, 法拉电子, 京投发展, 珠江实业, 首商股份, 一汽富维, 安徽合力, 悦达投资, 宏发股份, 航民股份, 四川成渝

Cluster 28: 北方导航, 深高速, 鲁信创投, 博闻科技

Cluster 29: 轴研科技, 银鸽投资, 君正集团

Cluster 30: 美好置业, 双箭股份, 新南洋, 宏昌电子

这么看,我们难以看出不同的cluster之间的相关性差距有多远,那么,为了更加方便我们做决策,可以将其进行可视化展示:


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

推荐阅读更多精彩内容

  • AI+金融技术分层解构 从分层的视角来看,AI+金融技术可分为基础层、技术层和应用层三个层面。作为AI在金融领域落...
    shenciyou阅读 2,803评论 1 5
  • 美豹金融的美股大学--https://www.usmeibao.com/knowledge.html 一、基础篇 ...
    格式化_001阅读 2,522评论 1 5
  • 感恩我店里的每个角落,感恩顾客的爱戴,感恩我的小姐们的努力。。祝福她们的家人安康。。
    SiawHui阅读 181评论 0 1
  • 选择一份销售的工作,不是为了让自己可以赚到多少钱,而是为了让自己显得多忙碌! 选择每晚自己做晚饭,...
    街角d微笑_16a8阅读 77评论 0 0
  • 在经过初始众筹股东、发起人和创始人层层背书式的严格筛选之后,中国式众筹的项目里会有大约50-200人的众筹股东团队...
    KT早期教育阅读 556评论 0 0