{ "info": { "author": "foolcage", "author_email": "5533061@qq.com", "bugtrack_url": null, "classifiers": [ "Development Status :: 3 - Alpha", "Intended Audience :: Customer Service", "Intended Audience :: Developers", "Intended Audience :: Education", "Intended Audience :: Financial and Insurance Industry", "License :: OSI Approved :: MIT License", "Programming Language :: Python :: 3.5", "Programming Language :: Python :: 3.6", "Topic :: Office/Business :: Financial :: Investment", "Topic :: Software Development :: Build Tools" ], "description": "[![Build Status](https://travis-ci.org/foolcage/fooltrader.svg?branch=master)](https://travis-ci.org/foolcage/fooltrader)\n\n**Read this in other languages: [English](README-en.md).** \n# fooltrader:trade as a fool\n>\"\u8981\u5728\u5e02\u573a\u4e0a\u751f\u5b58\uff0c\u5c31\u5fc5\u987b\u8fdc\u79bb\u806a\u660e\uff0c\u56e0\u4e3a\uff0c\u4f60\u7684\u806a\u660e\u5728\u5e02\u573a\u9762\u524d\u4e00\u94b1\u4e0d\u503c\"------\u7f20\u4e2d\u8bf4\u7985 \n\n# 1. \u4f7f\u7528\u622a\u56fe\n## 1.1 **A\u80a1\u57fa\u672c\u9762\u5206\u6790** \n![](./screenshots/profit_price.gif)\n>\u8f93\u5165\u4f60\u611f\u5174\u8da3\u7684\u4e2a\u80a1,\u67e5\u770b\u5176\u51c0\u5229\u6da6\u8ddf\u80a1\u4ef7\u7684\u5173\u7cfb,\u4e5f\u8bb8\u4f60\u5c31\u4e0d\u4f1a\u8ba4\u4e3a\"\u57fa\u672c\u8868\u9762\"\u6ca1\u7528\u4e86? \n\u6bd4\u5982:\u4e07\u79d1\u7684\u5229\u6da6\u4e00\u76f4\u5728\u9ad8\u901f\u589e\u957f,\u767d\u83dc\u4ef7\u538b\u4e86\u51e0\u5e74,\u6240\u4ee5'\u91ce\u86ee\u4eba'\u6765\u4e86,\u8fd8\u6709\u7c7b\u4f3c\u7684\u6807\u7684\u5417? \n\u800c\u628a\u5168\u5e02\u573a\u7684\u4e2a\u80a1\u8fdb\u884c\u8ba1\u7b97,\u5e76\u81ea\u52a8\u901a\u77e5\u4f60,\u5176\u5b9e\u4e5f\u4e0d\u662f\u4ec0\u4e48\u96be\u4e8b.\n\n## 1.2 **\u7f8e\u80a1\u57fa\u672c\u9762\u5206\u6790** \n![](./screenshots/usa-profit-price.gif)\n>\u770b\u4e00\u4e0b\u7f8e\u80a1\u7684\u8868\u73b0\u5982\u4f55\u5462? \n\n## 1.3 **\u56de\u6d4b** \n\n\u7b56\u7565\u7684\u7f16\u5199,\u53ef\u4ee5\u91c7\u7528\u4e8b\u4ef6\u9a71\u52a8\u6216\u8005\u65f6\u95f4\u6f2b\u6b65\u7684\u65b9\u5f0f,\u67e5\u770b[*\u8bbe\u8ba1\u6587\u6863*](./docs/trader.md) \n\n```python\nclass EventTrader(Trader):\n def on_init(self):\n self.trader_id = 'aa'\n self.only_event_mode = True\n self.universe = ['stock_sz_000338']\n self.df_map = {}\n\n def on_day_bar(self, bar_item):\n current_security = bar_item['securityId']\n current_df = self.df_map.get(current_security, pd.DataFrame())\n if current_df.empty:\n self.df_map[current_security] = current_df\n\n current_df = current_df.append(bar_item, ignore_index=True)\n self.df_map[current_security] = current_df\n\n if len(current_df.index) == 10:\n ma5 = np.mean(current_df.loc[5:, 'close'])\n ma10 = np.mean(current_df.loc[:, 'close'])\n # 5\u65e5\u7ebf\u572810\u65e5\u7ebf\u4e0a,\u5e76\u4e14\u6ca1\u6709\u6301\u4ed3,\u5c31\u4e70\u5165\n if ma5 > ma10 and not self.account_service.get_position(current_security):\n self.buy(security_id=current_security, current_price=bar_item['close'])\n # 5\u65e5\u7ebf\u572810\u65e5\u7ebf\u4e0b,\u5e76\u4e14\u6709\u6301\u4ed3,\u5c31\u5356\u51fa\n elif ma5 < ma10 and self.account_service.get_position(current_security):\n self.sell(security_id=current_security, current_price=bar_item['close'])\n current_df = current_df.loc[1:, ]\n self.df_map[current_security] = current_df\n```\n\n\u8fd0\u884c\u7b56\u7565\u53ef\u4ee5\u5b9e\u65f6\u67e5\u770b\u6548\u679c,\u5e76\u505a\u8fdb\u4e00\u6b65\u7684\u8bc4\u4f30\n![](./screenshots/trader.gif)\n\n## 1.4 **\u5927\u52bfdashboard**\n![](./screenshots/analyze1.png) \n\n## 1.5 **gdp\u5e02\u503c\u6bd4\u8f83**\n![](./screenshots/gdp_cap.png) \n>\u53ea\u8981\u603b\u5e02\u503c\u63a5\u8fd1GDP,\u57fa\u672c\u5c31\u662f\u9876\u90e8,\u800c\u957f\u671f\u8fdc\u79bbGDP\u4e5f\u662f\u4e0d\u53ef\u80fd\u7684.\n\n## 1.6 **\u521b\u4e1a\u677fPE\u5206\u6790**\n![](./screenshots/cyb_pe.png)\n>17.94%\u7684\u65f6\u95f4\u5904\u4e8e20-40,50.7%\u65f6\u95f4\u5904\u4e8e40-70,26.67%\u7684\u65f6\u95f4\u5904\u4e8e70-100,4.69%\u7684\u65f6\u95f4\u5904\u4e8e100\u4ee5\u4e0a.\n\u6240\u4ee5:\u572840\u5de6\u53f3\u5c31\u89c9\u5f97\"\u4f30\u503c\"\u9ad8,\u770b\u7a7a\u521b\u4e1a\u677f\u7684,\u6ce8\u5b9a\u65e0\u6cd5\u4eab\u53d715\u5e74\u7684\u521b\u4e1a\u677f\u5927\u725b\u5e02\n\n## 1.7 **\u5404\u5e02\u573aPE\u5bf9\u6bd4** \n![](./screenshots/china-usa-pe.png)\n>\u521b\u4e1a\u677f>\u4e2d\u5c0f\u677f>\u6df1\u8bc1>\u6807\u666e>\u4e0a\u8bc1?\u4e5f\u8bb8\u9700\u8981\u4e00\u70b9\u60f3\u8c61\u529b,\u98ce\u683c\u4e5f\u662f\u53ef\u4ee5\u8f6c\u6362\u7684?\n\u55ef,\u6807\u666e\u7684\u5e73\u5747PE\u66fe\u7ecf\u4e5f\u8d85\u8fc7120,\u6bd4\u6211\u4eec\u7684\u5927\u521b\u4e1a\u677f\u7684\u75af\u72c2\u8fd8\u662f\u5dee\u4e00\u70b9,\u7136\u540e,\u73b0\u5728\u6211\u4eec\u4e0a\u8bc1\u7684PE\u5176\u5b9e\u662f\u6bd4\u6807\u666e\u4f4e\u7684,\u6240\u4ee5?\n\n# 2. \u7b80\u4ecb\nfooltrader\u662f\u4e00\u4e2a\u5229\u7528*\u5927\u6570\u636e*\u6280\u672f\u8bbe\u8ba1\u7684*\u91cf\u5316\u4ea4\u6613\u7cfb\u7edf*,\u5305\u62ec\u6570\u636e\u7684\u6293\u53d6,\u6e05\u6d17,\u7ed3\u6784\u5316,\u8ba1\u7b97,\u5c55\u793a,\u56de\u6d4b\u548c\u4ea4\u6613. \n\u5b83\u7684\u76ee\u6807\u662f\u63d0\u4f9b\u4e00\u4e2a\u7edf\u4e00\u7684\u6846\u67b6\u6765\u5bf9*\u5168\u5e02\u573a*(\u80a1\u7968,\u671f\u8d27,\u503a\u5238,\u5916\u6c47,\u6570\u5b57\u8d27\u5e01,\u5b8f\u89c2\u7ecf\u6d4e\u7b49)\u8fdb\u884c\u7814\u7a76,\u56de\u6d4b,\u9884\u6d4b,\u4ea4\u6613. \n\u5b83\u7684\u9002\u7528\u5bf9\u8c61\u5305\u62ec:***\u91cf\u5316\u4ea4\u6613\u5458,\u8d22\u7ecf\u7c7b\u4e13\u4e1a\u5e08\u751f,\u5bf9\u7ecf\u6d4e\u6570\u636e\u611f\u5174\u8da3\u7684\u4eba,\u7a0b\u5e8f\u5458,\u559c\u6b22\u81ea\u7531\u800c\u6709\u63a2\u7d22\u7cbe\u795e\u7684\u4eba***\n\n# 3. \u67b6\u6784\u56fe\nfooltrader\u662f\u4e00\u4e2a\u5c42\u6b21\u6e05\u6670\u7684\u7cfb\u7edf,\u4f60\u53ef\u4ee5\u5728\u4e0d\u540c\u7684\u5c42\u6b21\u5bf9\u5176\u8fdb\u884c\u4f7f\u7528,\u4e5f\u53ef\u4ee5\u6269\u5c55,\u6539\u9020\u6216\u66ff\u6362\u91cc\u9762\u7684\u6a21\u5757. \n\n![](./screenshots/architecture.png)\n\n# 4. \u4f7f\u7528step by step\n\u4f7f\u7528\u7684\u5c42\u6b21\u8ddf\u67b6\u6784\u56fe\u91cc\u9762\u7684\u6a21\u5757\u662f\u4e00\u4e00\u5bf9\u5e94\u7684, \u4f60\u53ef\u4ee5\u5728\u4efb\u4f55step\u505c\u4e0b\u6765,\u8fdb\u884c\u6269\u5c55\u6216\u8005\u5bf9\u63a5\u4f60\u81ea\u5df1\u719f\u6089\u7684\u7cfb\u7edf. \n\u5f53\u7136,\u8fd8\u662f\u5e0c\u671b\u4f60\u5168\u90e8\u8dd1\u901a,\u56e0\u4e3a\u8fd9\u91cc\u7684\u6bcf\u4e2a\u6a21\u5757\u7684\u6280\u672f\u9009\u578b\u90fd\u662f\u7ecf\u8fc7\u7cbe\u5fc3\u8003\u8651\u7684,\u5e76\u4e14\u540e\u7eed\u4f1a\u4e0d\u505c\u5b8c\u5584. \n\n### 4.1 \u73af\u5883\u51c6\u5907 \n\u64cd\u4f5c\u7cfb\u7edf:Ubuntu 16.04.3 LTS \n\u539f\u5219\u4e0a,\u5176\u4ed6\u4e5f\u53ef\u4ee5,\u7cfb\u7edf\u4f7f\u7528\u7684\u7ec4\u4ef6\u90fd\u662f\u8de8\u5e73\u53f0\u7684,\u4f46\u6211\u53ea\u5728ubuntu\u548cmac\u8fd0\u884c\u8fc7 \n\u5185\u5b58:>16G \n\u786c\u76d8:\u8d8a\u5927\u8d8a\u597d \nclone\u6216\u8005fork\u4ee3\u7801 \n```bash\n$ git clone https://github.com/foolcage/fooltrader.git\n```\n### 4.2 \u521d\u59cb\u5316python\u73af\u5883\n```bash\n$ cd fooltrader\n$ ./init_env.sh\n```\n\u5982\u679c\u4f60\u6700\u540e\u770b\u5230: \n```bash\nRequirements installed. \nenv ok\n```\n\u90a3\u4e48\u606d\u559c\u4f60,\u4f60\u53ef\u4ee5\u4ee5\u5404\u79cd\u59ff\u52bf\u53bb\u73a9\u800d\u4e86.\n### 4.3 \u6293\u53d6\u6570\u636e\n\u5efa\u8bae\u5148\u4e0b\u8f7d\u6253\u5305\u597d\u7684\u5386\u53f2\u6570\u636e[*data.zip*](https://pan.baidu.com/s/1dmZaPo). \n\u770b\u4e00\u4e0b[*\u6570\u636e\u534f\u8bae*](./docs/contract.md),\u8bbe\u7f6e\u597dFOOLTRADER_STORE_PATH,\u89e3\u538b\u4e0b\u8f7d\u7684\u6587\u4ef6\u5230\u8be5\u76ee\u5f55. \n\u8be5\u9879\u76ee\u7684\u4e00\u4e2a\u76ee\u7684\u4e4b\u4e00\u662f\u65b9\u4fbf\u5927\u5bb6\u5171\u4eab\u6570\u636e,\u4e0d\u9700\u8981\u6bcf\u4e2a\u4eba\u90fd\u53bb\u6293\u5386\u53f2\u6570\u636e\u800c\u5bfc\u81f4\u88ab\u5c4f\u853d. \n```bash\n$ source ve/bin/activate\n$ ./ve/bin/ipython\nIn [1]: from fooltrader.datamanager import datamanager\n#\u6293\u53d6\u80a1\u7968\u5143\u6570\u636e\nIn [2]: datamanager.crawl_stock_meta()\n#\u6293\u53d6\u6307\u6570\u6570\u636e\nIn [3]: datamanager.crawl_index_quote()\n#\u6293\u53d6\u4e2a\u80a1K\u7ebf\u548ctick\u6570\u636e\nIn [4]: datamanager.crawl_stock_quote(start_code=002797,end_code=002798,crawl_tick=False)\n#\u6293\u53d6\u8d22\u52a1\u6570\u636e\nIn [5]: datamanager.crawl_finance_data(start_code=002797,end_code=002798)\n```\n\u8fd9\u91cc\u628a\u6293\u53d6\u6570\u636e\u4f5c\u4e3a\u4e00\u4e2a\u5355\u72ec\u7684\u6a21\u5757,\u800c\u4e0d\u662f\u50cftushare\u90a3\u6837api\u548c\u722c\u866b\u8026\u5408\u5728\u4e00\u8d77,\u4e3b\u8981\u662f\u4e3a\u4e86:\n> \u722c\u866b\u53ea\u5e72\u722c\u866b\u7684\u4e8b:\u4e13\u6ce8\u6293\u53d6\u7684\u901f\u5ea6,\u66f4\u597d\u7684\u6570\u636e\u5206\u7c7b,\u6570\u636e\u8865\u5168,\u9632\u5c4f\u853d\u7b49 \n> api\u8bbe\u8ba1\u53ea\u4f9d\u8d56[*\u6570\u636e\u534f\u8bae*](./docs/contract.md),\u4ece\u800c\u5177\u6709\u66f4\u597d\u7684\u901f\u5ea6\u548c\u7075\u6d3b\u6027\n\n\n\u6293\u53d6\u6bcf\u5929\u7684\u589e\u91cf\u6570\u636e\u53ea\u9700\u8981:\n```bash\n$ ./sched_finance.sh\n```\n```bash\n$ ./sched_quote.sh\n```\n\u8be5\u811a\u672c\u4f1a\u5b9a\u65f6\u53bb\u6293\u53d6\"\u7f3a\u5c11\"\u7684\u6570\u636e,\u5728\u5386\u53f2\u6570\u636e\u5b8c\u6574\u6027\u68c0\u67e5\u901a\u8fc7\u540e,\u5176\u5b9e\u5c31\u662f\u53ea\u662f\u6293\u53d6\u5f53\u5929\u7684\u6570\u636e,\u8fd9\u6837\u6211\u4eec\u5c31\u6709\u4e86\u4e00\u4e2a\u81ea\u52a8\u5316\u81ea\u6211\u7ef4\u62a4\u7684\u5b8c\u6574\u6570\u636e\u6e90. \n\u53ef\u5728sched_quote.py\u6587\u4ef6\u4e2d\u8fdb\u884c\u5bf9\u5b9a\u65f6\u4efb\u52a1\u8fdb\u884c\u914d\u7f6e: \n```python\n#\u6bcf\u592917:00\u8fd0\u884c\n@sched.scheduled_job('cron', hour=17, minute=00)\ndef scheduled_job1():\n crawl_stock_quote('000001', '002999')\n crawl_index_quote()\n\n\n@sched.scheduled_job('cron', hour=17, minute=20)\ndef scheduled_job2():\n crawl_stock_quote('300000', '300999')\n\n\n@sched.scheduled_job('cron', hour=17, minute=40)\ndef scheduled_job3():\n crawl_stock_quote('600000', '666666')\n```\n\n\u6700\u540e\u5f3a\u8c03\u4e00\u4e0b,\u6570\u636e\u6293\u4e0b\u6765\u4e86,\u600e\u4e48\u4f7f\u7528?\u8bf7\u53c2\u8003[*\u6570\u636e\u534f\u8bae*](./docs/contract.md) \n\u5230\u8fd9\u91cc,\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528elastic-search,\u4e5f\u4e0d\u60f3\u4f7f\u7528python,\u4f60\u5c31\u662f\u60f3\u7528java,mysql,\u6216\u8005\u4f60superset,redash,hadoop\u5565\u7684\u73a9\u5f97\u5f88\u719f,\u6ca1\u95ee\u9898,\u6839\u636e\u6570\u636e\u534f\u8bae\u4f60\u5e94\u8be5\u5f88\u5bb9\u6613\u7684\u628a\u6570\u636e\u653e\u5230\u4f60\u9700\u8981\u7684\u5730\u65b9\u8fdb\u884c\u7814\u7a76.\n\u5f53\u7136,\u6211\u66f4\u5e0c\u671b\u4f60\u628a\u4ee3\u7801\u8d21\u732e\u5230connector\u91cc\u9762,pr\u7ed9\u6211,\u65e2\u63d0\u9ad8\u81ea\u5df1\u7684\u4ee3\u7801\u6c34\u5e73,\u53c8\u65b9\u4fbf\u4e86\u9700\u8981\u4f7f\u7528\u7684\u4eba,\u5c82\u4e0d\u5feb\u54c9? \n### 4.4 elastic-search\u548ckibana\u5b89\u88c5(6.1.1) \n>\u4ec5\u4ec5\u53ea\u662f\u628a\u6570\u636e\u6362\u4e00\u4e2a\u5b58\u50a8,\u7cfb\u7edf\u5c31\u53d1\u751f\u4e86\u4e0d\u53ef\u601d\u8bae\u7684\u53d8\u5316.\n\n\u53ef\u4ee5\u53c2\u8003\u5b98\u65b9\u6587\u6863\u8fdb\u884c\u5b89\u88c5:https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html \n\u4e5f\u53ef\u4ee5\u7528\u4ee5\u4e0b\u547d\u4ee4\u6765\u5b8c\u6210: \n```bash\n$ #\u4e0b\u8f7dxpack\n$ wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.1.1.zip\n$ #\u4e0b\u8f7des\n$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.zip\n$ unzip elasticsearch-6.1.1.zip\n$ cd elasticsearch-6.1.1/\n$ #\u4e3aes\u5b89\u88c5xpcck\u63d2\u4ef6,\u5c31\u662f\u521a\u521a\u4e0b\u8f7d\u7684\u90a3\u4e2ax-pack-6.1.1.zip,\u683c\u5f0f\u4e3afile://+\u5176\u8def\u5f84\n$ bin/elasticsearch-plugin install file:///path/to/file/x-pack-6.1.1.zip\n$ #\u7528fooltrader\u4e2d\u7684elasticsearch.yml\u8986\u76d6es\u9ed8\u8ba4\u914d\u7f6e\n$ cp ../fooltrader/config/elasticsearch.yml config/\n$ #\u542f\u52a8es,\u53ef\u6839\u636e\u81ea\u5df1\u7684\u60c5\u51b5\u66f4\u6539heap\u5927\u5c0f,<=32g\n$ ES_JAVA_OPTS=\"-Xms8g -Xmx8g\" ./bin/elasticsearch\n$\n$ #\u4e0b\u8f7dkibana\n$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-linux-x86_64.tar.gz\n$ tar -xzf kibana-6.1.1-linux-x86_64.tar.gz\n$ cd kibana-6.1.1-linux-x86_64/\n$ #\u4e3akibana\u5b89\u88c5xpcck\u63d2\u4ef6,\u5c31\u662f\u521a\u521a\u4e0b\u8f7d\u7684\u90a3\u4e2ax-pack-6.1.1.zip,\u683c\u5f0f\u4e3afile://+\u5176\u8def\u5f84\n$ bin/kibana-plugin install file:///path/to/file/x-pack-6.1.1.zip\n$ #\u7528fooltrader\u4e2d\u7684kibana.yml\u8986\u76d6kibana\u9ed8\u8ba4\u914d\u7f6e\n$ cp ../fooltrader/config/kibana.yml config/\n$ ./bin/kibana\n```\n\n### 4.5 \u6570\u636e\u5b58\u50a8\u5230elastic-search \n\u5230\u8fd9\u91cc,\u6211\u8fd8\u662f\u9ed8\u8ba4\u4f60\u5728fooltrader\u7684ipython\u73af\u5883\u4e0b.\n```bash\nIn [1]: from fooltrader.connector import es_connector\n#\u80a1\u7968\u5143\u4fe1\u606f->es\nIn [2]: es_connector.stock_meta_to_es()\n#\u6307\u6570\u6570\u636e->es\nIn [3]: es_connector.index_kdata_to_es()\n#\u4e2a\u80a1k\u7ebf->es\nIn [4]: es_connector.stock_kdata_to_es()\n#\u4f60\u4e5f\u53ef\u4ee5\u591a\u5f00\u51e0\u4e2a\u7a97\u53e3,\u6307\u5b9a\u8303\u56f4,\u63d0\u9ad8\u7d22\u5f15\u901f\u5ea6\nIn [4]: es_connector.stock_kdata_to_es(start='002000',end='002999')\n#\u8d22\u52a1\u6570\u636e->es\nIn [5]: es_connector.balance_sheet_to_es()\nIn [5]: es_connector.income_statement_to_es()\nIn [5]: es_connector.cash_flow_statement_to_es()\n```\n\n\u7136\u540e,\u6211\u4eec\u7b80\u5355\u7684\u6765\u9886\u7565\u4e00\u4e0b\u5b83\u7684\u5a01\u529b \n\u67e5\u8be22017\u5e74\u4e2d\u62a5\u51c0\u5229\u6da6top 5\n```bash\ncurl -XPOST 'localhost:9200/income_statement/doc/_search?pretty&filter_path=hits.hits._source' -H 'Content-Type: application/json' -d'\n{\n \"query\": {\n \"range\": {\n \"reportDate\": {\n \"gte\": \"20170630\",\n \"lte\": \"20170630\"\n }\n }\n },\n \"size\": 5,\n \"sort\": [\n {\n \"netProfit\": {\n \"order\": \"desc\"\n }\n }\n ]\n}\n'\n{\n \"hits\": {\n \"hits\": [\n {\n \"_source\": {\n \"exchangeGains\": 1.3242E10,\n \"netProfit\": 1.827E9,\n \"securityId\": \"stock_sh_601318\",\n \"investmentIncome\": 2.0523E10,\n \"operatingProfit\": 7.8107E10,\n \"accumulatedOtherComprehensiveIncome\": 2.0E8,\n \"attributableToMinorityShareholders\": 6.5548E10,\n \"sellingExpenses\": 1.0777E10,\n \"investmentIncomeFromRelatedEnterpriseAndJointlyOperating\": \"398259000000.00\",\n \"id\": \"stock_sh_601318_20170630\",\n \"minorityInterestIncome\": 6.238E10,\n \"code\": \"601318\",\n \"otherComprehensiveIncome\": 6.5506E10,\n \"nonOperatingIncome\": 4.006E9,\n \"financingExpenses\": 0.0,\n \"reportEventDate\": \"2017-08-18\",\n \"netProfitAttributedToParentCompanyOwner\": 5.778E10,\n \"disposalLossOnNonCurrentLiability\": 9.01E8,\n \"incomeFromChangesInFairValue\": -2.56E8,\n \"incomeTaxExpense\": 2.2E7,\n \"operatingTotalCosts\": 3.4139E11,\n \"assetsDevaluation\": 8.75E8,\n \"EPS\": 1.9449E10,\n \"operatingCosts\": 9.4E7,\n \"attributableToOwnersOfParentCompany\": 1.58E8,\n \"ManagingCosts\": 6.402E10,\n \"totalProfits\": 8.403E9,\n \"dilutedEPS\": 2.4575E10,\n \"reportDate\": \"20170630\",\n \"businessTaxesAndSurcharges\": 9.442E9,\n \"operatingRevenue\": 4.63765E11,\n \"nonOperatingExpenditure\": 1.35892E11\n }\n ]\n }\n }\n}\n```\n\u5b9e\u9645\u4e0aREST\u63a5\u53e3\u5929\u7136\u5c31\u6709\u4e86,\u505a\u8de8\u5e73\u53f0\u63a5\u53e3\u975e\u5e38\u65b9\u4fbf,\u6839\u636e[*\u6570\u636e\u534f\u8bae*](./docs/contract.md) \u548cES DSL\u53ef\u4ee5\u975e\u5e38\u65b9\u4fbf\u7684\u8fdb\u884c\u67e5\u8be2\u548c\u805a\u5408\u8ba1\u7b97.\n\n### 4.6 \u4f7f\u7528kibana\u8fdb\u884c\u5206\u6790\n(\u6587\u6863\u5f85\u5b8c\u5584)\n\n### 4.7 \u56de\u6d4b\n(\u6587\u6863\u5f85\u5b8c\u5584)\n\n### 4.8 \u4ea4\u6613\n(\u6587\u6863\u5f85\u5b8c\u5584)\n\n# \u652f\u6301\u7684\u529f\u80fd\n* \u722c\u866b\u4ee3\u7406\u6846\u67b6 \n\n>\u53ef\u914d\u7f6e\u4ee3\u7406\u670d\u52a1\u5668\u6c60\u548c\u5e76\u53d1\u6570,\u4ece\u800c\u63d0\u9ad8\u722c\u866b\u7684\u5065\u58ee\u6027\n\n* \u6570\u636e\u6293\u53d6 \n * A\u80a1\u6807\u7684\u4fe1\u606f\u6293\u53d6 \n * A\u80a1tick\u6570\u636e\u6293\u53d6 \n * A\u80a1\u65e5\u7ebf\u6570\u636e\u6293\u53d6 \n * A\u80a1\u8d22\u52a1\u6570\u636e\u6293\u53d6 \n * A\u80a1\u4e8b\u4ef6\u6293\u53d6 \n\n>\u6570\u636e\u7684\u5904\u7406\u65b9\u5f0f\u662f,\u5148\u5b9a\u4e49[*\u6570\u636e\u534f\u8bae*](./docs/contract.md),\u518d\u5bfb\u627e\u6570\u636e\u6e90,\u8fd9\u6837\u505a\u7684\u597d\u5904\u662f:\u6570\u636e\u534f\u8bae\u7684\u7a33\u5b9a\u4e3a\u6574\u4e2a\u7cfb\u7edf\u7684\u7a33\u5b9a\u6253\u4e0b\u575a\u5b9e\u7684\u57fa\u7840,\u591a\u6570\u636e\u6e90\u6bd4\u8f83\u63d0\u9ad8\u6570\u636e\u51c6\u786e\u6027,\u591a\u6570\u636e\u6e90\u805a\u5408\u63d0\u9ad8\u6570\u636e\u5b8c\u6574\u6027.\n\n* \u5e38\u7528\u6280\u672f\u6307\u6807\u8ba1\u7b97(ma,ema,macd\u7b49)\n\n>\u6211\u4eec\u4e0d\u9700\u8981\u90a3\u4e48\u591a\u6280\u672f\u6307\u6807,\u4f46\u4e00\u5b9a\u8981\u77e5\u9053\u6240\u4f7f\u7528\u6307\u6807\u7684\u5185\u6db5,\u6240\u4ee5,\u6211\u4eec\u9009\u62e9\u81ea\u5df1\u8ba1\u7b97;\u6ca1\u9519,\u7531\u4e8e\u6570\u636e\u7684\u7edf\u4e00\u6027,\u7406\u6240\u5f53\u7136\u5730,\u8ba1\u7b97\u7684\u7edf\u4e00\u6027\u4e5f\u6709\u4e86.\n\u4e0d\u7ba1\u662fA\u80a1,\u6e2f\u80a1,\u8fd8\u662f\u6570\u5b57\u8d27\u5e01,\u4e0d\u7ba1\u662f1\u5206\u949f\u7ea7\u522b,\u8fd8\u662f\u65e5\u7ebf,\u4f7f\u7528\u7684\u90fd\u662f\u7edf\u4e00\u7684api.\n\n* \u56de\u6d4b\u6846\u67b6\n\n>\u5c0f\u91d1\u5c5e\u6da8\u75af\u4e86,\u4f46\u76f8\u5173\u7684\u4e0a\u5e02\u516c\u53f8\u80a1\u4ef7\u8fd8\u5728\u5386\u53f2\u65b0\u4f4e,\u6211\u662f\u4e0d\u662f\u53ef\u4ee5\u4e70\u4e00\u70b9? \n\u91d1\u53c9\u4e70,\u6b7b\u53c9\u5356,\u5728\u4e0d\u540c\u7ea7\u522b\u4e0a\u8868\u73b0\u5982\u4f55?\u5728\u4e0d\u540c\u6807\u7684\u4e0a\u8868\u73b0\u5982\u4f55? \n\u76f8\u540c\u7684\u7b56\u7565,\u5982\u4f55\u5feb\u901f\u7684\u5728\u6240\u6709\u6807\u7684\u4e0a\u56de\u6d4b,\u5e76\u8fdb\u884c\u5bf9\u6bd4? \n\u5229\u6da6\u589e\u957f,\u80a1\u4ef7\u4e5f\u589e\u957f?\u6216\u8005\u63d0\u524d\u53cd\u6620?\u6ede\u540e\u53cd\u6620?\u5404\u79cd\u8868\u73b0\u7684\u6bd4\u4f8b\u5982\u4f55? \n\u5404\u4e2a\u7b56\u7565\u4e4b\u95f4\u5982\u4f55\u901a\u4fe1,\u4ece\u800c\u5f62\u6210\u5408\u529b? \n#### \u6ca1\u9519:\u56de\u6d4b\u6846\u67b6\u5fc5\u987b\u8981\u8003\u8651\u8fd9\u4e9b\u95ee\u9898 \n\n# TODO\n* \u4ea4\u6613DSL\u8bbe\u8ba1\n* WEB\u7ba1\u7406\u754c\u9762,\u5411\u5bfc\u5f0f\u751f\u6210\u7b56\u7565\n* \u5b9e\u65f6\u884c\u60c5\u53cakafka\u5b9e\u65f6\u8ba1\u7b97\n* \u96c6\u6210vnpy\u7684\u4ea4\u6613\u63a5\u53e3\n* \u671f\u8d27\u6570\u636e\u6293\u53d6\n* \u6e2f\u80a1\u6570\u636e\u6293\u53d6\n\n# \u8054\u7cfb\u65b9\u5f0f \nQQ\u7fa4:300911873 \n\u5982\u679c\u4f60\u559c\u6b22\u8be5\u9879\u76ee,\u8bf7\u52a0\u661f\u652f\u6301\u4e00\u4e0b,\u5e76\u5728\u7533\u8bf7\u5165\u7fa4\u65f6\u544a\u77e5github user name.", "description_content_type": null, "docs_url": null, "download_url": "", "downloads": { "last_day": -1, "last_month": -1, "last_week": -1 }, "home_page": "https://github.com/foolcage/fooltrader", "keywords": "stock finance fintech big-data tushare vnpy technical-analysis trading-platform elasticsearch kafka pandas fundamental-analysis quant", "license": "", "maintainer": "", "maintainer_email": "", "name": "fooltrader", "package_url": "https://pypi.org/project/fooltrader/", "platform": "", "project_url": "https://pypi.org/project/fooltrader/", "project_urls": { "Bug Reports": "https://github.com/foolcage/fooltrader/issues", "Funding": "https://github.com/foolcage/fooltrader", "Homepage": "https://github.com/foolcage/fooltrader", "Say Thanks!": "https://saythanks.io/to/foolcage", "Source": "https://github.com/foolcage/fooltrader" }, "release_url": "https://pypi.org/project/fooltrader/0.0.1a1/", "requires_dist": null, "requires_python": "", "summary": "Open source quantitative framework for Humans", "version": "0.0.1a1" }, "last_serial": 3664465, "releases": { "0.0.1a1": [ { "comment_text": "", "digests": { "md5": "61ba06c1039e94b9a2dc9005518f308a", "sha256": "15130cde187205a6b544636f3318d5306dec4901aa661da08e39c21227533e9e" }, "downloads": -1, "filename": "fooltrader-0.0.1a1.tar.gz", "has_sig": false, "md5_digest": "61ba06c1039e94b9a2dc9005518f308a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67764, "upload_time": "2018-03-13T07:50:36", "url": "https://files.pythonhosted.org/packages/c4/48/b61144af0467b983caf4449a44ba9ef2c6093ab9a34920827cd384d7e054/fooltrader-0.0.1a1.tar.gz" } ] }, "urls": [ { "comment_text": "", "digests": { "md5": "61ba06c1039e94b9a2dc9005518f308a", "sha256": "15130cde187205a6b544636f3318d5306dec4901aa661da08e39c21227533e9e" }, "downloads": -1, "filename": "fooltrader-0.0.1a1.tar.gz", "has_sig": false, "md5_digest": "61ba06c1039e94b9a2dc9005518f308a", "packagetype": "sdist", "python_version": "source", "requires_python": null, "size": 67764, "upload_time": "2018-03-13T07:50:36", "url": "https://files.pythonhosted.org/packages/c4/48/b61144af0467b983caf4449a44ba9ef2c6093ab9a34920827cd384d7e054/fooltrader-0.0.1a1.tar.gz" } ] }