1 Star 0 Fork 224

catfish / fooltrader

forked from foolcage / fooltrader 
Create your Gitee Account
Explore and code with more than 12 million developers,Free private repositories !:)
Sign up
Clone or Download
contribute
Sync branch
Cancel
Notice: Creating folder will generate an empty file .keep, because not support in Git
Loading...
README
MIT

Build Status

Read this in other languages: 中文.

fooltrader:trade as a fool

"To survive in the market, you must stay away from being smart because your intelligence is worthless in the market"------zen in chaos

1. Screenshots

1.1 China stock fundamentals analysis

Enter the stocks you are interested in to see the relationship between their net profit and the stock price, maybe you will not think that the "fundamental" useless?
For example: Vanke's profit has been growing rapidly, but cabbage price pressure for several years, so 'barbarians' came...
And you could calculate the entire market stocks using fooltrader, and automatically notify you, in fact, is not that difficult.

1.2 USA stock fundamentals analysis

Take a look at the performance of US stocks how? The operation is uniform.

1.3 Back test

You could write the Strategy using event-driven or time walk way, and view and analyze the performance in uniform way.
See the design doc

class EventTrader(Trader):
    def on_init(self):
        self.trader_id = 'aa'
        self.only_event_mode = True
        self.universe = ['stock_sz_000338']
        self.df_map = {}

    def on_day_bar(self, bar_item):
        current_security = bar_item['securityId']
        current_df = self.df_map.get(current_security, pd.DataFrame())
        if current_df.empty:
            self.df_map[current_security] = current_df

        current_df = current_df.append(bar_item, ignore_index=True)
        self.df_map[current_security] = current_df

        if len(current_df.index) == 10:
            ma5 = np.mean(current_df.loc[5:, 'close'])
            ma10 = np.mean(current_df.loc[:, 'close'])
            # buy when ma5 > ma10
            if ma5 > ma10 and not self.account_service.get_position(current_security):
                self.buy(security_id=current_security, current_price=bar_item['close'])
            # buy when ma5 < ma10
            elif ma5 < ma10 and self.account_service.get_position(current_security):
                self.sell(security_id=current_security, current_price=bar_item['close'])
            current_df = current_df.loc[1:, ]
            self.df_map[current_security] = current_df

Running strategy can view the results in real time, and make further assessment

1.4 General trend dashboard

1.5 gdp and market value comparison

As long as the total market capitalization is close to GDP, it is basically the top.
And From another perspective look,the total market capitalization is impossible always far below GDP.

1.6 GEM(similar to nasdaq) PE analysis

17.94% of the time in 20-40, 50.7% of the time in the 40-70, 26.67% of the time in the 70-100, 4.69% of the time in 100 or more.
So thinking about gemp PE about 40 or so "Valuation" high and bearish it, doomed to not enjoy the 2015-year GEM bull market

1.7 Global market PE comparison

GEM>small board>shenzhen>S & P>SSE?Maybe need a little imagination, the style is also convertible?
Well, the average PE of S & P has also exceeded 120, which is still slightly lower than that of our big GEM.
Now,the PE of the SSE is actually lower than that of the S & P, so?

2. Introduction

fooltrader is a Quantitative Trading System designed with big data technology to capture, clean, structure, calculate, display, backtesting and trading.
Its goal is to provide a unified framework for conducting research, backtesting, forecasting, and trading on * entire markets * (equities, futures, bonds, foreign exchange, digital currencies, macroeconomics, etc.)
Suitable for: Quantitative traders, financial professionals, people who are interested in economic data, programmers, people who like freedom and exploration

3. Architecture diagram

fooltrader is a well-structured modular system that you can use at different levels, as well as extend, transform, or replace the modules inside.

4. use step by step

The hierarchy of usage is one-to-one with the modules in the architecture diagram.
You can stop at any step, expand or replace with your own familiar system.
Of course, I still hope that you will run all the way, because the technical selection of each module here has been carefully considered, and the system is in active developing.

4.1 Environment preparation

OS:Ubuntu 16.04.3 LTS
In principle, the system-specific components are cross-platform, but I only test on ubuntu and mac
Memory:>16G
Disk:The bigger the better
clone or fork the code

$ git clone https://github.com/foolcage/fooltrader.git

4.2 init python env

$ cd fooltrader
$ ./init_env.sh

if you could see:

Requirements installed.  
env ok

Congratulation! Now you could play with fooltrader

4.3 crawl the data

$ source ve/bin/activate
$ ./ve/bin/ipython
In [1]: from fooltrader.datamanager import datamanager
#crawl stock meta data
In [2]: datamanager.crawl_stock_meta()
#crawl index data
In [3]: datamanager.crawl_index_quote()
#crawl stock kdata and tick data
In [4]: datamanager.crawl_stock_quote(start_code=002797,end_code=002798,crawl_tick=False)
#crawl finance data
In [5]: datamanager.crawl_finance_data(start_code=002797,end_code=002798)

crawling data and the api is in different module:

spiders focus on crawling things: speed of crawling, better data classification, data completion, handling ban, etc. api design only depends on data contract, which has better speed and flexibility

You can also download packaged historical datadata.zip. And you need only crawl the incremental data:

$ ./sched_finance.sh
$ ./sched_quote.sh

The script periodically fetches "missing" data. After the historical data integrity check is passed, it just actually fetches the data of the day, so that we have a complete data source for automated self-maintenance.
Scheduled tasks can be configured in the sched_quote.py file:
You could set the

@sched.scheduled_job('cron', hour=17, minute=00)
def scheduled_job1():
    crawl_stock_quote('000001', '002999')
    crawl_index_quote()


@sched.scheduled_job('cron', hour=17, minute=20)
def scheduled_job2():
    crawl_stock_quote('300000', '300999')


@sched.scheduled_job('cron', hour=17, minute=40)
def scheduled_job3():
    crawl_stock_quote('600000', '666666')

Finally, how to use the data crawled? Please refer todata contract
And here, you could use your familiar system to anylyze the data,e.g,mysql,superset,redash,hadoop.
Just follow the data contract and write the connector, and I hope you could pr to me.

4.4 install elastic-search and kibana(6.1.1)

Just change the storage of the data, incredible change to the system happen.

follow the official docs:https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html
or:

$ wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.1.1.zip
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.zip
$ unzip elasticsearch-6.1.1.zip
$ cd elasticsearch-6.1.1/
$ bin/elasticsearch-plugin install file:///path/to/file/x-pack-6.1.1.zip
$ cp ../fooltrader/config/elasticsearch.yml config/
$ ES_JAVA_OPTS="-Xms8g -Xmx8g"  ./bin/elasticsearch
$
$ wget https://artifacts.elastic.co/downloads/kibana/kibana-6.1.1-linux-x86_64.tar.gz
$ tar -xzf kibana-6.1.1-linux-x86_64.tar.gz
$ cd kibana-6.1.1-linux-x86_64/
$ bin/kibana-plugin install file:///path/to/file/x-pack-6.1.1.zip
$ cp ../fooltrader/config/kibana.yml config/
$ ./bin/kibana

4.5 use es_connector to store the data to elastic-search

in the fooltrader ipython env

In [1]: from fooltrader.connector import es_connector
#stock meta->es
In [2]: es_connector.stock_meta_to_es()
#index data->es
In [3]: es_connector.index_kdata_to_es()
#stock kdata->es
In [4]: es_connector.stock_kdata_to_es()
#you could open several terminals to improve the index speed
In [4]: es_connector.stock_kdata_to_es(start='002000',end='002999')
#finance data->es
In [5]: es_connector.balance_sheet_to_es()
In [5]: es_connector.income_statement_to_es()
In [5]: es_connector.cash_flow_statement_to_es()

Then, let's briefly enjoy its power
Query the top 5 net profit of the interim report 2017

curl -XPOST 'localhost:9200/income_statement/doc/_search?pretty&filter_path=hits.hits._source' -H 'Content-Type: application/json' -d'
{
  "query": {
    "range": {
      "reportDate": {
        "gte": "20170630",
        "lte": "20170630"
      }
    }
  },
  "size": 5,
  "sort": [
    {
      "netProfit": {
        "order": "desc"
      }
    }
  ]
}
'
{
  "hits": {
    "hits": [
      {
        "_source": {
          "exchangeGains": 1.3242E10,
          "netProfit": 1.827E9,
          "securityId": "stock_sh_601318",
          "investmentIncome": 2.0523E10,
          "operatingProfit": 7.8107E10,
          "accumulatedOtherComprehensiveIncome": 2.0E8,
          "attributableToMinorityShareholders": 6.5548E10,
          "sellingExpenses": 1.0777E10,
          "investmentIncomeFromRelatedEnterpriseAndJointlyOperating": "398259000000.00",
          "id": "stock_sh_601318_20170630",
          "minorityInterestIncome": 6.238E10,
          "code": "601318",
          "otherComprehensiveIncome": 6.5506E10,
          "nonOperatingIncome": 4.006E9,
          "financingExpenses": 0.0,
          "reportEventDate": "2017-08-18",
          "netProfitAttributedToParentCompanyOwner": 5.778E10,
          "disposalLossOnNonCurrentLiability": 9.01E8,
          "incomeFromChangesInFairValue": -2.56E8,
          "incomeTaxExpense": 2.2E7,
          "operatingTotalCosts": 3.4139E11,
          "assetsDevaluation": 8.75E8,
          "EPS": 1.9449E10,
          "operatingCosts": 9.4E7,
          "attributableToOwnersOfParentCompany": 1.58E8,
          "ManagingCosts": 6.402E10,
          "totalProfits": 8.403E9,
          "dilutedEPS": 2.4575E10,
          "reportDate": "20170630",
          "businessTaxesAndSurcharges": 9.442E9,
          "operatingRevenue": 4.63765E11,
          "nonOperatingExpenditure": 1.35892E11
        }
      ]
    }
  }
}

In fact we have the REST API naturally and could use your favourite language to anylyze. Just follow the data contract and ES DSL.

4.6 Use kibana to anylyze

(TBD)

4.7 Backtesting

(TBD)

4.8 Trading

(TBD)

TODO

  • Trading DSL design
  • WEB management interface, wizard-generated strategy
  • Real-time market and kafka real-time calculation
  • Integrated vnpy trading interface
  • Futures data capture
  • Hong Kong stock data capture

Contact information

QQ group:300911873
if you like this project,please star it and tell me your github user name when joining the qq group
check http://www.imqq.com/html/FAQ_en/html/Discussions_3.html

MIT License Copyright (c) 2016 foolcage Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

fooltrader是一个利用大数据技术设计的量化分析交易系统,包括数据的抓取,清洗,结构化,计算,展示,回测和交易. 它的目标是提供一个统一的框架来对全市场(股票,期货,债券,外汇,数字货币,宏观经济等)进行研究,回测,预测,交易 expand collapse
Python
MIT
Cancel

Releases

No release

Contributors

All

Activities

Load More
can not load any more
Python
1
https://gitee.com/catfish0411/fooltrader.git
git@gitee.com:catfish0411/fooltrader.git
catfish0411
fooltrader
fooltrader
master

Search