{"id":13958487,"url":"https://github.com/cedricporter/funcat","last_synced_at":"2026-01-02T15:58:03.626Z","repository":{"id":43305987,"uuid":"78012141","full_name":"cedricporter/funcat","owner":"cedricporter","description":"Funcat 将同花顺、通达信、文华财经麦语言等的公式写法移植到了 Python 中。","archived":false,"fork":false,"pushed_at":"2019-08-04T02:29:40.000Z","size":949,"stargazers_count":906,"open_issues_count":27,"forks_count":412,"subscribers_count":94,"default_branch":"master","last_synced_at":"2024-04-25T22:22:35.688Z","etag":null,"topics":["python","quant","trade"],"latest_commit_sha":null,"homepage":"http://funcat.org","language":"Jupyter Notebook","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cedricporter.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.rst","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-01-04T12:05:27.000Z","updated_at":"2024-04-22T15:23:11.000Z","dependencies_parsed_at":"2022-09-17T03:50:51.578Z","dependency_job_id":null,"html_url":"https://github.com/cedricporter/funcat","commit_stats":null,"previous_names":[],"tags_count":32,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedricporter%2Ffuncat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedricporter%2Ffuncat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedricporter%2Ffuncat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cedricporter%2Ffuncat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cedricporter","download_url":"https://codeload.github.com/cedricporter/funcat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":226850004,"owners_count":17691896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["python","quant","trade"],"created_at":"2024-08-08T13:01:39.140Z","updated_at":"2026-01-02T15:58:03.573Z","avatar_url":"https://github.com/cedricporter.png","language":"Jupyter Notebook","readme":"# Funcat\n\n[![PyPI](https://img.shields.io/pypi/v/funcat.svg)](https://pypi.python.org/pypi/funcat)\n[![PythonVersion](https://img.shields.io/pypi/pyversions/funcat.svg)](https://pypi.python.org/pypi/funcat)\n[![License](https://img.shields.io/pypi/l/funcat.svg)](https://pypi.python.org/pypi/funcat)\n\nFuncat 将同花顺、通达信、文华财经等的公式移植到了 Python 中。\n\n同花顺、通达信、文华财经麦语言等公式的表达十分简洁，适合做技术分析。\n\n苦于 Python 缺乏这种领域特定语言的表达能力，所以用 Python 基于 numpy 实现了一套。\n\n## 安装\n```\npip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U funcat\n```\n\n## notebooks 教程\n- [quick-start](https://github.com/cedricporter/funcat/blob/master/notebooks/funcat-tutorial.ipynb)\n\n## API\n### 行情变量\n\n- 开盘价：`OPEN` `O`\n- 收盘价：`CLOSE` `C`\n- 最高价：`HIGH` `H`\n- 最低价：`LOW` `L`\n- 成交量：`VOLUME` `V` `VOL`\n\n### 工具函数\n\n- n天前的数据：`REF`\n``` python\nREF(C, 10)  # 10天前的收盘价\n```\n\n- 金叉判断：`CROSS`\n``` python\nCROSS(MA(C, 5), MA(C, 10))  # 5日均线上穿10日均线\n```\n\n- 两个序列取最小值：`MIN`\n``` python\nMIN(O, C)  # K线实体的最低价\n```\n\n- 两个序列取最大值：`MAX`\n``` python\nMAX(O, C)  # K线实体的最高价\n```\n\n- n天都满足条件：`EVERY`\n``` python\nEVERY(C \u003e MA(C, 5), 10)  # 最近10天收盘价都大于5日均线\n```\n\n- n天内满足条件的天数：`COUNT`\n``` python\nCOUNT(C \u003e O, 10)  # 最近10天收阳线的天数\n```\n\n- n天内最大值：`HHV`\n``` python\nHHV(MAX(O, C), 60)  # 最近60天K线实体的最高价\n```\n\n- n天内最小值：`LLV`\n``` python\nLLV(MIN(O, C), 60)  # 最近60天K线实体的最低价\n```\n\n- 求和n日数据 `SUM`\n``` python\nSUM(C, 10)  # 求和10天的收盘价\n```\n\n- 求绝对值 `ABS`\n``` python\nABS(C - O)\n```\n\n- 条件 `IF`\n``` python\nIF(OPEN \u003e CLOSE, OPEN, CLOSE)\n```\n\n### 条件「和」与「或」\n因为语法的问题，我们需要使用 `\u0026` 代替 `and` 「和」，用 `|` 代替 `or` 「或」。\n\n``` python\n# 收盘价在10日均线上 且 10日均线在20日均线上\n(C \u003e MA(C, 10)) \u0026 (MA(C, 10) \u003e MA(C, 20))\n\n# 收阳线 或 收盘价大于昨收\n(C \u003e O) | (C \u003e REF(C, 1))\n\n```\n\n### 指标\n\n- 均线：`MA`\n``` python\nMA(C, 60)  # 60日均线\n```\n\n其他更多请见：[指标库](https://github.com/cedricporter/funcat/blob/master/funcat/indicators.py)\n\n\n还有更多的技术指标还在实现中，欢迎提交pr一起实现。\n\n## 自定义公式示例\n[KDJ指标](http://wiki.mbalib.com/wiki/KDJ)。随机指标（KDJ）由 George C．Lane 创制。它综合了动量观念、强弱指标及移动平均线的优点，用来度量股价脱离价格正常范围的变异程度。\n\n``` python\nN, M1, M2 = 9, 3, 3\n\nRSV = (CLOSE - LLV(LOW, N)) / (HHV(HIGH, N) - LLV(LOW, N)) * 100\nK = EMA(RSV, (M1 * 2 - 1))\nD = EMA(K, (M2 * 2 - 1))\nJ = K * 3 - D * 2\n\nprint(K, D, J)\n```\n\n[DMI指标](http://wiki.mbalib.com/wiki/DMI)。动向指数又叫移动方向指数或趋向指数。是属于趋势判断的技术性指标，其基本原理是通过分析股票价格在上升及下跌过程中供需关系的均衡点，即供需关系受价格变动之影响而发生由均衡到失衡的循环过程，从而提供对趋势判断的依据。\n\n对于 DMI 这个指标，你会发现 TALib 算出来的结果，和同花顺等软件的结果不一样，我对比了下实现方式，发现，是因为同花顺的公式和 TALib 的计算公式不一样，对于这种情况，我们把同花顺的公式搬过来，就可以算出和同花顺一样的结果。\n\n``` python\nM1, M2 = 14, 6\n\nTR = SUM(MAX(MAX(HIGH - LOW, ABS(HIGH - REF(CLOSE, 1))), ABS(LOW - REF(CLOSE, 1))), M1)\nHD = HIGH - REF(HIGH, 1)\nLD = REF(LOW, 1) - LOW\n\nDMP = SUM(IF((HD \u003e 0) \u0026 (HD \u003e LD), HD, 0), M1)\nDMM = SUM(IF((LD \u003e 0) \u0026 (LD \u003e HD), LD, 0), M1)\nDI1 = DMP * 100 / TR\nDI2 = DMM * 100 / TR\nADX = MA(ABS(DI2 - DI1) / (DI1 + DI2) * 100, M2)\nADXR = (ADX + REF(ADX, M2)) / 2\n\nprint(DI1, DI2, ADX, ADXR)\n```\n\n## 选股\n\n``` python\nfrom funcat import *\n\n\n# 选出涨停股\nselect(\n    lambda : C / C[1] - 1 \u003e= 0.0995,\n    start_date=20161231,\n\tend_date=20170104,\n)\n\n'''\n[20170104]\n20170104 000017.XSHE 000017.XSHE[深中华A]\n20170104 000026.XSHE 000026.XSHE[飞亚达Ａ]\n20170104 000045.XSHE 000045.XSHE[深纺织Ａ]\n20170104 000585.XSHE 000585.XSHE[东北电气]\n20170104 000595.XSHE 000595.XSHE[宝塔实业]\n20170104 000678.XSHE 000678.XSHE[襄阳轴承]\n...\n'''\n\n\n# 选出最近30天K线实体最高价最低价差7%以内，最近100天K线实体最高价最低价差大于25%，\n# 最近10天，收盘价大于60日均线的天数大于3天\nselect(\n    lambda : ((HHV(MAX(C, O), 30) / LLV(MIN(C, O), 30) - 1 \u003c 0.07)\n              \u0026 (HHV(MAX(C, O), 100) / LLV(MIN(C, O), 100) - 1 \u003e 0.25)\n              \u0026 (COUNT(C \u003e MA(C, 60), 10) \u003e 3)\n             ),\n    start_date=20161220,\n)\n\n'''\n[20170104]\n20170104 600512.XSHG 600512.XSHG[腾达建设]\n[20170103]\n[20161230]\n20161230 000513.XSHE 000513.XSHE[丽珠集团]\n...\n'''\n\n\n# 选出最近3天每天的成交量小于20日成交量均线，最近3天最低价低于20日均线，最高价高于20日均线\n# 自定义选股回调函数\ndef callback(date, order_book_id, symbol):\n    print(\"Cool, 在\", date, \"选出\", order_book_id, symbol)\n\n\nselect(\n    lambda : (EVERY(V \u003c MA(V, 20) / 2, 3) \u0026 EVERY(L \u003c MA(C, 20), 3) \u0026 EVERY(H \u003e MA(C, 20), 3)),\n    start_date=20161231,\n    callback=callback,\n)\n\n'''\n[20170104]\nCool, 在 20170104 选出 002633.XSHE 002633.XSHE[申科股份]\nCool, 在 20170104 选出 600857.XSHG 600857.XSHG[宁波中百]\n...\n'''\n```\n\n## 单股票研究\n``` python\nfrom funcat import *\nfrom funcat.data.tushare_backend import TushareDataBackend\n\nset_data_backend(TushareDataBackend())\n\n# 设置目前天数为2017年1月4日\nT(\"20170104\")\n# 设置关注股票为上证指数\nS(\"000001.XSHG\")\n\n# 打印 Open High Low Close\n\u003e\u003e\u003e print(O, H, L, C)\n3133.79 3160.1 3130.11 3158.79\n\n# 当天涨幅\n\u003e\u003e\u003e C / C[1] - 1\n0.0072929156356\n\n# 打印60日均线\n\u003e\u003e\u003e MA(C, 60)\n3154.78333333\n\n# 判断收盘价是否大于60日均线\n\u003e\u003e\u003e C \u003e MA(C, 60)\nTrue\n\n# 30日最高价\n\u003e\u003e\u003e HHV(H, 30)\n3301.21\n\n# 最近30日，收盘价 Close 大于60日均线的天数\n\u003e\u003e\u003e COUNT(C \u003e MA(C, 60), 30)\n17\n\n# 10日均线上穿\n\u003e\u003e\u003e CROSS(MA(C, 10), MA(C, 20))\nFalse\n```\n\n## DataBackend\n默认实现了一个从 tushare 上面实时拉数据选股的 Backend。\n\n还有一个 [RQAlpha](https://github.com/ricequant/rqalpha) 的 Backend，使用它可以为我们提供本地的数据源，比从 tushare 拉数据速度更有优势。\n\n``` bash\npip install rqalpha    # 安装依赖库 RQAlpha\nrqalpha update_bundle  # 更新数据\n```\n\n替换 DataBackend 为 RQAlpha 的 DataProxy，这样可以从 RQAlpha 的 bundle 中获取数据。\n\n``` python\nfrom funcat.data.rqalpha_data_backend import RQAlphaDataBackend\nfrom funcat import *\n\nset_data_backend(RQAlphaDataBackend(\"~/.rqalpha/bundle\"))\n```\n\n为了更高的性能，您也可以自定义Backend使用本地数据。这样可以极大地提高运行速度。\n","funding_links":[],"categories":["金融股票"],"sub_categories":["网络服务_其他"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedricporter%2Ffuncat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcedricporter%2Ffuncat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcedricporter%2Ffuncat/lists"}