1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/foolcage-fooltrader

Клонировать/Скачать
README.md 23 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 05:58 3b85d86

tick

In [4]: ft.get_kdata('BTC-USD',exchange='kraken')

             timestamp     code     name     low    open   close    high       volume                     securityId  preClose  change  changePct
timestamp                                                                                                                        
2016-07-08  2016-07-08  BTC-USD  BTC/USD   634.0   640.4   671.4   671.4  1651.592635  cryptocurrency_kraken_BTC-USD       NaN     NaN        NaN
2016-07-09  2016-07-09  BTC-USD  BTC/USD   622.0   671.9   652.0   671.9  1908.295953  cryptocurrency_kraken_BTC-USD     671.4   -19.4  -0.029755
2016-07-10  2016-07-10  BTC-USD  BTC/USD   642.4   652.0   650.0   655.6   429.290787  cryptocurrency_kraken_BTC-USD     652.0    -2.0  -0.003077
2016-07-11  2016-07-11  BTC-USD  BTC/USD   645.3   652.5   650.7   663.3   814.157258  cryptocurrency_kraken_BTC-USD     650.0     0.7   0.001076
2016-07-12  2016-07-12  BTC-USD  BTC/USD   647.1   650.7   666.0   675.9   923.800268  cryptocurrency_kraken_BTC-USD     650.7    15.3   0.022973

基本面数据

In [5]: ft.get_income_statement_items('300027',report_period='2017-06-30')
#试一试
#ft.get_balance_sheet_items('300027',,report_event_date='2017-01-01')
#ft.get_cash_flow_statement_items('300027')
Out[2]:
{'EPS': 0.15,
 'ManagingCosts': 257005115.85,
 'accumulatedOtherComprehensiveIncome': 471486112.3,
 'assetsDevaluation': -21647912.31,
 'attributableToMinorityShareholders': 90255906.93,
 'attributableToOwnersOfParentCompany': 381230205.37,
 'businessTaxesAndSurcharges': 80033207.21,
 'code': '300027',
 'dilutedEPS': 0.15,
 'disposalLossOnNonCurrentLiability': 281050.25,
 'exchangeGains': 0.0,
 'financingExpenses': 132202866.43,
 'id': 'stock_sz_300027_20170630',
 'incomeFromChangesInFairValue': 0.0,
 'incomeTaxExpense': 111864455.56,
 'investmentIncome': 541478955.17,
 'investmentIncomeFromRelatedEnterpriseAndJointlyOperating': '45035770.67',
 'minorityInterestIncome': 91203287.92,
 'netProfit': 521516997.38,
 'netProfitAttributedToParentCompanyOwner': 430313709.46,
 'nonOperatingExpenditure': 13775609.35,
 'nonOperatingIncome': 27864700.17,
 'operatingCosts': 679308123.4,
 'operatingProfit': 619292362.12,
 'operatingRevenue': 1465863805.45,
 'operatingTotalCosts': 1388050398.5,
 'otherComprehensiveIncome': -50030885.08,
 'reportDate': '2017-06-30',
 'reportEventDate': '2017-08-29',
 'securityId': 'stock_sz_300027',
 'sellingExpenses': 261148997.92,
 'totalProfits': 633381452.94}

财务报表的勾稽关系验证

# 营业利润=营业收入-营业成本-营业税金及附加-销售费用-管理费用-财务费用-资产减值损失+公允价值变动收益(损失的话用减)+投资收益
def check_operating_profit(security_item):
    income_statement_list = get_income_statement_items(security_item=security_item)
    for income_statement in income_statement_list:
        operatingProfit = income_statement["operatingRevenue"] \
                          - income_statement["operatingCosts"] \
                          - income_statement["businessTaxesAndSurcharges"] \
                          - income_statement["sellingExpenses"] \
                          - income_statement["ManagingCosts"] \
                          - income_statement["financingExpenses"] \
                          - income_statement["assetsDevaluation"] \
                          + income_statement["incomeFromChangesInFairValue"] \
                          + income_statement["investmentIncome"]
        diff = operatingProfit - income_statement["operatingProfit"]
        if abs(diff) >= 1:
            print("{} operating profit calculating not pass,calculating result:{},report result:{}".format(
                income_statement['id'], operatingProfit, income_statement["operatingProfit"]))
        else:
            print("{} operating profit calculating pass".format(income_statement['id']))

Можно использовать данный инструмент для быстрой проверки качества финансовых отчётов, а также для более глубокого понимания финансовых отчётов. NaN NaN NaN 2017-02-07 5.01 5.057833 NaN NaN NaN NaN 2017-02-08 5.05 5.056628 NaN NaN NaN NaN 2017-02-09 5.12 5.066378 NaN NaN NaN NaN 2017-02-10 5.27 5.097704 NaN NaN NaN NaN 2017-02-13 5.31 5.130365 NaN NaN NaN NaN 2017-02-14 5.84 5.239540 5.184121 0.055419 0.055419 0.000000 2017-02-15 6.09 5.370380 5.251223 0.119157 0.068166 0.101981 2017-02-16 5.98 5.464167 5.305206 0.158961 0.086325 0.145271 2017-02-17 5.70 5.500449 5.334450 0.165999 0.102260 0.127478 2017-02-20 5.78 5.543457 5.367454 0.176003 0.117009 0.117989 2017-02-21 5.81 5.584464 5.400235 0.184229 0.130453 0.107552 2017-02-22 5.95 5.640700 5.440959 0.199742 0.144310 0.110862 2017-02-23 5.81 5.666746 5.468295 0.198451 0.155139 0.086625 2017-02-24 5.69 5.670324 5.484718 0.185606 0.161232 0.048748 2017-02-27 5.59 5.657966 5.492516 0.165450 0.162076 0.006749 2017-02-28 5.66 5.658279 5.504922 0.153357 0.160332 -0.013950 2017-03-01 5.63 5.653928 5.514187 0.139741 0.156214 -0.032945

Мы не нуждаемся в таком количестве технических показателей, но обязательно нужно знать содержание используемых показателей, поэтому мы выбираем их вычислять сами. Конечно, поскольку данные унифицированы, то и вычисления унифицируются естественным образом. Независимо от того, это акции класса А, гонконгские акции или цифровые валюты, независимо от того, используется ли 1-минутный уровень или дневной график, используются унифицированные API.

1.3. Обратное тестирование

Для написания стратегии можно использовать подход, основанный на событиях, или пошаговый подход во времени. Подробнее см. в документе по проектированию (./docs/trader.md). Обратите внимание: обратные тестовые рамки всё ещё находятся на очень ранней стадии разработки.

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'])
            # 5-дневная скользящая средняя выше 10-дневной скользящей средней, и нет позиции, тогда покупаем
            if ma5 > ma10 and not self.account_service.get_position(current_security):
                self.buy(security_id=current_security, current_price=bar_item['close'])
            # 5-дневная скользящая средняя ниже 10-дневной скользящей средней и есть позиция, тогда продаём
            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

Можно запустить стратегию в реальном времени для просмотра результатов и дальнейшей оценки.

2. Архитектура

fooltrader — это система с чётко структурированной архитектурой, которую можно использовать на разных уровнях или расширять, модифицировать или заменять модули внутри неё.

3. Пошаговое использование

Используемые уровни соответствуют модулям в архитектуре, и вы можете остановиться на любом шаге, чтобы расширить или подключить свою собственную систему. Конечно, мы всё равно надеемся, что вы пройдёте весь путь, потому что каждый модуль в этой системе тщательно продуман, а последующие версии будут постоянно улучшаться.

3.1. Подготовка среды

Операционная система: Ubuntu 16.04.3 LTS. В принципе, можно использовать и другие системы, так как компоненты, используемые в системе, являются кроссплатформенными, но я тестировал только на Ubuntu и Mac. Память: >=8 ГБ. Жёсткий диск: чем больше, тем лучше.

Клонируйте или разветвите код.

$ git clone https://github.com/foolcage/fooltrader.git
$ cd fooltrader
$ ./init_env.sh

Если вы видите:

Requirements installed.  
env ok

Тогда поздравляю, теперь вы можете играть с ним. fooltrader/sched/sched_stock_meta.py

Собирать рыночные данные

$ python fooltrader/sched/sched_china_stock_quote.py

Собрать финансовые отчёты

$ python fooltrader/sched/sched_finance.py

Данный проект имеет несколько целей, одна из которых — облегчить обмен данными между пользователями, избегая необходимости каждому собирать исторические данные, что может привести к блокировке.

Также можно использовать [*скрипт*](./fooltrader/datamanager/zipdata.py) для архивирования данных и обмена ими.

Эти скрипты периодически собирают недостающие данные. После проверки целостности исторических данных они фактически собирают только данные за текущий день. Таким образом, мы получаем автоматизированную систему самообслуживания с полным источником данных.

Здесь сбор данных представлен как отдельный модуль, а не как в некоторых открытых проектах, где API и краулеры объединены. Это сделано для того, чтобы:
* Краулер занимался только сбором данных: фокусировался на скорости сбора, улучшал классификацию данных, дополнял данные и предотвращал блокировку.
* API разрабатывался в соответствии с [*протоколом данных*](./docs/contract.md), что обеспечивало более высокую скорость и гибкость.

Наконец, следует подчеркнуть, что данные собраны. Как их использовать? Обратитесь к [*протоколу данных*](./docs/contract.md).

Если вы не хотите использовать elastic-search или Python, но предпочитаете Java, MySQL или Superset, Redash, Hadoop и т. д., нет проблем. Согласно протоколу данных, вы легко сможете разместить данные там, где вам нужно для исследования.

Конечно, я бы предпочёл, чтобы вы внесли свой вклад в connector, отправив PR. Так вы повысите свой уровень кода и облегчите работу другим пользователям. Разве это не замечательно?
### 3.4 Установка elastic-search и Kibana (6.1.1)

Просто изменив хранилище данных, система претерпевает удивительные изменения.

Вы можете установить программное обеспечение, следуя официальному руководству: https://www.elastic.co/guide/en/elastic-stack/current/installing-elastic-stack.html.

Или вы можете выполнить следующие команды:
```bash
$ # Скачать Xpack
$ wget https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-6.1.1.zip
$ # Загрузить ES
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.1.1.zip
$ unzip elasticsearch-6.1.1.zip
$ cd elasticsearch-6.1.1/
$ # Установить плагин XPCCK для ES, используя загруженный x-pack-6.1.1.zip в формате file://+путь к файлу
$ bin/elasticsearch-plugin install file:///path/to/file/x-pack-6.1.1.zip
$ # Заменить конфигурацию ES по умолчанию на fooltrader's elasticsearch.yml
$ cp ../fooltrader/config/elasticsearch.yml config/
$ # Запустить ES, изменяя размер кучи по мере необходимости (<=32g)
$ ES_JAVA_OPTS="-Xms8g -Xmx8g"  ./bin/elasticsearch
$
$ # Загрузить Kibana
$ 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/
$ # Установить плагин XPCCK для Kibana, используя загруженный x-pack-6.1.1.zip в формате file://+ путь к файлу
$ bin/kibana-plugin install file:///path/to/file/x-pack-6.1.1.zip
$ # Заменить конфигурацию Kibana по умолчанию на fooltrader's kibana.yml
$ cp ../fooltrader/config/kibana.yml config/
$ ./bin/kibana

3.5 Сохранение данных в elastic-search

На этом этапе я всё ещё предполагаю, что вы работаете в среде fooltrader ipython.

In [1]: from fooltrader.connector import es_connector
# Собрать информацию о ценных бумагах -> ES
In [2]: es_connector.security_meta_to_es()
# Собрать данные индекса -> ES
In [3]: es_connector.kdata_to_es(security_type='index')
# Собрать исторические данные акций -> ES
In [4]: es_connector.kdata_to_es(security_type='stock')
# Вы также можете открыть несколько окон, указать диапазон и повысить скорость индексации.
In [4]: es_connector.kdata_to_es(start='002000',end='002999')
# Собрать финансовые данные -> ES
In [5]: es_connector.finance_sheet_to_es('balance_sheet')
In [5]: es_connector.finance_sheet_to_es('cash_flow_statement')
In [5]: es_connector.finance_sheet_to_es('income_statement')

Дополнительные функции можно найти непосредственно в исходном коде es_connector или добавить в запланированные задачи. Все функции индексации имеют проверку времени, добавляя только отсутствующие данные.

Теперь давайте кратко рассмотрим его возможности. Запрос топ-5 компаний с чистой прибылью за 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

...
``` **Использование kibana для анализа**

(документы требуют доработки)

**3.6 Использование kibana для анализа**  

(документы требуют доработки)  

**3.7 Обратное тестирование**  

(документы требуют доработки)  

**3.8 Торговля**  

(документы требуют доработки)  

### Поддерживаемые функции
* Рамочная программа для прокси-серверов поисковых роботов  

>Можно настроить пул серверов прокси и параллелизм, чтобы повысить надёжность поисковых роботов.

* Сбор данных  
  * Сбор информации о биржевых индексах A-акций  
  * Сбор тиковых данных A-акций  
  * Сбор дневных данных A-акций  
  * Сбор финансовых данных A-акций  
  * Сбор событий A-акций
  * Сбор данных о ценах на цифровые валюты
  * Сбор данных по фьючерсам

>Способ обработки данных заключается в том, что сначала определяется [*соглашение о данных*](./docs/contract.md), а затем ищутся источники данных. Преимущество этого подхода заключается в следующем: стабильность соглашения о данных закладывает прочную основу для стабильности всей системы; сравнение нескольких источников данных повышает точность данных; объединение нескольких источников данных улучшает полноту данных.

* Расчёт общих технических индикаторов (MA, EMA, MACD и т. д.)

* Структура обратного тестирования

>Цены на цветные металлы резко выросли, но цены на акции соответствующих листинговых компаний всё ещё находятся на историческом минимуме. Могу ли я купить немного?  
Покупайте золотые кресты, продавайте мёртвые кресты. Как они проявляются на разных уровнях? Как они проявляются в разных акциях?  
Одна и та же стратегия, как быстро провести обратное тестирование во всех акциях и сравнить их?  
Прибыль растёт, а цена акций тоже растёт? Или это проявляется заранее? Отстаёт? Каково соотношение различных проявлений?  
Как взаимодействуют различные стратегии, создавая синергию?  
#### Да, структура обратного тестирования должна учитывать эти вопросы.  

# Задачи
* Разработка DSL для торговли
* Интерфейс управления WEB, генерация стратегий в стиле руководства
* Реальные данные и расчёты в реальном времени с помощью Kafka
* Интеграция интерфейса торговли VNPY
* Сбор данных об акциях Гонконга

## 💌 Пригласите автора выпить кофе

Если вы считаете, что проект полезен для вас, вы можете пригласить автора выпить чашку кофе.  
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/alipay-cn.png" width="25%" alt="Alipay">     
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/wechat-cn.png" width="25%" alt="Wechat">

## 🤝 Контакты  

Присоединяйтесь к группе WeChat: foolcage, добавьте пароль: zvt  
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/wechat.jpeg" width="25%" alt="Wechat">

------
Публичный аккаунт WeChat:  
<img src="https://raw.githubusercontent.com/zvtvz/zvt/master/docs/imgs/gongzhonghao.jpg" width="25%" alt="Wechat">

Zhihu column:  
https://zhuanlan.zhihu.com/automoney

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/foolcage-fooltrader.git
git@api.gitlife.ru:oschina-mirror/foolcage-fooltrader.git
oschina-mirror
foolcage-fooltrader
foolcage-fooltrader
master