通过图分析分散股票投资组合并降低风险增加收益

  • 通过图分析分散股票投资组合并降低风险增加收益
    • 一、背景信息
    • 二、数据集与图数据模型
    • 三、数据构建
    • 四、基于相关系数推断股票之间的关系
    • 五、股票社区检测
    • 六、使用线性回归斜率从社区中选股
    • 七、结论

Here’s the table of contents:

通过图分析分散股票投资组合并降低风险增加收益

本文作者为Neo4j社区技术专家Tomaz Bratanic,帮助我们了解如何使用股票价格之间的相关性来推断股票之间的相似性网络,然后使用该网络信息来帮助我们分散投资组合。
    Diversify Your Stock Portfolio with Graph Analytics,以下内容为本博客翻译整理。

一、背景信息

几周前,我偶然发现了布莱恩特·艾维写的一篇文章【模式驱动的洞察:用Neo4j和Power BI可视化股票交易量相似性】。

这让我对如何使用图数据来分析股票市场产生了兴趣。经过一番研究,我发现了这篇【金融市场风险的分散:最好投资外围市场】研究论文。作者通过检查股票之间的相关性来推断股票之间的社区网络,然后在网络中搜索外围股票以帮助分散股票投资组合。作为研究论文的结论,作者认为这种技术可以通过分散您的投资来降低风险,并且有趣的是可以增加你的收益。

免责声明:这不是投资建议,您应该在投资前进行自己的研究。

二、数据集与图数据模型

我们将使用Kaggle的NASDAQ-100股票价格数据集的一个子集。该数据集包含过去十年102支股票的价格和交易量信息。

对于这篇文章,我准备了一个子集 CSV 文件,其中包含 2021年5月至2021年9月之间的股票价格和交易量信息。
    我们将使用以下图模型来存储股票信息:

每支股票将被表示为一个单独的节点。我们将每个股票的价格和交易量信息存储为股票交易日节点的链接列表。Stock节点使用股票名称唯一进行合并,StockTradingDay节点由交易日、收盘价、交易量表示唯一合并。使用链表模式是我在 Neo4j 中对时间序列数据进行建模时使用的通用图模型。

三、数据构建

如果你想复现这篇博文中的例子,我建议您在Neo4j Sandbox中打开一个空白项目进行。
    Neo4j Sandbox提供了 Neo4j 数据库的免费云实例,这些实例预装了 APOC 和 Graph Data Science 插件。您可以在 Neo4j 浏览器中复制以下 Cypher 语句以导入股票和交易信息。

:auto USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "https://raw.githubusercontent.com/tomasonjo/blog-datasets/main/stocks/stock_prices.csv" as row
MERGE (s:Stock{name:row.Name})
CREATE (s)-[:TRADING_DAY]->(:StockTradingDay{date: date(row.Date), close:toFloat(row.Close), volume: toFloat(row.Volume)});

接下来,我们需要在股票交易日节点之间创建一个链表。使用apoc.nodes.link我们可以很容易地用这个过程创建一个链表。我们还将股票收盘价按交易日排序后存储为股票节点的列表属性。

MATCH (s:Stock)-[:TRADING_DAY]->(day)
WITH s, day
ORDER BY day.date ASC
WITH s, collect(day) as nodes, collect(day.close) as closes
SET s.close_array = closes
WITH nodes
CALL apoc.nodes.link(nodes, 'NEXT_DAY')
RETURN distinct 'done' AS result

这是 Neo4j 浏览器中的示例某只股票的交易日链表可视化:

四、基于相关系数推断股票之间的关系

我们将使用Pearson相似度作为相关度量。上述研究论文的作者使用了更复杂的相关性指标,但这超出了本文的范围。

Pearson相似性算法的输入将是我们在上一步中生成的收盘价的有序列表。该算法将计算相关系数并将结果存储为相关股票之间的关系。我使用了topK参数值为3,因此每只股票将连接到三个最相关的股票。

MATCH (s:Stock)
WITH {item:id(s), weights: s.close_array} AS stockData
WITH collect(stockData) AS input
CALL gds.alpha.similarity.pearson.write({data: input,topK: 3,similarityCutoff: 0.2
})
YIELD nodes, similarityPairs
RETURN nodes, similarityPairs

如前所述,该算法在股票代码节点之间产生了新的 SIMILAR关系。

五、股票社区检测

我们现在可以运行社区检测算法来识别多种相关股票社区,我决定在这个例子中使用Louvain社区检测算法。社区 ID 将存储为节点属性。

CALL gds.louvain.write({nodeProjection:'Stock',relationshipProjection:'SIMILAR',writeProperty:'louvain'
})

查看社区检测结果的最佳方法是生成可视化网络:

我不会详细解释可视化的社区结构,因为我们只查看了100个股票三个月时间跨度的数据。

六、使用线性回归斜率从社区中选股

按照研究论文的想法,您可能希望投资来自不同社区的股票,以分散您的风险并增加收益。您可以使用线性回归斜率从每个社区中挑选股票来构建投资组合并进行收益表现的回测。

我发现有一个简单的线性回归模型apoc.math.regr程序。不幸的是,开发人员在执行线性回归时考虑了不同的数据模型,因此我们首先必须调整图模型以适应过程的输入。在第一步中,我们向股票交易日节点添加一个辅助标签,以指示它所代表的股票。

MATCH (s:Stock)-[:TRADING_DAY]->(day)
CALL apoc.create.addLabels( day, [s.name]) YIELD node
RETURN distinct 'done'

接下来,我们需要计算x轴索引值。我们将简单地为每只股票的第一个交易日分配零的索引值,并在随后的每个交易日增加索引值。

MATCH (s:Stock)-[:TRADING_DAY]->(day)
WHERE NOT ()-[:NEXT_DAY]->(day)
MATCH p=(day)-[:NEXT_DAY*0..]->(next_day)
SET next_day.index = length(p)

现在我们的图模型适合APOC中的线性回归过程的运算,我们可以继续计算拟合线的斜率值。在更严肃的情况下,我们可能希望调整收盘价,但在此演示中我们将跳过它。斜率值将存储为股票节点的属性。

MATCH (s:Stock)
CALL apoc.math.regr(s.name, 'close', 'index') YIELD slope
SET s.slope = slope;

作为最后一步,我们可以推荐每个社区中表现最好的三只股票。

MATCH (s:Stock)
WITH s.louvain AS community, s.slope AS slope, s.name AS ticker
ORDER BY slope DESC
RETURN community, collect(ticker)[..3] as potential_investments

七、结论

这不是投资建议,在投资之前请做你自己的研究。即便如此,在这篇博文中,我只查看了NASDAQ-100 股票的90天时间窗口,市场表现良好,因此在分散风险方面结果可能不是那么好。

如果您想更严谨一些,您可能需要收集更广泛的数据集并微调相关系数计算。不仅如此,简单的线性回归可能不是股票表现的最佳指标。另外,可以从Github获取演示案例的源代码。

通过图分析分散股票投资组合并降低风险增加收益相关推荐

  1. 浅谈图分析商业化的机遇与挑战,你注意到了吗?

    前言 本篇文章中,小普将以图分析这一技术栈为线索,站在行业的高度,抽丝剥茧,思考图分析的产品应用与用户体验,在整个介绍中,我们可以很清晰的看到,在图分析领域,机遇与挑战并存. 再上征"图&q ...

  2. 冰柱图分析:学习笔记

    冰柱图分析: 这个图:变量合并过程的冰柱图如下:显示x3与x6合并,接着x1与x5合并,然后x3.x6与x2合并,接着再与x1.x5合并,最后加上x4.六个变量全部合并. 聚类分析冰柱图: 形状类似于 ...

  3. Spark项目模拟——航班飞行网图分析

    文章目录 Spark项目模拟--航班飞行网图分析 需求描述 数据准备 需求思路整理 代码实现 总结 机场数量: 航线数量: 最大的边属性: 哪个机场到达航班最多: 找出最重要的飞行航线: 找出最便宜的 ...

  4. mysql火焰图_【性能】如何使用perf和火焰图分析系统性能?

    一.实验环境 二.实验案例分析 安装完成后,我们先在第一个终端,执行下面的命令运行案例,也就是一个最基本的 Nginx 应用: 运行 Nginx 服务并对外开放 80 端口 # docker run ...

  5. 游戏运营技术之----运用箱线图分析PCU和DAU(一)

    在我们对PCU和DAU进行分析时,经常采用的方法是做一条曲线比较一下前后两个时期的数据走势,发现问题,进行分析,但是实际过程中,这样的做法远远不能挖掘这两个数据指标更多的内涵和知识.针对本文已经在论坛 ...

  6. 图分析引擎技术方案调研

    图分析引擎-技术调研报告 先上调研结论: 金融领域相关图分析图查询引擎的建设,建议采用neo4j为内核进行研发图谱集群,可以部署到云平台自主运维或者选择服务厂商完全托管(建议自主运维):内核的选择,建 ...

  7. Spark GraphX 中的PageRank算法、pregel函数、航班飞行网图分析

    PageRank算法 PageRank算法原理剖析及Spark实现 - 简书 (jianshu.com) import org.apache.spark.SparkContext import org ...

  8. 有了图分析,可解释的AI还远吗?

    Graph+AI 更多新可能 随着深度学习.机器学习等人工智能技术的逐级深入,企业对挖掘大数据的关联性去探索"隐藏"在背后的商业价值提出了更高的要求.尤其是,新一代人工智能技术正从 ...

  9. 自然语言处理(NLP)之依存句法分析的可视化及图分析

    依存句法分析的效果虽然没有像分词.NER的效果来的好,但也有其使用价值,在日常的工作中,我们免不了要和其打交道.如何分析依存句法分析的结果,一个重要的方面便是其可视化和它的图分析. 我们使用的NLP工 ...

  10. Chart.js-极区图分析(参数分析+例图)

    Chart.js-极区图分析(参数分析+例图) 极区图样式总览 基本写法 参数解析 极区图1 - 普通极区图 极区图样式总览 基本写法 首先在< script >标签里面引入chart.j ...

最新文章

  1. 2015级C++第14周实践项目 模板
  2. java 右键菜单_界面操作--添加右键菜单
  3. python必须连网开发吗_Python开发,请避开这些坑!
  4. CentOS 7关闭firewalld启用iptables
  5. JVM的进阶学习(GC Roots、JVM调优与参数配置、)
  6. C++基础05-类构造函数与析构函数
  7. Android学习小记-----监听并保存传感器数据,让service后台运行(保持CPU运转
  8. ac86u原厂固件去广告_苹果发布最新固件IOS12.3.2,估计不修正你的手机
  9. CNN入门讲解:不一样的Softmax
  10. 阅读引擎开源项目调研总结
  11. RFID在图书馆系统管理中的有哪些应用优势?
  12. Linux python 虚拟环境搭建与配置
  13. [原创] 原创鼠繪【白发紫衣妖艳男子】
  14. appium示例代码python_Appium+python测试app实例
  15. 分区属性揭秘 Win8 电脑 OEM 分区创建 分区属性
  16. aria2 txt导入_使用Aria2完成下载任务
  17. Linux:dd命令详解(df du命令参数)
  18. 郑州轻工业大学oj平台 c语言 1008 美元和人民币的换算
  19. 钢笔墨水能否代替打印机墨水_uv打印机喷头波形和墨水关系
  20. VBA之正则表达式(24)-- 字符串转数组

热门文章

  1. 使用curl请求接口
  2. 宝塔面板服务器ip地址修改_服务器搭建网站完整教程(宝塔面板+wordpress)
  3. 把酒言欢话聊天,基于Vue3.0+Tornado6.1+Redis发布订阅(pubsub)模式打造异步非阻塞(aioredis)实时(websocket)通信聊天系统
  4. monthCalendar控件改变颜色无变化
  5. 职场工作人员需不需要写日报
  6. C程序设计——图片文件合成器
  7. java fillrect_Java graphics2D fillRect无法使用半透明颜色正常...
  8. html如何制作图片平移的效果,抖音里单张图片平移视频怎么制作?影音制作实现一张图片从左到右滑动视频效果...
  9. Flutter混编工程之高速公路Pigeon
  10. RPC框架简析--Pigeon