├── .gitignore
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── faq.md
├── introduction-to-risks.md
├── lists.md
├── mobilization-resistance.md
├── relocation.md
├── sanctions-risks-in-cryptocurrency.md
└── src
├── binance_open_data.ipynb
├── cryptocurrency_portfolio__assets_selection.py
├── fx_currencies_analysis.Rmd
├── fx_currencies_analysis.md
├── fx_currencies_analysis_files
└── figure-gfm
│ └── unnamed-chunk-3-1.png
├── fx_currency_portfolio__assets_selection.ipynb
└── fx_currency_portfolio__assets_selection.py
/.gitignore:
--------------------------------------------------------------------------------
1 | /data/*.csv
2 | /data/*.zip
3 |
--------------------------------------------------------------------------------
/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | # How to contribute?
2 |
3 | *Welcome on board!*
4 |
5 | If U have useful stuff related to this project's Objectives, feel free to create a branch(es) from `main`. Then just add content and [Pull request](https://github.com/codez0mb1e/resistance/pulls) changes.
6 |
7 | Thanks in advance :tada:!
8 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Creative Commons Legal Code
2 |
3 | CC0 1.0 Universal
4 |
5 | CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE
6 | LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN
7 | ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS
8 | INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES
9 | REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS
10 | PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM
11 | THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED
12 | HEREUNDER.
13 |
14 | Statement of Purpose
15 |
16 | The laws of most jurisdictions throughout the world automatically confer
17 | exclusive Copyright and Related Rights (defined below) upon the creator
18 | and subsequent owner(s) (each and all, an "owner") of an original work of
19 | authorship and/or a database (each, a "Work").
20 |
21 | Certain owners wish to permanently relinquish those rights to a Work for
22 | the purpose of contributing to a commons of creative, cultural and
23 | scientific works ("Commons") that the public can reliably and without fear
24 | of later claims of infringement build upon, modify, incorporate in other
25 | works, reuse and redistribute as freely as possible in any form whatsoever
26 | and for any purposes, including without limitation commercial purposes.
27 | These owners may contribute to the Commons to promote the ideal of a free
28 | culture and the further production of creative, cultural and scientific
29 | works, or to gain reputation or greater distribution for their Work in
30 | part through the use and efforts of others.
31 |
32 | For these and/or other purposes and motivations, and without any
33 | expectation of additional consideration or compensation, the person
34 | associating CC0 with a Work (the "Affirmer"), to the extent that he or she
35 | is an owner of Copyright and Related Rights in the Work, voluntarily
36 | elects to apply CC0 to the Work and publicly distribute the Work under its
37 | terms, with knowledge of his or her Copyright and Related Rights in the
38 | Work and the meaning and intended legal effect of CC0 on those rights.
39 |
40 | 1. Copyright and Related Rights. A Work made available under CC0 may be
41 | protected by copyright and related or neighboring rights ("Copyright and
42 | Related Rights"). Copyright and Related Rights include, but are not
43 | limited to, the following:
44 |
45 | i. the right to reproduce, adapt, distribute, perform, display,
46 | communicate, and translate a Work;
47 | ii. moral rights retained by the original author(s) and/or performer(s);
48 | iii. publicity and privacy rights pertaining to a person's image or
49 | likeness depicted in a Work;
50 | iv. rights protecting against unfair competition in regards to a Work,
51 | subject to the limitations in paragraph 4(a), below;
52 | v. rights protecting the extraction, dissemination, use and reuse of data
53 | in a Work;
54 | vi. database rights (such as those arising under Directive 96/9/EC of the
55 | European Parliament and of the Council of 11 March 1996 on the legal
56 | protection of databases, and under any national implementation
57 | thereof, including any amended or successor version of such
58 | directive); and
59 | vii. other similar, equivalent or corresponding rights throughout the
60 | world based on applicable law or treaty, and any national
61 | implementations thereof.
62 |
63 | 2. Waiver. To the greatest extent permitted by, but not in contravention
64 | of, applicable law, Affirmer hereby overtly, fully, permanently,
65 | irrevocably and unconditionally waives, abandons, and surrenders all of
66 | Affirmer's Copyright and Related Rights and associated claims and causes
67 | of action, whether now known or unknown (including existing as well as
68 | future claims and causes of action), in the Work (i) in all territories
69 | worldwide, (ii) for the maximum duration provided by applicable law or
70 | treaty (including future time extensions), (iii) in any current or future
71 | medium and for any number of copies, and (iv) for any purpose whatsoever,
72 | including without limitation commercial, advertising or promotional
73 | purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each
74 | member of the public at large and to the detriment of Affirmer's heirs and
75 | successors, fully intending that such Waiver shall not be subject to
76 | revocation, rescission, cancellation, termination, or any other legal or
77 | equitable action to disrupt the quiet enjoyment of the Work by the public
78 | as contemplated by Affirmer's express Statement of Purpose.
79 |
80 | 3. Public License Fallback. Should any part of the Waiver for any reason
81 | be judged legally invalid or ineffective under applicable law, then the
82 | Waiver shall be preserved to the maximum extent permitted taking into
83 | account Affirmer's express Statement of Purpose. In addition, to the
84 | extent the Waiver is so judged Affirmer hereby grants to each affected
85 | person a royalty-free, non transferable, non sublicensable, non exclusive,
86 | irrevocable and unconditional license to exercise Affirmer's Copyright and
87 | Related Rights in the Work (i) in all territories worldwide, (ii) for the
88 | maximum duration provided by applicable law or treaty (including future
89 | time extensions), (iii) in any current or future medium and for any number
90 | of copies, and (iv) for any purpose whatsoever, including without
91 | limitation commercial, advertising or promotional purposes (the
92 | "License"). The License shall be deemed effective as of the date CC0 was
93 | applied by Affirmer to the Work. Should any part of the License for any
94 | reason be judged legally invalid or ineffective under applicable law, such
95 | partial invalidity or ineffectiveness shall not invalidate the remainder
96 | of the License, and in such case Affirmer hereby affirms that he or she
97 | will not (i) exercise any of his or her remaining Copyright and Related
98 | Rights in the Work or (ii) assert any associated claims and causes of
99 | action with respect to the Work, in either case contrary to Affirmer's
100 | express Statement of Purpose.
101 |
102 | 4. Limitations and Disclaimers.
103 |
104 | a. No trademark or patent rights held by Affirmer are waived, abandoned,
105 | surrendered, licensed or otherwise affected by this document.
106 | b. Affirmer offers the Work as-is and makes no representations or
107 | warranties of any kind concerning the Work, express, implied,
108 | statutory or otherwise, including without limitation warranties of
109 | title, merchantability, fitness for a particular purpose, non
110 | infringement, or the absence of latent or other defects, accuracy, or
111 | the present or absence of errors, whether or not discoverable, all to
112 | the greatest extent permissible under applicable law.
113 | c. Affirmer disclaims responsibility for clearing rights of other persons
114 | that may apply to the Work or any use thereof, including without
115 | limitation any person's Copyright and Related Rights in the Work.
116 | Further, Affirmer disclaims responsibility for obtaining any necessary
117 | consents, permissions or other rights required for any use of the
118 | Work.
119 | d. Affirmer understands and acknowledges that Creative Commons is not a
120 | party to this document and has no duty or obligation with respect to
121 | this CC0 or use of the Work.
122 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Антикризисный риск-менеджмент
2 |
3 | [](CONTRIBUTING.md)
4 | [](LICENSE)
5 |
6 | ***Снижаем персональные риски в условиях кризиса***.
7 |
8 | ---
9 |
10 | В проекте:
11 |
12 | :heavy_plus_sign: Рассматривается использование *исключительно экономических или юридических* методов для минимизации *персональных рисков*.
13 |
14 | :heavy_minus_sign: *Не* рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума.
15 |
16 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете.
17 |
18 | ---
19 |
20 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть.
21 |
22 | ## :newspaper: **Последние обновления**
23 |
24 | **Октябрь 2020:**
25 |
26 | - :heavy_exclamation_mark: Начата работа над [списком мер для снижения риска быть незаконно мобилизованным](#мобилизация)
27 | - :heavy_exclamation_mark: Начата работа над [Иммиграция: экстренная и плановая](#иммиграция)
28 |
29 | Июнь 2022:
30 |
31 | - Обновлены [требования к брокерам](lists.md#требования-к-брокерам)
32 | - Обновлена информация [по блокировкам со стороны Coinbase](lists.md#криптобиржи)
33 | - Обновлена информация [VPN сервисам](lists.md#vpn-cервисы).
34 |
35 | Апрель-мaй 2022:
36 |
37 | - Расширенное сравнение для:
38 | - [стейблкоинов](lists.md#stablecoins)
39 | - [VPN сервисов](lists.md#vpn)
40 | - [кошельков](lists.md#некастодиальные-кошельки).
41 | - Для формирования низкорискованного валютного портфеля:
42 | - добавил скрипт [анализа волатильности валют](src/fx_currencies_analysis.md)
43 | - добавил скрипт [моделирования цен валют с использованием метода Монте-Карло](src/fx_currency_portfolio__assets_selection.ipynb).
44 |
45 | ---
46 |
47 | ## Мобилизация
48 |
49 | Список мер для снижения риска быть незаконно мобилизованным:
50 |
51 | - [Кому попытаются вручить повестку?](mobilization-resistance.md#кому-попытаются-вручить-повестку)
52 | - [Если ищут коллекторы...](mobilization-resistance.md#если-ищут-коллекторы)
53 | - [Когда пытаются вручить повестку...](mobilization-resistance.md#когда-пытаются-вручить-повестку)
54 | - [Когда вручили повестку...](mobilization-resistance.md#когда-вручили-повестку)
55 | - [В военкомате...](mobilization-resistance.md#в-военкомате)
56 | - [:telephone_receiver: Экстренные контакты](mobilization-resistance.md#telephone_receiver-экстренные-контакты)
57 | - [:link: Полезные ссылки](mobilization-resistance.md#link-полезные-ссылки)
58 |
59 | ## Иммиграция
60 |
61 | Чек-лист по подготовке к экстренной и плановой релокации:
62 |
63 | - [Документы](relocation.md#документы)
64 | - [Первоочередные документы](relocation.md#первоочередные-документы)
65 | - [Дополнительные документы](relocation.md#дополнительные-документы)
66 | - [Для получение рабочей визы/ВНЖ](relocation.md#для-получение-рабочей-визывнж)
67 | - [Экстренная релокация](relocation.md#экстренная-релокация)
68 | - [Подготовка](relocation.md#подготовка)
69 | - [В аэропорту/на границе](relocation.md#в-аэропортуна-границе)
70 | - [В стране иммиграции](relocation.md#в-стране-иммиграции)
71 | - [Плановая релокация](relocation.md#плановая-релокация)
72 | - [Подготовка](relocation.md#подготовка-1)
73 | - [:link: Полезные ссылки](relocation.md#link-полезные-ссылки)
74 |
75 | ## Личные финанcы условиях санкций
76 |
77 | Риск-менеджмент личных финансов условиях санкций и/или финансового кризиса:
78 |
79 | - [Глупые стратегии и большие риски](introduction-to-risks.md#глупые-стратегии-и-большие-риски)
80 | - [Сценарий I: «Черный день»](introduction-to-risks.md#сценарий-i-черный-день)
81 | - [Цель](introduction-to-risks.md#цель)
82 | - [План](introduction-to-risks.md#план)
83 | - [Сроки](introduction-to-risks.md#сроки)
84 | - [Сценарий II: Блэкаут](introduction-to-risks.md#сценарий-ii-блэкаут)
85 | - [Цель](introduction-to-risks.md#цель-1)
86 | - [План](introduction-to-risks.md#план-1)
87 | - [Сроки](introduction-to-risks.md#сроки-1)
88 | - [Сценарий III: Утрата сбережений](introduction-to-risks.md#сценарий-iii-утрата-сбережений)
89 | - [Цель](introduction-to-risks.md#цель-2)
90 | - [План](introduction-to-risks.md#план-2)
91 | - [Сроки](introduction-to-risks.md#сроки-2)
92 | - [Итак...](introduction-to-risks.md#итак)
93 | - [~~Общее~~ Важное](introduction-to-risks.md#общее-важное)
94 | - [:link: Полезные ссылки](introduction-to-risks.md#link-полезные-ссылки)
95 |
96 | ## Инвестиции в криптовалюту в условии санкций
97 |
98 | Риск-менеджмент инвестиций в криптовалюту в условии санкций:
99 |
100 | - [:date: Важные новости](sanctions-risks-in-cryptocurrency.md#date-важные-новости)
101 | - [TL;DR](sanctions-risks-in-cryptocurrency.md#tldr)
102 | - [0. Правила игры (подготовка)](sanctions-risks-in-cryptocurrency.md#0-правила-игры-подготовка)
103 | - [1. Что хранить?](sanctions-risks-in-cryptocurrency.md#1-что-хранить)
104 | - [Криптовалюта со свободным курсом](sanctions-risks-in-cryptocurrency.md#криптовалюта-со-свободным-курсом)
105 | - [Стейблкоин](sanctions-risks-in-cryptocurrency.md#стейблкоин)
106 | - [:pushpin: Что хранить... а что не стоит](sanctions-risks-in-cryptocurrency.md#pushpin-что-хранить-а-что-не-стоит)
107 | - [2. Где хранить?](sanctions-risks-in-cryptocurrency.md#2-где-хранить)
108 | - [Биржи](sanctions-risks-in-cryptocurrency.md#биржи)
109 | - [Кошельки](sanctions-risks-in-cryptocurrency.md#кошельки)
110 | - [:pushpin: Где хранить... а где не стоит](sanctions-risks-in-cryptocurrency.md#pushpin-где-хранить-а-где-не-стоит)
111 | - [Итак](sanctions-risks-in-cryptocurrency.md#итак)
112 | - [:link: Полезные ссылки](sanctions-risks-in-cryptocurrency.md#link-полезные-ссылки)
113 |
114 | ## Важные списки
115 |
116 | Наиболее полезные списки:
117 |
118 | - [Законодательные акты](lists.md#законодательные-акты)
119 | - [Ограничения по операция с иностранной валюты](lists.md#ограничения-по-операция-с-иностранной-валюты)
120 | - [Список недружественных государств](lists.md#список-недружественных-государств)
121 | - [Полезные ссылки](lists.md#полезные-ссылки)
122 | - [Список надежных российских банков.](lists.md#список-надежных-российских-банков)
123 | - [Требования к банкам](lists.md#требования-к-банкам)
124 | - [Банки под санкциями](lists.md#банки-под-санкциями)
125 | - [Список надежных банков](lists.md#список-надежных-банков)
126 | - [Полезные ссылки](lists.md#полезные-ссылки-1)
127 | - [Список надежных российских брокеров](lists.md#список-надежных-российских-брокеров)
128 | - [Иностранные брокеры](lists.md#иностранные-брокеры)
129 | - [Российские брокеры](lists.md#российские-брокеры)
130 | - [Полезные ссылки](lists.md#полезные-ссылки-2)
131 | - [Надежные почтовые сервисы](lists.md#надежные-почтовые-сервисы)
132 | - [Российские почтовые сервисы](lists.md#российские-почтовые-сервисы)
133 | - [Иностранные почтовые сервисы](lists.md#иностранные-почтовые-сервисы)
134 | - [Криптовалюты](lists.md#криптовалюты)
135 | - [Stablecoins](lists.md#stablecoins)
136 | - [Некастодиальные кошельки](lists.md#некастодиальные-кошельки)
137 | - [Криптобиржи](lists.md#криптобиржи)
138 | - [Сервисы поиска обменников](lists.md#сервисы-поиска-обменников)
139 | - [VPN](lists.md#vpn)
140 | - [VPN cервисы](lists.md#vpn-cервисы)
141 | - [Другие инструменты обхода блокировок](lists.md#другие-инструменты-обхода-блокировок)
142 | - [Полезные ссылки](lists.md#полезные-ссылки-3)
143 | - [Список софта](lists.md#список-софта)
144 |
--------------------------------------------------------------------------------
/faq.md:
--------------------------------------------------------------------------------
1 | # Часто задаваемые вопросы
2 |
3 | **Для наличных средств**:
4 |
5 | - [В какой валюте хранить наличные средства?](#в-какой-валюте-хранить-наличные-средства)
6 | - [Как выбрать соотношение рублей, иностранной валюты для наличных средств?](#как-выбрать-соотношение-рублей-иностранной-валюты-для-наличных-средств)
7 |
8 | ---
9 |
10 | :information_source: Для российских банков и брокеров только.
11 |
12 | ### В какой валюте хранить наличные средства?
13 |
14 | Для электронных наличных средств (на банковском или брокерском счете): храните рублях и валюте, которую вы быстро (в течение дня) можете обменять в банке или у брокера. На сентябрь 2022 года это `CNY` (китайский юань). Хранение `USD` (американский доллар) и `EUR` (евро) сопряжено с высокими рисками и дополнительными комиссионными расходами.
15 |
16 | ### Как выбрать соотношение рублей, иностранной валюты для наличных средств?
17 |
18 | Оценить вероятность, что ЦБ введет фиксированный курс с одновременным запретом покупки/продажи валюты на открытом рынке.
19 |
20 | Чем выше эта вероятность, тем бОльшая доля наличных средств в рублях должна быть в корзине; максимальную долю рублей имеет смысл ограничиться 80%.
21 |
22 | Чем ниже эта вероятность, тем бОльшая доля наличных средств в иностранной валюте должна быть. Минимальная долю рубля имеет смысл ограничить 30%.
23 |
24 | ### Как сформировать низкорискованный валютный портфель?
25 |
26 | :warning: После сентября 2022 - неактуально.
27 |
28 | 1. [Проанализируйте волатильности валют](src/fx_currencies_analysis.md) на основе исторических данных и выберете те, риски по которым ниже рублевых.
29 | 2. [Смоделируйте цены валют](src/fx_currency_portfolio__assets_selection.ipynb), выбранных на шаге 1, с использованием метода Монте-Карло.
30 | 3. Основываясь на результатах моделирования, выберите наиболее подходящие Вам по соотношению доходность/риски валютные пары.
31 |
--------------------------------------------------------------------------------
/introduction-to-risks.md:
--------------------------------------------------------------------------------
1 | # Россия 2022: как не потерять все?
2 |
3 | 
4 |
5 | ***Риск-менеджмент личных финансов условиях санкций и/или финансового кризиса: делаем сегодня все, чтобы завтра избежать фатальных последствий***.
6 |
7 | ---
8 |
9 | :heavy_plus_sign: Рассматривается использование *исключительно экономических* методов по минимизации персональных рисков.
10 |
11 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума.
12 |
13 | ---
14 |
15 | Содержание:
16 |
17 | - [Глупые стратегии и большие риски](#глупые-стратегии-и-большие-риски)
18 | - [Сценарий I: «Черный день»](#сценарий-i-черный-день)
19 | - [Цель](#цель)
20 | - [План](#план)
21 | - [Сроки](#сроки)
22 | - [Сценарий II: Блэкаут](#сценарий-ii-блэкаут)
23 | - [Цель](#цель-1)
24 | - [План](#план-1)
25 | - [Сроки](#сроки-1)
26 | - [Сценарий III: Утрата сбережений](#сценарий-iii-утрата-сбережений)
27 | - [Цель](#цель-2)
28 | - [План](#план-2)
29 | - [Сроки](#сроки-2)
30 | - [Итак...](#итак)
31 | - [~~Общее~~ Важное](#общее-важное)
32 | - [:link: Полезные ссылки](#link-полезные-ссылки)
33 |
34 | ---
35 |
36 | - :warning: Непонимание работы используемых инвестиционных инструментов: акций, облигаций, криптовалюты и/или производных финансовых инструментов - несет в себе **риски полной утраты средств**.
37 | - :warning: Несоблюдение правил ИТ-безопасности, таких как сильные неповторяющиеся пароли, 2FA, [безопасный браузер](lists.md#список-софта), [защищенное соединение](lists.md#vpn) - несет в себе **риски полной утраты средств**.
38 | - :warning: Невыполнение [законодательства](lists.md#законодательные-акты) юрисдикций, через которые происходит инвестирование, несет в себе **риски полной утраты средств**.
39 | - :warning: Слепое следование чужим инвестиционным идеям несет в себе **риски полной утраты средств**.
40 |
41 | Ничего из перечисленного в данном репозитории не является финансовой рекомендацией. К моменту прочтения вами статьи какая-то информация ниже может уже устареть.
42 |
43 | ---
44 |
45 | ## Глупые стратегии и большие риски
46 |
47 | Самое первое, что стоит понять: позиция, что «*нужно пересидеть*» так же нежизнеспособна, как и «*куплю подешевевших российских акций на всю котлету*». Просто, потому что в первом случае – вы закрываете глаза на риски, а во втором – берете дополнительные (ну и торги российскими акциями на бирже закрыты с понедельника).
48 |
49 | То, что вам нужно называется «*Управление рисками*». И начать этим заниматься нужно, *как можно скорее*.
50 |
51 | Я составил план (он подойдет не всем, и это нормально). И как бы это громко не звучало, это мой гражданский долг рассказать о нем тем, кто разделяет мою тревогу.
52 |
53 | 3 основных **финансовых последствия от санкций и контрсанкций**, которые (последствия) с высокой вероятностью наступят:
54 |
55 | 1. Потеря работы или основного источника дохода («Черный день»),
56 | 2. Отключение от мировой финансовой инфраструктуры и ИТ инфраструктуры (Блэкаут),
57 | 3. Почти полная (~90%) утрата сбережений.
58 |
59 | И, с точки зрения финансов, все это **системные риски** – они *реализуются не для меня одного, а для большинства участников российского финансового рынка*.
60 |
61 | Разберем каждый из рисков подробнее.
62 |
63 | ## Сценарий I: «Черный день»
64 |
65 | Сценарий «Черный день» – ситуация, когда большое количество людей (в т.ч. я) не смогут выполнять своих финансовых обязательств (платить за ипотеку, покупать достаточно продуктов) из-за **потери источника дохода или размер доходов не будет покрывать финансовых обязательств**.
66 |
67 | *Пример*: компания, в которой я работаю объявила себя банкротом, а у меня ипотека, неработающая жена, которая ухаживает за маленьким ребенком.
68 |
69 | ### Цель
70 |
71 | На риск потери работы уже поздно влиять (но можно). А вот риск неплатежеспособности в случае потери таковой снизить можно.
72 |
73 | ### План
74 |
75 | Что нужно сделать?
76 |
77 | - Оценить свои активы и долги
78 | - Держать в кэше средства, которых *хватит на 3 месяца*:
79 | - 60% из них держать в рублях
80 | - 40% - в долларах и/или евро
81 | - Снизить долговую нагрузку:
82 | - воздержаться от получения новых кредитов
83 | - закрыть все кредитные договоры *в валюте*
84 | - закрыть все кредитные договоры *с плавающей ставкой*
85 | - (по возможности) закрыть мелкие кредиты/рассрочки
86 | - (обязательно) отдать долги друзьям и близким , или обговорить с ними, как будете рассчитываться, если Черный день настанет
87 | - Отказаться на ближайшие 3 месяца:
88 | - от покупки дорогостоящих вещей
89 | - от поездок в отпуск.
90 |
91 | ### Сроки
92 |
93 | Выполнить план на горизонте до 3-ех месяцев.
94 |
95 | ## Сценарий II: Блэкаут
96 |
97 | Сценарий Блэкаут – ситуация, когда отключение от мировой финансовой системы и ИТ-системы приведет **к утрате доступа над собственными финансовыми активами**.
98 |
99 | ### Цель
100 |
101 | Снизить риски наступления санкций/контрсанкций я не могу. А вот снизить риски полной (но не временной) потери контроля над своими банковскими и/или инвестиционными счетами - вполне.
102 |
103 | ### План
104 |
105 | #### Финансовая инфраструктура: что сделать?
106 |
107 | По банковским счетам:
108 |
109 | - Иметь пластиковые (можно виртуальные, но лучше физические) карты, отвечающие следующим требования:
110 | - эмитенты карт: [надежные российские частные банки](lists.md#список-надежных-банков) не под санкциями (Тинькофф)
111 | - платежные системы: Visa, Mastercard, *Мир*
112 | - счета: рублевые, долларовые, (желательно) евро.
113 |
114 | По инвестиционным счетам:
115 |
116 | - Иметь верифицированные (пройти KYC/AML процедуры) аккаунты:
117 | - у 2-ух [российских надежных брокеров](lists.md#список-надежных-брокеров), которые не под санкциями (Тинькофф, БКС)
118 | - у 2-ух [иностранных брокеров](lists.md#список-надежных-брокеров), из юрисдикций разрешенных в РФ
119 | - Иметь верифицированные аккаунты у минимум одного крипто брокера (Binance)
120 | - Информация для российских брокеров:
121 | - Установить *контактный телефон и email на российские* (например, Мегафон/Теле2 и Яндекс.Почта)
122 | - Информация для иностранных и крипто брокеров:
123 | - Установить *email от иностранного почтового хостинга* (Protonmail, Gmail)
124 | - Если есть 2FA, то сменить его *с SMS на нероссийское [приложение-аутентификатор](https://www.kaspersky.ru/blog/best-authenticator-apps-2022/32158/)* (Google Authenticator, Microsoft Authenticator) или (лучше) аппаратный ключ (Yubikey).
125 |
126 | #### Инфраструктура связи: что сделать?
127 |
128 | - Купить подписку на *VPN сервис, который не ведет логов подключения и находится за пределами российской юрисдикции* (Mullvad VPN, Proton VPN)
129 | - Разобраться как поднять [собственный VPN сервер](https://habr.com/ru/company/amnezia/blog/546424/) (и скачайте нужные статьи)
130 | - Разобраться в [сетевых роутерах](https://habr.com/ru/post/491540/) (особенно в домашнем)
131 | - 2 SIMки от разных операторов
132 | - Отремонтировать все вычислительные устройства, которые вам могут пригодиться (ожидаем жесткий [дефицит компьютерной техники](https://www.tomshardware.com/news/intel-amd-nvidia-tsmc-russia-stop-chip-sales-ukraine-sanction))
133 | - Скачать на жесткий диск все дистрибутивы необходимого ПО (минимум ОС, Chrome или Brave, VPN клиент) *как для desktop, так и на мобильный*
134 | - *3 бекапа для важных вещей*: зашифрованный жесткий диск, зашифрованная флешка, облачный жесткий диск вне российской юрисдикции (Microsoft Azure Storage, OneDrive).
135 |
136 | #### Социальные связи: что сделать?
137 |
138 | - Поддерживать дружбу с теми, кто уехал заграницу (одноклассники, сокурсники, просто друзья детства; напишите им пусть даже вы со школы не общались)
139 | - Найти среди знакомых/в сети людей, которые хорошо разбираются в том, что вы из плана выше совсем не понимаете
140 | - Забэкапить контакты людей, которые могут помочь.
141 |
142 | ### Сроки
143 |
144 | Выполнить план на горизонте до 6-ти месяцев.
145 |
146 | ## Сценарий III: Утрата сбережений
147 |
148 | Сценарий «Утрата сбережений» – ситуация, когда **сбережения будут обесценены** (вследствие гиперинфляции, дефолта), **изъяты в пользу любой из конфликтующих сторон** или **доступ к ним будет ограничен**. Пример приводить не буду – достаточно познакомиться с современной историей России.
149 |
150 | ### Цель
151 |
152 | Диверсифицировать свои накопления так, чтобы гиперинфляция, дефолт, запрет на покупку иностранных/российских акций не привели к почти полной утрате капитала.
153 |
154 | ### План
155 |
156 | #### Финансовая инфраструктура: что сделать?
157 |
158 | Для счетов у российских брокеров - *избавьтесь от иностранного долга*:
159 |
160 | - Продать долговые обязательства (облигации) иностранных компаний
161 | - Продать все иностранные ETF
162 | - Продать низколиквидные ценные бумаги и активы.
163 |
164 | Для счетов у иностранных брокеров - *избавьтесь от российских активов*:
165 |
166 | - Продать все акции/облигации российских компаний и ОФЗ
167 | - Оставить только средства, которые вы готовы не выводить на горизонте 3+ лет
168 | - Задекларировать все счета, открытые у разрешенных на территории РФ брокеров.
169 |
170 | Для крипто брокеров:
171 |
172 | - Перевести значительную часть средств (до 90%) на холодный кошелек.
173 |
174 | #### ИТ инфраструктура: что сделать?
175 |
176 | - Включить шифрование данных на дисках, хранящих финансовые данные
177 | - Включить шифрование данных для на мобильных устройствах, хранящих финансовые данные
178 | - Включить VPN для траффика, содержащего финансовые данные, на всех устройствах.
179 |
180 | #### Социальные связи: что сделать?
181 |
182 | - Найти адвоката/юриста и введите его в курс своих дел
183 | - Загран паспорт со сроком действия минимум до 2025 года для *себя и членов семьи*
184 | - Решить все юридические вопросы, которые мешают экстренно выехать за границу
185 | - Написать доверенность на управление имуществом (квартира, машина) на имя человека, которому доверяете.
186 |
187 | ### Сроки
188 |
189 | Выполнить план на горизонте до 1 года.
190 |
191 | ## Итак...
192 |
193 | Итак, в сухом ~~как слезы моей бывшей~~ остатке:
194 |
195 | | Где хранится | Соотношение RUB/USD* | Риски обесценивания на горизонте года | Риски утраты контроля | Вывод средств потенциально может быть невозможен в течение... |
196 | | -- | -- | -- | -- | -- |
197 | | Наличные средства | 70% RUB, 30% USD* | Очень высокие | Низкие | Средства могут быть изъяты в любой момент |
198 | | Инвест-счета у российских брокеров | 50% RUB, 50% USD/EUR** | Высокие | Средние | 0.5-1 год |
199 | | Инвест-счета у иностранных брокеров | 100% USD** | Низкие | Высокие | 1-3 года |
200 | | Инвест-счета у крипто брокеров | 100% USD** | Средние | Средние | 1-3 года |
201 | | Холодный крипто кошелек | 100% USD** | Средние | Низкие | 1-3 года |
202 |
203 | \* См. ["Как выбрать соотношение рублей, иностранной валюты для наличных средств?"](faq.md#как-выбрать-соотношение-рублей-иностранной-валюты-для-наличных-средств)
204 |
205 | \** Для инвест-счетов - валюта, в которой приобретены активы (акции).
206 |
207 | :warning: Не переводите средства на валютные счета за границу, пока не разберетесь в ограничениях на [перевод иностранной валюты заграницу](lists.md#законодательные-акты-ограничивающие-покупку-иностранной-валюты-и-активов).
208 |
209 | ## ~~Общее~~ Важное
210 |
211 | - Учите английский
212 | - Инвестируйте (хотя бы время) в самообразование
213 | - Поддерживайте гражданские институты
214 | - Не ссыте (волков бояться - в лес не ходить)
215 | - Помогайте людям.
216 |
217 | ## :link: Полезные ссылки
218 |
219 | 1. **[Этот пост и обсуждения](https://habr.com/ru/post/654313/) на Habr.**
220 |
221 | Peace.
222 |
--------------------------------------------------------------------------------
/lists.md:
--------------------------------------------------------------------------------
1 | # Наиболее важные списки
2 |
3 | 
4 |
5 | - [Законодательные акты](#законодательные-акты)
6 | - [Ограничения по операция с иностранной валюты](#ограничения-по-операция-с-иностранной-валюты)
7 | - [Список недружественных государств](#список-недружественных-государств)
8 | - [Полезные ссылки](#полезные-ссылки)
9 | - [Список надежных российских банков.](#список-надежных-российских-банков)
10 | - [Требования к банкам](#требования-к-банкам)
11 | - [Банки под санкциями](#банки-под-санкциями)
12 | - [Список надежных банков](#список-надежных-банков)
13 | - [Полезные ссылки](#полезные-ссылки-1)
14 | - [Список надежных российских брокеров](#список-надежных-российских-брокеров)
15 | - [Иностранные брокеры](#иностранные-брокеры)
16 | - [Российские брокеры](#российские-брокеры)
17 | - [Полезные ссылки](#полезные-ссылки-2)
18 | - [Надежные почтовые сервисы](#надежные-почтовые-сервисы)
19 | - [Российские почтовые сервисы](#российские-почтовые-сервисы)
20 | - [Иностранные почтовые сервисы](#иностранные-почтовые-сервисы)
21 | - [Криптовалюты](#криптовалюты)
22 | - [Stablecoins](#stablecoins)
23 | - [Некастодиальные кошельки](#некастодиальные-кошельки)
24 | - [Криптобиржи](#криптобиржи)
25 | - [Сервисы поиска обменников](#сервисы-поиска-обменников)
26 | - [VPN](#vpn)
27 | - [VPN cервисы](#vpn-cервисы)
28 | - [Другие инструменты обхода блокировок](#другие-инструменты-обхода-блокировок)
29 | - [Полезные ссылки](#полезные-ссылки-3)
30 | - [Список софта](#список-софта)
31 |
32 | ## Законодательные акты
33 |
34 | ### Ограничения по операция с иностранной валюты
35 |
36 | :warning: Не актуально.
37 |
38 | Что запрещено, если Вы резидент:
39 |
40 | - :no_entry: Вывозить больше $10 000 наличной валюты
41 | - :no_entry: Снимать с валютных счетов больше $10 000 в долларах
42 | - :no_entry: Покупать валюту в кассах банка или обменниках
43 | - :no_entry: Перечислять другим людям за рубеж больше $5000 в месяц
44 | - :no_entry: Давать в долг в валюте иностранцам
45 | - :no_entry: Зачислять валюту на свои счета в иностранных банках и других финансовых организациях
46 | - :no_entry: Переводить деньги без открытия банковского счета через иностранные платежные системы
47 | - :no_entry_sign: Без специального разрешения давать взаймы в рублях, продавать и покупать ценные бумаги и недвижимость у граждан и компаний [государств, которые ввели санкции против России](#список-недружественных-государств).
48 | - Разрешение потребуется и на покупку бумаг и недвижимости у иностранных граждан и компаний, если они приобрели эти активы у лиц из стран, наложивших санкции на Россию
49 | - :no_entry_sign: Без специального разрешения ЦБ приобретать доли в зарубежных компаниях
50 | - На словах есть заявления, что это не касается акций, но в указе про это ни слова.
51 |
52 | Не запрещено российскими законами, но невозможно:
53 |
54 | - :no_entry_sign: Переводить валюту за рубеж через бОльшую часть [банков, попавших под санкции](#банки-под-санкциями)
55 | - :no_entry_sign: Пользоваться картами Visa, MasterCard, Wester Union, JCB за рубежом
56 | - :no_entry_sign: Расплачиваться с помощью Apple Pay и Google Pay
57 | - :no_entry_sign: Покупать иностранные бумаги через [брокеров, попавших под санкции](#брокеры-под-санкциями).
58 |
59 | ### Список недружественных государств
60 |
61 | Правительство России [утвердило список недружественных государств](http://government.ru/news/44745/):
62 |
63 | - США
64 | - Австралия
65 | - Албания
66 | - Андорра
67 | - Великобритания (включая о. Джерси (коронное владение Британской короны) и подконтрольные заморские территории - о. Ангилья, Британские Виргинские острова, Гибралтар)
68 | - 27 государств - члены Европейского союза
69 | - Исландия
70 | - Канада
71 | - Лихтенштейн
72 | - Микронезия
73 | - Монако
74 | - Новая Зеландия
75 | - Норвегия
76 | - Республика Корея
77 | - Сан-Марино
78 | - Северная Македония
79 | - Сингапур
80 | - Тайвань (Китай)
81 | - Украина
82 | - Черногория
83 | - Швейцария
84 | - Япония.
85 |
86 | ### Полезные ссылки
87 |
88 | Указы и пояснения к ним:
89 |
90 | 1. [Указ о применении специальных экономических мер в связи с недружественными действиями США и примкнувших к ним иностранных государств и международных организаций](http://kremlin.ru/events/president/news/67881) от 28 февраля 2022, Kremlin.ru.
91 | 1. [Дополнительные пояснения к указу](https://vc.ru/o2consulting/372985-novye-valyutnye-ogranicheniya-dlya-rezidentov-analiz-ukaza-prezidenta-rf-ot-28-02-2022), VC.ru.
92 | 1. [Информационное письмо об ограничении переводов физических лиц-резидентов](https://cbr.ru/Crosscut/LawActs/File/5817) от 9 марта 2022, ЦБ.
93 | 1. [Временный порядок операций с наличной валютой](https://www.cbr.ru/press/event/?id=12738) от 9 марта 2022, ЦБ.
94 | 1. [Разбор](https://habr.com/ru/news/t/654809/), Habr.
95 |
96 | Официальные источники:
97 |
98 | 1. [Работа финансовой системы в условиях санкционных ограничений](https://www.cbr.ru/faq/w_fin_sector/), ЦБ
99 | 1. [Официальный канал Минфина России](https://t.me/minfin) в Telegram
100 | 1. [Официальный канал Центробанка России](https://t.me/centralbank_russia) в Telegram
101 |
102 | Полезные статьи:
103 |
104 | 1. (Частично устарел) [Гайд: работающие способы вывести деньги за рубеж / завести в Россию](https://habr.com/ru/post/654155/), Habr.
105 |
106 | ## Список надежных российских банков.
107 |
108 | ### Требования к банкам
109 |
110 | Банк должен соответствовать всем нижеперечисленным требованиям:
111 |
112 | - Не находится под санкциями, включая родительские и дочерние компании (см. [Банки под санкциями](#банки-под-санкциями))
113 | - Не принадлежит российскому государству или доля государства в уставном капитале невелика
114 | - Не принадлежит иностранной финансовой группе
115 | - Входит в [TOP 30 банков по капитализации](https://www.banki.ru/banks/ratings/).
116 |
117 | ### Банки под санкциями
118 |
119 | - ВТБ
120 | - Открытие и дочерний банк Точка
121 | - Новикомбанка
122 | - Совкомбанка
123 | - Газпромбанк
124 | - Россельхозбанк
125 | - Альфа-Банк
126 | - Московский Кредитный Банк
127 | - Сбербанк
128 | - Банк Россия
129 | - Промсвязьбанк.
130 |
131 | ### Список надежных банков
132 |
133 | :warning: Не актуально.
134 |
135 | - Tinkoff банк
136 | - Банк Санкт-Петербург
137 |
138 | ### Полезные ссылки
139 |
140 | Официальные источники:
141 |
142 | 1. [Список системно-значимых банков](http://www.cbr.ru/banking_sector/credit/systembanks.html/), ЦБ.
143 | 1. [Рейтинг надёжности банков в РФ от Forbes](https://www.forbes.ru/rating/424063-100-nadezhnyh-rossiyskih-bankov-2021-reyting-forbes), Forbes.
144 | 1. [Санкции против РФ, 2022](https://ru.wikipedia.org/wiki/%D0%A1%D0%B0%D0%BD%D0%BA%D1%86%D0%B8%D0%B8_%D0%BF%D1%80%D0%BE%D1%82%D0%B8%D0%B2_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8_(2022)), wikipedia.
145 |
146 | Полезные статьи:
147 |
148 | 1. [Как работают банки под санкциями](https://vc.ru/finance/370973-kak-rabotayut-banki-pod-sankciyami-i-chto-pomenyaetsya-dlya-klientov-sbera-psb-tochki-i-drugih-podrobnosti)
149 | 1. [Российские банки попали под санкции — разбираемся в ограничениях](https://frankrg.com/61074)
150 |
151 | ## Список надежных российских брокеров
152 |
153 | ### Иностранные брокеры
154 |
155 | #### Брокеры, которые перестали работать с российскими резидентами
156 |
157 | - :no_entry_sign: Exante: 2022-03-09 ответили, что не работают с российскими резидентами.
158 |
159 |
160 | ### Российские брокеры
161 |
162 | #### Требования к брокерам
163 |
164 | Брокер должен соответствовать всем нижеперечисленным требованиям:
165 |
166 | - Не находится [под санкциями](#брокеры-под-санкциями), включая родительские и дочерние компании
167 | - Не принадлежит российскому государству или доля государства в уставном капитале невелика
168 | - Не принадлежит иностранной финансовой группе
169 | - Входит в TOP 30 брокеров по количеству активных клиентов
170 | - Если у брокера есть родителький банк, то он не под санкциями
171 | - Есть возможность отключения сделок-овернайт.
172 |
173 | #### Список надежных брокеров
174 |
175 | :warning: Не актуально.
176 |
177 | - Tinkoff Инвестиции
178 | - БКС
179 | - Финам
180 |
181 | #### Брокеры под санкциями
182 |
183 | - ВТБ Инвестиции
184 | - Открытие Брокер
185 | - Газпромбанк Инвестиции
186 | - Альфа-Капитал
187 | - МКБ Инвестиции
188 | - Сбербанк Инвестиции
189 |
190 | ### Полезные ссылки
191 |
192 | Полезные статьи:
193 |
194 | 1. [Выбираем брокеров для работы под санкциями](https://tinstaafl.shrv.xyz/brokersVSsanctions).
195 |
196 | ## Надежные почтовые сервисы
197 |
198 | ### Российские почтовые сервисы
199 |
200 | - Яндекс.Почта
201 |
202 | ### Иностранные почтовые сервисы
203 |
204 | - Protonmail ([заблокирован РКН](https://rkn.gov.ru/press/publications/news71692.htm))
205 | - Gmail
206 | - Outlook.com
207 |
208 | ## Криптовалюты
209 |
210 | Изучите [как хранить криптовалюту в условиях санкций](sanctions-risks-in-cryptocurrency.md) при необходимости.
211 |
212 | ### Stablecoins
213 |
214 | Стейблкоины и риски блокировки/потери средств:
215 |
216 | | | Token | Project/Company | Target Price | Collateralization | Transparency/Audit | Decentralized | Type | Reviews | Hacks Risks | Defaults Risks | Sanctions Risks |
217 | | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- | -- |
218 | | :no_entry: | `UST` | Terra | $1 | LUNA, BTC | Medium | **+** | Algorithmic | [UST Falls to $0.35](https://www.coindesk.com/markets/2022/05/11/ust-falls-to-035-terra-futures-see-106m-in-liquidations/) | Medium | The highest | The lowest |
219 | | :white_check_mark: | **`DAI`** | MakerDAO | $1 | [USDC, ETH, WBTC](DaiStats.com) | High | + | Smart contract | [1](https://forklog.com/chto-takoe-makerdao/), [2](https://vc.ru/finance/387874-kak-natyanut-sovu-na-globus-razbiraem-kak-decentralizovannyy-steyblkoin-dai-mozhet-zashchitit-vashi-dengi) | Medium | Low | **The lowest** |
220 | | :o: | `USDT` | Tether | $1 | [US Treasury, Bonds, Cash](https://assets.ctfassets.net/vyse88cgwfbl/4hiNJsZ98LlZqCJHKzrLpV/2b6338482ef0093382885f80ba6f1083/Tether_Assurance-12-31-21.pdf) | Poor | - | Classic (fiat based) | [1](https://vc.ru/finance/381435-udivitelnaya-istoriya-tether-usdt-lyudi-otnesli-80-milliardov-plasticheskomu-hirurgu-kotoryy-ne-garantiruet-ih-vozvrat)| Low | Medium | The highest |
221 | | :white_check_mark: | `USDC` | Circle | $1 | [100% Cash](https://www.centre.io/hubfs/PDF/2022%20Circle%20Examination%20Report%20February%202022.pdf?hsLang=en) | [Medium](https://www.centre.io/usdc-transparency?hsLang=en) | - | Classic (fiat based) | | Low | Low | Medium |
222 | | :white_check_mark: | `BUSD` | Binance (via Paxos)| $1 | [Cash, US Treasury](https://paxos.com/busd/) | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Low |
223 | | :o: | `USDP` | Paxos | $1 | | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Medium |
224 | | :o: | `PAXG` | [Paxos](https://paxos.com/paxgold/) | 1 oz Gold | | [Medium](https://paxos.com/attestations/) | - | Classic (fiat based) | | Low | Low | Medium |
225 |
226 | References:
227 |
228 | 1. [Алгоритмические стейблкоины: как развиваются альтернативы USDT и USDC](https://forklog.com/algoritmicheskie-stejblkoiny-kak-razvivayutsya-alternativy-usdt-i-usdc/), Forklog.
229 |
230 | ### Некастодиальные кошельки
231 |
232 | | | Wallet name | Type | Private key/seed phrase storage | Supported tokens | Platforms | Comments | Hacks Risks | Sanctions Risks |
233 | |--|--|--|--|--|--|--|--|--|
234 | | :white_check_mark: | [**Atomic**](https://atomicwallet.io/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens| Win, MacOS, Linux-based, Android, iOS | (+) Staking ready | Low | Low |
235 | | :white_check_mark: | [**Exodus**](https://www.exodus.com/download/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens | Win, MacOS, Linux-based, Android, iOS | (+) Staking ready | Low | Low |
236 | | :white_check_mark: | [Trust Wallet](https://trustwallet.com/ru/) | Multi-wallet | Local | BTC, ETH, +1K tokens | Low | (-) Binance is owner, (+) Stacking ready | | [Medium](https://www.binance.com/en/blog/leadership/ukraine-russia-sanctions-and-crypto-421499824684903532) |
237 | | :white_check_mark: | [Coinomi](https://www.coinomi.com/) | Multi-wallet | Local | BTC, ETH, and 100+ tokens | Win, MacOS, Linux-based, Android, iOS | | Low | Low |
238 | | :white_check_mark: | [Samorai Wallet](https://samouraiwallet.com/) | Bitcoin wallet | Local | BTC | Android | (-) Mixer reputation | Low | The lowest |
239 | | :white_check_mark: | [Mycelium](https://wallet.mycelium.com/) | Bitcoin wallet | Local | BTC | Android | | | Low |
240 | | :white_check_mark: | [Trustee](https://trusteeglobal.com/) | Multi-wallet | Local | BTC, ETH, and 20+ tokens | iOS, Android | | Low | Low |
241 | | :o: | [Metamask](https://metamask.io/) | Multi-wallet | Local | [EVM](https://ethereum.org/en/developers/docs/evm/)-compatible tokens, e.g. ETH | Chome extension, Android, iOS | | Low | [Medium](https://metamask.zendesk.com/hc/en-us/articles/360059386712-Why-MetaMask-and-Infura-cannot-serve-certain-areas) |
242 | | :o: | [Wasabi Wallet](https://wasabiwallet.io/) | Private bitcoin wallet | Local | BTC | Win, MacOS, Linux-based | (-) Mixer reputation, (+) Open-source, privacy-focused | Low | The lowest |
243 | | :o: | [Electrum](https://electrum.org/) | Bitcoin wallet | Local | BTC | Win, Linux, OSX, Android | | [Medium](https://xakep.ru/2020/10/13/electrum-attaks/) | Low |
244 | | :no_entry: | [Coinbase](https://www.coinbase.com/wallet) | Multi-wallet | Local | BTC, ETH, and others [ERC-20](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/) compatible tokens | Chome extension, Android, iOS | (-) KYC, (+) NFT | Very low | [The highest](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA) |
245 | | :no_entry: | [Blockchain.com](https://www.blockchain.com/wallet) | Multi-wallet | Remote | BTC, ETH, and 10+ others | Web UI | | Low | High |
246 |
247 | ### Криптобиржи
248 |
249 | :warning: Не актуально.
250 |
251 | :no_entry: На данный момент пополнение с карт **MasterCard** и **Visa** из РФ недоступно, но торги на некоторых биржах можно вести.
252 |
253 | - :o: [Binance](https://www.binance.com) - самая крупная криптовалютная биржа ([source](https://coinmarketcap.com/ru/rankings/exchanges/)), [ограничения для граждан РФ](https://www.binance.com/en/support/announcement/4887e569afdf4b1e89e024371d3a49b9).
254 | - :no_entry: [Coinbase](https://www.coinbase.com/) - вторая по популярности крипто биржа, имеется [преценденты блокировки кошельков](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA) резидентов РФ, с мая 2022 сервисы, расположенные в Евросоюзе, [не доступны с резидентами РФ](https://twitter.com/iampaulgrewal/status/1521487189431001089)
255 |
256 | ### Сервисы поиска обменников
257 |
258 | Поскольку обменников великое множество, нет смысла рассматривать каждый по отдельности, особенно когда для этого уже есть проверенные сервисы с отзывами.
259 |
260 | :warning: В данный период, поскольку зачисление средств на биржи затруднено, все обменники **делают** довольно большую **наценку** относительно биржевого курса - примерно **10-25%**. Раньше эта наценка варьировалось в районе 3-4%. Смотрите, сравнивайте.
261 |
262 | :warning: Использование сервисов-обменников сопряжено с повышенными рисками. Относитесь с особым вниманием к проверке репутации как обменника, так и выбранного продавца.
263 |
264 | - [BestChange](https://www.bestchange.ru/) - поиск обменников с отзывами, автоматически обновляющимся курсом и относительно большим выбором валют, к каждому обменнику прилагаются характериcтики: требует ли обменник верификацию (проверку карты/паспортных данных), как берут комиссию (и берут ли) и т.п.
265 | - [LocalBitcoins](https://localbitcoins.com/) - P2P-площадка для покупки BTC (Bitcoin) с поддержкой фиатных валют.
266 | - [LocalMonero](https://localmonero.co/) - P2P-площадка для покупки XMR (Monero) с поддержкой фиатных валют.
267 |
268 | ## VPN
269 |
270 | ### VPN cервисы
271 |
272 | Список надежных VPN сервисов (находятся за пределами российской юрисдикции):
273 |
274 | | | Name | Has Free Plan | Support BTC payments | No-logs policy | OpenSource | Blocked/partally blocked in Russsia* | Trust level | Comments |
275 | | -- | -- | -- | -- | -- | -- | -- | -- |-- |
276 | | :white_check_mark: | [Proton VPN](https://protonvpn.com/) | + | + | + | [+](https://github.com/orgs/ProtonVPN/repositories) | [Available to block](https://www.themoscowtimes.com/2022/06/02/swiss-vpn-service-proton-says-likely-blocked-in-russia-a77871) | Very high | |
277 | | :warning: | [IPVanish VPN](https://www.ipvanish.com/) | - | - | + | [-](https://github.com/ipvanish) | + | High | |
278 | | :white_check_mark: | [Mullvad VPN](https://mullvad.net/en/) | - | + | + | [+](https://github.com/mullvad) | - | High | [Review](https://www.forbes.com/advisor/business/software/mullvad-vpn-review/) | |
279 | | :warning: | [Nord VPN](https://nordvpn.com/) | - | + | + | [-](https://github.com/NordSecurity) | + | High | |
280 | | :warning: | [ExpressVPN](https://www.expressvpn.com/) | - | + | + | [-](https://github.com/expressvpn) | + | Medium | |
281 | | :o: | HighLoad VPN | Fully free | | + | [Partially](https://github.com/Jigsaw-Code/outline-server) | - | Low | Based on ShadowSocks, волонтеры сервиса 'угнали сайт' |
282 |
283 | \* [Заблокрированы РКН](https://habr.com/ru/news/t/576128/), но потенциально могут функционировать (частично или полностью).
284 |
285 | Продвинутые пользователи могут купить хостинг (VDS) и развернуть собственный VPN сервер:
286 |
287 | - [Amnezia VPN](https://amnezia.org/) ([инструкция](https://habr.com/ru/company/amnezia/blog/546424/))
288 | - [Outline VPN](https://getoutline.org).
289 |
290 | ### Другие инструменты обхода блокировок
291 |
292 | - Psiphon
293 | - Lantern
294 | - NewNode.
295 |
296 | ### Полезные ссылки
297 |
298 | 1. [Общество защиты интернета](https://t.me/safe_runet), Телеграм канал.
299 | 2. [Безопасность. VPN](https://relocation.guide/vpn), relocation.guide.
300 |
301 | ## Список софта
302 |
303 | - Chrome или Brave
304 | - Tor Browser ([заблокирован РКН](https://blog.torproject.org/tor-censorship-in-russia/))
305 | - Защищенный мессенджер
306 | - [VPN клиент](lists.md#vpn).
307 |
--------------------------------------------------------------------------------
/mobilization-resistance.md:
--------------------------------------------------------------------------------
1 | # Мобилизация
2 |
3 | 
4 |
5 | *Список мер для снижения риска быть мобилизованным при наличии оснований для отсрочки*.
6 |
7 | ---
8 |
9 | Ниже:
10 |
11 | :heavy_plus_sign: Рассматривается использование *исключительно юридических* методов для минимизации персональных рисков.
12 |
13 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума.
14 |
15 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете.
16 |
17 | ---
18 |
19 | **Содержание**:
20 |
21 | - [Кому попытаются вручить повестку?](#кому-попытаются-вручить-повестку)
22 | - [Если ищут...](#если-ищут)
23 | - [Когда пытаются вручить повестку...](#когда-пытаются-вручить-повестку)
24 | - [Когда вручили повестку...](#когда-вручили-повестку)
25 | - [В военкомате...](#в-военкомате)
26 | - [:telephone\_receiver: Экстренные контакты](#telephone_receiver-экстренные-контакты)
27 | - [:link: Полезные ссылки](#link-полезные-ссылки)
28 |
29 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть.
30 |
31 | ## Кому попытаются вручить повестку?
32 |
33 | Для первой волны были объявлены конкретные [критерии частичной мобилизации](https://meduza.io/feature/2022/09/28/otsenite-svoy-risk-popast-pod-mobilizatsiyu).
34 |
35 | ## Если ищут...
36 |
37 | Если вас ищут, несмотря на наличие законного основания для отсрочки, то:
38 |
39 | - :warning: не живите по месту прописки (лучше - смените регион)
40 | - предупредите тех, кто живет по месту прописки, чтоб всем, кто вас спрашивает, говорили, что вы уехали
41 | - не ходите в государственные органы
42 | - :warning: не ходите самостоятельно к коллекторам ни по каким делам - отправляйте представителя, если очень надо
43 | - не открывайте дверь, если точно не знаете, кто за ней:
44 | - газовщик, интернетчик, почтальон - коллектор может представиться, кем хочет
45 | - нигде не оставляйте актуальный адрес (ни в приложениях доставки, ни в Госуслугах)
46 | - если где-то оставили, то исправляйте на другой адрес и (лучше) удаляйте аккаунт
47 | - не выкладывайте в социальные сети фотографии из места проживания
48 | - оставьте только самые необходимые приложения с трекингом локации
49 | - не вызывайте такси прямо к месту жительства
50 | - удалите все "государственные" и квази-государственные (vk) приложения c телефона
51 | - почистите историю гелокаций, где только можно
52 | - выходите на улицу в кепке (лучше и очках)
53 | - в местах, где есть камеры компьютерного зрения (метро) надевать медицинскую маску
54 | - научиться не светиться на приподъездные камеры (если есть) в месте проживания
55 | - :warning: повестку могут вручить и в отделе кадров или учебном отделе ВУЗа: избегайте этих мест
56 | - носите с собой паспорт, военник (приписное) и все справки, которые могут подвердить, что вы не подходите под критерей о мобилизации
57 | - подключайтесь к интернет, [используя VPN](lists.md#vpn).
58 |
59 | ## Когда пытаются вручить повестку...
60 |
61 | Если пытаются вручить повестку, то нужно:
62 |
63 | 1. повестку вручить можно лично
64 | - повестку нельзя вручать кинув ее в почту или положив под дверь
65 | - повестку нельзя вручать через Госуслуги (следить за статусом [соотвествующего законопроекта](https://sozd.duma.gov.ru/bill/361804-7))
66 | 2. фиксировать на камеру всю процедуру вручения
67 | 3. спросить удостоверение личности и документы подтверждающие полномочия того, кто вручает повестку:
68 | - :warning: повестки вручаются работниками военного комиссариата или по месту работы (учебы) гражданина руководителями, другими ответственными за военно-учетную работу должностными лицами (работниками) организаций ([п. 2 ст. 31 Закона](http://www.consultant.ru/document/cons_doc_LAW_18260/0b6fba2b4841a88fc0274d43870ea1d54a32b91d/))
69 | - полицейские могут вручать повестки о явке в военкомат только при наличии письменного обращения военного комиссара, в котором должны быть указано на невозможность вручения гражданину повестки своими силами
70 | - :warning: полицейские не могут самостоятельно заполнить повестку и вручить ее гражданину
71 | - сотрудник полиции не может вас заставить получить повестку от третьего лица
72 | - сотрудник полиции не может поцейским доставлять граждан в военкоматы или мобилизационные пункты
73 | 4. узнать на каком основании повестка вручается и ссылаться, что не подходишь по критериям мобилизации
74 | 5. :warning: повестка действительна только если есть печать, подпись военкома, там есть ваша фамилия и дата явки
75 | - если чего-то нет, то зафиксировать это на камеру
76 | 6. не брать повестку в руки
77 | 7. нигде (в том числе в повестке) не рассписываться
78 | - если вынудят, то написать, что повестка вручена с нарушениями.
79 |
80 | :punch: [Как правильно отказаться получать незаконную повестку](https://www.youtube.com/watch?v=xLkQv_c5q74), Youtube.
81 |
82 | ## Когда вручили повестку...
83 |
84 | Если вручили повестку, то:
85 |
86 | - проконсультуруйтесь с адвокатом
87 | - если он вам советует сдаться -- посылайте его нахуй
88 | - если советует бороться, то договоритесь с ним о защите
89 | - держите под рукой все [нужные контакты](#link-полезные-ссылки)
90 | - выучите наизусть номер адвоката
91 | - дайте номер адвоката ближайшему родственнику/другу на случай если что-то с вами случится
92 | - не ходите в военкомат так долго, как получится
93 | - :grey_question: как узнать, есть ли в отношении вас уголовное дело? - закажите на Госуслугах электронную справку об отсутствии судимости.
94 | - оформите на близкого человека [нотариальную доверенность на представление ваших интересов в суде](https://soldiersmothers.ru/sm_docs/doverennost?ysclid=l8epu9weef237125174) с полномочиями на подписание и подачу административного иска с правом передоверия
95 | - напишите [заявления от альтернативной гражданской службе (АГС)](https://telegra.ph/Obrazec-zayavleniya-09-21) и отправьте его заказным письмом
96 | - п.3 ст.59 Конституции РФ: случае если убеждениям или вероисповеданию россиянина противоречит несение военной службы, гражданин Российской Федерации имеет право на замену ее АГС (никаких оговорок о мобилизации в этой статье Конституции нет)
97 | - сделайте нотариально заверенные копии паспорта и документов, подтверждающих отсрочку
98 | - с этого момента не давайте представителям власти паспорт в руки (только заверенную копию)
99 | - смените телефон (купите на авито) и сим-карту (оформите на подругу/друга)
100 | - :no_entry: пока вы не переступили порог военкомата, вы - не военнослужащий.
101 |
102 | ## В военкомате...
103 |
104 | :warning: В военкомате понадобятся:
105 |
106 | - заряженный телефон,
107 | - внешний аккумулятор для зарядки телефона (power bank),
108 | - заверенные копии документов, подтверждающих отсрочку.
109 |
110 | Находясь в военкомате, необходимо:
111 |
112 | - позвонить доверенному лицу/адвокату и сказать, где вы
113 | - вы не преступник и имеете право говорить по телефону с кем угодно и сколько угодно, не спрашивая разрешения сотрудников полиции или военкомата
114 | - [требовать дополнительного обследований здоровья](https://t.me/peaceplea/186)
115 | - [написать жалобу(ы) на незаконные призыв/нарушения в его процедуре](https://t.me/stoparmy/1536)
116 | - если есть возможность - прочитайте [этот текст](https://docs.google.com/document/d/12vJHqbLzXk0GCtTGOHUgNLUEbJUnhQ8kz49uYGE-7SA/edit#heading=h.2vw4bvzer3d6) (лучше, конечно, это сделать заранее).
117 | - [если в военкомате удерживают насильно](http://soldiersmothers.ru/prizyvniku/zashhita-ot-nasilstvennogo-prizyva)
118 | - ваше удержание незаконно!
119 | - обратитесь с жалобой на полицейских в прокуратуру и их руководству
120 | - требуйте вручить вам повестку для явки на другую дату и освободить вас.
121 |
122 | ## :telephone_receiver: Экстренные контакты
123 |
124 | - [Консультаций по теме мобилизации от Агора](https://t.me/agora_army_bot), telegram бот.
125 | - [Горячая линия для призывников и военнослужащих](https://t.me/army_help), telegram чат.
126 | - [Cписок организаций, которые постараются помочь вам избежать призыва](https://meduza.io/feature/2022/09/21/vladimir-putin-ob-yavil-chastichnuyu-mobilizatsiyu-v-rossii-vot-spisok-organizatsiy-kotorye-pomogut-vam-izbezhat-prizyva-esli-vy-ne-hotite-voevat)
127 |
128 | ## :link: Полезные ссылки
129 |
130 | Законы:
131 |
132 | 1. [Федеральный закон от 26 февраля 1997 г. N 31-ФЗ "О мобилизационной подготовке и мобилизации в Российской Федерации"](http://ivo.garant.ru/#/document/136945/paragraph/10935:0).
133 | 2. [Федеральный закон "Об альтернативной гражданской службе" от 25.07.2002 N 113-ФЗ](http://www.consultant.ru/document/cons_doc_LAW_37866/#:~:text=%D0%9D%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B8-,%D0%A4%D0%B5%D0%B4%D0%B5%D1%80%D0%B0)
134 | 3. Новое в УК РФ:
135 | - ст. 203.3 УК РФ Публичное распространение заведомо ложной информации об использовании Вооруженных Сил
136 | - ст. 280.4 УК РФ «Публичные призывы к осуществлению деятельности, направленной против безопасности государства».
137 |
138 | Разъяснения и гайды:
139 |
140 | 1. [Как не попасть под мобилизацию — главные советы](https://docs.google.com/document/d/19wuN5O4hXyfLskHPPI6uw6-e3gGe4pf_EtKjlWkPZwU/edit), Медуза.
141 | 2. [Карточки мобилизации](https://meduza.io/cards/navernoe-vy-i-tak-ponimaete-chto-mobilizatsiya-v-rf-vovse-ne-chastichnaya-kogo-tochno-prizovut-i-kak-legalno-ne-poyti-na-voynu), Медуза.
142 | 3. [F.A.Q. по мобилизации](https://telegra.ph/FAQ-po-mobilizacii-09-21), Telegraph.
143 |
144 | :punch: Советы юристов:
145 |
146 | 1. [Канал юриста Павла Чикова](https://t.me/pchikov), telegram.
147 | 2. [Мобилизация. Что делать? Советы юриста](https://youtu.be/31ZrqqFkdiU), youtube.
148 | 3. [Адвокат Калой Ахильгов и правозащитник Сергей Кривенко отвечают на главные вопросы о мобилизации](https://www.youtube.com/watch?v=L-miERxesnM), youtube.
149 |
--------------------------------------------------------------------------------
/relocation.md:
--------------------------------------------------------------------------------
1 | # Иммиграция: экстренная и плановая
2 |
3 | 
4 |
5 | *Чек-лист по подготовке к экстренной и плановой релокации*.
6 |
7 | ---
8 |
9 | Ниже:
10 |
11 | :heavy_plus_sign: Рассматривается использование *исключительно юридических* методов для минимизации персональных рисков.
12 |
13 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума.
14 |
15 | :heavy_check_mark: Берегите себя. Не нарушайте законы юрисдикции(й), в которой(ых) живете.
16 |
17 | ---
18 |
19 | - [Документы](#документы)
20 | - [Первоочередные документы](#первоочередные-документы)
21 | - [Дополнительные документы](#дополнительные-документы)
22 | - [Для получение рабочей визы/ВНЖ](#для-получение-рабочей-визывнж)
23 | - [Экстренная релокация](#экстренная-релокация)
24 | - [Подготовка](#подготовка)
25 | - [В аэропорту/на границе](#в-аэропортуна-границе)
26 | - [В стране иммиграции](#в-стране-иммиграции)
27 | - [Плановая релокация](#плановая-релокация)
28 | - [Подготовка](#подготовка-1)
29 | - [:link: Полезные ссылки](#link-полезные-ссылки)
30 |
31 | ---
32 |
33 | > :information_source: Содержимое проекта носит исключительно образовательный характер и не является рекомендацией к каким-либо действиям. Учитывайте, что к моменту прочтения часть информации может устареть.
34 |
35 |
36 | ## Документы
37 |
38 | ### Первоочередные документы
39 |
40 | Документы, без который буду проблемы с пересечением границы и/или релокацией в другую страну:
41 |
42 | - [x] загранпаспорт(а)
43 | - [x] паспорт РФ
44 | - [x] военный билет (приписное)
45 | - [x] документы подтверждающие отcрочку.
46 |
47 | *Держите эти документы под рукой, а лучше носите с собой.*
48 |
49 | ### Дополнительные документы
50 |
51 | Документы, которые желательны для длительного нахождения (от 2 месяцев) в другой стране, в том числе по туристической визе:
52 |
53 | - [x] свидетельство о рождении, в т.ч. для взрослых
54 | - [x] водительские права
55 | - [x] нотариально заверить и оставить у доверенного лица:
56 | - [x] доверенность на распоряжение имуществом (квартира, машина), в т.ч. и сделки продажи
57 | - [x] согласие на выезд несовершеннолетнего ребенка за границу с матерью
58 | - [ ] медстраховка для выезжающего заграницу* (выглядит необязательной)
59 |
60 | \* В случае наступления страхового случая, у вас должны быть средства оплатить все на месте самостоятельно, и только в РФ вы сможете получить компенсацию.
61 |
62 | ### Для получение рабочей визы/ВНЖ
63 |
64 | Документы, которые желательны для получения рабочей визы или ВНЖ:
65 |
66 | - [ ] справка о несудимости
67 | - в приоритете с апостилем; если без апостиля, то нотариально заверенный перевод
68 | - не надо до 16 лет
69 | - [ ] свидетельство о браке (сделать перевод на английский язык)
70 | - лучше: нотариально заверенный перевод свидетельства о браке
71 | - [ ] медицинские тесты (сделать перевод на английский язык, заверять нотариусом не надо):
72 | - [ ] кровь на ВИЧ, сифилис и гепатит B и C
73 | - [ ] флюрографию
74 | - [ ] прививочные сертификаты на COVID
75 | - [ ] (детям) прививочные сертификаты на все прививки
76 | - [ ] диплом(ы):
77 | - [ ] оригинал(ы) с апостилем
78 | - [ ] перевод на английском языке (нотариально заверенный)
79 | - [ ] сканы любых дипломов об образовании
80 | - [ ] скан текущего трудового договора
81 | - берите сканы всего важного вообще
82 | - [ ] CV: сухое резюме с должностями, названиями юрлиц и курсами по программированию
83 | - [ ] если задерживали на митингах, били, присылали повестки и проч., то протоколы и прочие доказательства.
84 |
85 |
86 | ## Экстренная релокация
87 |
88 | > :warning: Нужно или не нужно будет срочно иммигрировать, каждый решает сам, но **план должен быть составлен заранее**.
89 |
90 | > :newspaper: Cледите за новостями из разных источников, чтобы не пропустить момент, когда нужно бросить все и уехать по плану срочной иммиграции.
91 |
92 | ### Подготовка
93 |
94 | - [x] :warning: заплатите все налоги, оплатите все штрафы, выплатите все просроченные кредиты
95 | - [x] закрывайте любые обязательства (кроме ипотеки), из-за который вас могут отказать в выезде из страны ([список оснований](http://www.consultant.ru/edu/student/consultation/ogranichen_vyezd_za_granitsu/))
96 | - [x] выберите [страны, потенциально подходящие для переезда](https://docs.google.com/spreadsheets/d/1n5j2qmMmcthFdohhBI46hr4OgmuQ-6To-2KT98DWd2E/edit#gid=0)
97 | - :warning: это должна быть страна, в которую вы можете прибыть по *уже имеющимся* у вас документам/визам
98 | - [x] убедитесь в наличии всех [первочередных документов](#первоочередные-документы)
99 | - [ ] подготовьте максимальное количество [дополнительных документов](#дополнительные-документы)
100 | - [ ] оставьте на карте рублевые средства:
101 | - (сначала) на покупку билетов за границу
102 | - (потом) минимум на 3 платежа по ипотеке и/или другим кредитным обязательствам
103 | - [ ] купите наличные доллары/евро (но не более $10,000 на человека)
104 | - [x] оставьте дубликаты ключей от квартиры/машины доверенным лицам
105 | - [ ] :warning: купите и храните месячный комплект всех необходимых лекарств
106 | - [ ] подготовьте вещи так, чтоб можно было собраться и уехать в течение часа.
107 |
108 | ### В аэропорту/на границе
109 |
110 | - :warning: будут спрашивать про цель выезда, в ответе всегда озвучивайте ровно ту цель, которая указана при получении визы
111 | - т.е. для туристической визы *цель всегда - отдых/путешествие*
112 | - будьте готовы к вопросам на границе, в том числе о готовности воевать, поддержке СВО
113 | - оставайтесь спокойным, подбирайте нейтральные умеренно-патриотичные ответы, не поддавайтесь на провокации
114 | - пишут, что есть случаи, когда просят показать telegram и продиктовать IMEI телефона
115 | - это незаконно, но ИМХО, если хочешь без проблем вылететь, то лучше выполнить эти требования.
116 |
117 | ### В стране иммиграции
118 |
119 | Первоочередные вопросы:
120 |
121 | - как найти жилье?
122 | - [как платить за границей?](https://telegra.ph/Kak-platit-za-granicej-i-sehkonomit-na-kurse-10-09)
123 | - [как получать/отправлять денежные перевод из/в Росссию](https://vc.ru/finance/513222-vse-sposoby-legalnogo-vyvoda-deneg-iz-rossii-detalnyy-razbor-so-ssylkami)?
124 | - как найти работу?
125 |
126 | Найдите волонтерскую организацию, помогающую иммигрантам - с ними вы быстрей найдете решение своих проблем.
127 |
128 | ## Плановая релокация
129 |
130 | > :newspaper: Cледите за новостями, чтобы определить удачное время для плановой релокации: это не должно быть начало новой волны призыва или что-то такое.
131 |
132 | ### Подготовка
133 |
134 | - [x] определите список стран, где вы может получить разрешение на работу (т.е. это не туристическая виза)
135 | - [x] определите список членов семьи, которых хотите перевезти
136 | - [ ] убедитесь, что выполнены все пункты, связанные с [подготовкой к экстренной релокации](#подготовка)
137 | - [ ] подготовьте максимальное количество [документов для рабочей визы/ВНЖ](#для-получение-рабочей-визывнж)
138 | - [ ] медицина
139 | - [ ] поправьте здоровье, сделайте зубы
140 | - [ ] для ребенка проведите все необходимые медицинские процедуры, обследования, поставьте прививки
141 | - [ ] рассмотрите возможность сделать вакцину от короновируса
142 | - [ ] найдите знакомых/друзей в стране миграции, держите с ними связь
143 | - [ ] у работодателя:
144 | - [x] узнайте о возможности работать удаленно из страны миграции
145 | - [x] оцените работоспособность схемы, по которой работодатель будет платить вам зарплату
146 | - [ ] ищите других работодателей в стране миграции и оцените зарплату, на которую можете рассчитывать
147 | - [ ] позьмите справки с работы с информацией о зарплате, сроке трудоустройства и должности
148 | - [ ] разберитесь условия открытия банковского счета/карт в стране миграции
149 | - [x] подумайте над продажей машины (она в России, понадобится вам меньше, чем деньги в другой стране)
150 | - [x] проверьте доступ к Госуслугам и личному кабинету налогоплательщика
151 | - [x] перевелите вход во все важные государственные органы и банковские аккаунты на одну SIM карту
152 | - [ ] выберети правильный заграничный роуминг и пополните баланс
153 | - [ ] обязательно возьмите эту SIM карту за границу.
154 | - [ ] оформите страховку на квартиру (особенно если она в ипотеке)
155 | - [ ] улучшите свои навыки вождения автомобиля (если необходимо)
156 | - [ ] учите английский.
157 |
158 | ## :link: Полезные ссылки
159 |
160 | Разъяснения и гайды:
161 |
162 | 1. [Relocation Guide](https://relocation.guide/)
163 |
--------------------------------------------------------------------------------
/sanctions-risks-in-cryptocurrency.md:
--------------------------------------------------------------------------------
1 | # Мир 2022: Как хранить криптовалюту в условиях санкций?
2 |
3 | 
4 |
5 | ***Инвестиции в криптовалюту: риск-менеджмент в условии санкций***.
6 |
7 | ---
8 |
9 | :heavy_plus_sign: Рассматривается использование *исключительно экономических* методов по минимизации персональных рисков.
10 |
11 | :heavy_minus_sign: Не рассматривается использование никаких *политических* методов: они важны для общества, но увеличивают риски для индивидуума.
12 |
13 | ---
14 |
15 | Содержание:
16 |
17 | - [:date: Важные новости](#date-важные-новости)
18 | - [TL;DR](#tldr)
19 | - [0. Правила игры (подготовка)](#0-правила-игры-подготовка)
20 | - [1. Что хранить?](#1-что-хранить)
21 | - [Криптовалюта со свободным курсом](#криптовалюта-со-свободным-курсом)
22 | - [Стейблкоин](#стейблкоин)
23 | - [:pushpin: Что хранить... а что не стоит](#pushpin-что-хранить-а-что-не-стоит)
24 | - [2. Где хранить?](#2-где-хранить)
25 | - [Биржи](#биржи)
26 | - [Кошельки](#кошельки)
27 | - [:pushpin: Где хранить... а где не стоит](#pushpin-где-хранить-а-где-не-стоит)
28 | - [Итак](#итак)
29 | - [:link: Полезные ссылки](#link-полезные-ссылки)
30 |
31 | ---
32 |
33 | - :warning: Непонимание работы используемых инвестиционных инструментов: акций, облигаций, криптовалюты и/или производных финансовых инструментов - несет в себе **риски полной утраты средств**.
34 | - :warning: Несоблюдение правил ИТ-безопасности, таких как сильные неповторяющиеся пароли, 2FA, [безопасный браузер](lists.md#список-софта), [защищенное соединение](lists.md#vpn) - несет в себе **риски полной утраты средств**.
35 | - :warning: Невыполнение [законодательства](lists.md#законодательные-акты) юрисдикций, через которые происходит инвестирование, несет в себе **риски полной утраты средств**.
36 | - :warning: Слепое следование чужим инвестиционным идеям несет в себе **риски полной утраты средств**.
37 |
38 | Ничего из перечисленного в данном репозитории не является финансовой рекомендацией. К моменту прочтения вами статьи какая-то информация ниже может уже устареть.
39 |
40 | ---
41 |
42 | ## :date: Важные новости
43 |
44 | **17 марта 2022**
45 |
46 | В Конгресс США внесен законопроект, который предполагает введение санкций в отношении иностранных криптобирж, сотрудничающих с российскими юридическими лицами. Также документ позволит министру финансов блокировать транзакции российских пользователей на криптобиржах, работающих в Соединенных Штатах. Подробнее на [Reuters](https://www.reuters.com/world/us-democrats-introduce-bill-curb-russian-crypto-use-amid-ukraine-crisis-2022-03-17/), [Forklog](https://forklog.com/v-ssha-predstavili-zakonoproekt-protiv-tranzaktsij-s-rossijskoj-kriptovalyutoj/).
47 |
48 | ## TL;DR
49 |
50 | #### Что хранить?
51 |
52 | Стейблкоины:
53 |
54 | - Храните в стейблоинах, у которых базовый актив `USD`/`EUR`, те средства, которые нужно:
55 | - точно сберечь
56 | - захеджировать от валютных рисков (снижения курса `RUB`, например)
57 | - Не храните/минимизируйте долю сильно-централизованных стейблкоинов (`USDT`, `USDC`)
58 | - Предпочитайте децентралиованные стейблкоины с обеспечением
59 | - Избегайте алгоритмические стейблкоины
60 | - Не храните стейблкоины только одного эмитента или проекта
61 | - (Рекомендуется) соберите корзину из стейблкоинов на доллар, евро, американские трежерис, золото.
62 |
63 | Криптовалюты со свободным курсом:
64 |
65 | - Храните в криптовалюте со свободным курсом (`BTC`, `ETH`) только те средства:
66 | - которые готовы инвестировать на 1-3 года
67 | - по которым готовы понести значительные убытки
68 | - Не храните/минимизируйте долю токенов от сильно-централизованных проектов (`XRP`)
69 | - Не храните криптовалютy только одного проекта.
70 |
71 | #### Где хранить?
72 |
73 | - *Не* храните средств на Централизованных биржах (`Binance`, `Kraken`, `OKX`) или сервисах, которые используют кастодиальные кошельки. Но если все-таки надо, то:
74 | - Пройдите KYC-процедуры сейчас (пока ограничений нет), используя реальные данные
75 | - Если вы трейдер, то оставьте на CEX только тот объем средств, который необходим для торговли
76 | - Не храните все на одной CEX биржу
77 | - Храните средства на Децентрализованных биржах (`Uniswap`, `PancakeSwap`, `dYdX`) или (лучше) приложениях, которые используют некастодиальные кошельки (`Atomic`, `Exodus`, `Trustee`)
78 | - Минимизируйте использование кошелька MetaMask
79 | - Не храните все на одной DEX бирже или одном приложении-кошельке.
80 |
81 | #### Как хранить?
82 |
83 | - Разделите средства между холодными и горячими кошельками:
84 | - Холодный кошелек, как банковская ячейка - там то, что не планируется кому-то показывать никогда
85 | - Горячий кошелек, как банковский счет - могу с него что-то купить, могу не покупать, а могу девушке на свидании показать
86 | - Используйте [аппаратный кошелек](https://bitcoin.org/choose-your-wallet?step=5&platform=hardware), если Вы миллионер, параноик или гик (одно другому не мешает)
87 | - Используйте некастодиальные кошельки для хранения средств:
88 | - Сохраните приватные ключи кошельков и seed/mnemonic фразы минимум на двух защищенных или зашифрованных носителях
89 | - Не пишитe/не печатайте seed-фразы выцветающими чернилам
90 | - Не палите свой российский IP (используйте VPN), не регистрируйтесь через почту/телефоны российских почтовых хостингов или сотовых операторов
91 | - Используйте CEX биржи для активного трейдинга (для всех остальных случаев - избегайте):
92 | - 2FA должен быть включен и работать через приложение-аутентификатор или защищенный токен, но только не SMS
93 |
94 | ## 0. Правила игры (подготовка)
95 |
96 | Две вещи, которые важно сделать "на берегу":
97 |
98 | 1. понять правила игры, которые начинают работать автоматически (хотите Вы того или нет), как только Вы приобрели криптовалюту
99 | 2. приготовиться к отключению разных частей ИТ-/финансовой инфраструктуры, таких как блокировка сайта криптобиржи, пластиковых карт, сообщений мобильного оператора.
100 |
101 | Про пункт 2 было рассказано в посте [Россия 2022: как не потерять все (или хотя бы попытаться)](introduction-to-risks.md) в части "Сценарий II: Блэкаут", и повторяться не буду. На пункте 1 остановимся отдельно.
102 |
103 | Правило 1: **Не твои ключи — не твои биткоины**.
104 |
105 | Если у Вас нет приватного ключа и seed/mnemonic фразы от кошелька, значит Вы не владеете никакими монетами. Вы владеете только обещанием (чаще всего юридически закрепленным) сервиса, что Вы единственный распорядитель этих монет.
106 |
107 | Правило 2: (Большие) **крипто-бизнесы играют по правилам государств**. И Вам придется.
108 |
109 | Компании с капитализацией в десятки миллиардов долларов (Coinbase, Binance, Ripple) вынуждены выполнять огромное количество правил и нормативов тех юрисдикций, где они ведут бизнес.
110 |
111 | В контексте темы статьи важно, что в российской юрисдикции не располагается ни одного крупного *публичного* крипто-бизнеса (даркнеты не считаем). Это означает, что Вам придется выполнять требования как минимум двух юрисдикций: где проживаете, и где "прописался" сервис, которым пользуетесь.
112 |
113 | Правило 3: **Безопасность враг удобства**. Не ищите серебряных пуль.
114 |
115 | Эти две характеристики сочетаются в каком-то балансе, но недостижимы одновременно. Самые безопасные способы хранения криптовалют не подойдут, если Вы хотите каждый день удобно проверять Ваш баланс или торговать "внутри дня" на криптобирже. В то же время самые удобные приложения не подойдут, если цель - надежно сохранить право собственности над монетами на горизонте 10+ лет.
116 |
117 | Сначала выберите цель(и), а потом найдите к ней(ним) инструмент(ы). Но не наоборот.
118 |
119 | ## 1. Что хранить?
120 |
121 | Для начала определимся, что хранить. Для частного инвестора доступны минимум 2 альтернативы:
122 |
123 | - Криптовалюту со свободным курсом (они ~~могут~~ будут дорожать или дешеветь)
124 | - Криптовалюту с фиксированным курсом (1 токен = $1 и цена надолго не изменяется), или стейблкоин (Stablecoin).
125 |
126 | ### Криптовалюта со свободным курсом
127 |
128 | Криптовалюта со свободным курсом - это токены как коммерческих, так и некоммерческих криптопроектов. Наиболее известные токены: `BTC` - токен сети Bitcoin, и `ETH` - токен сети Ethereum ([топ токенов по капитализации](https://coinmarketcap.com/)).
129 |
130 | Токены волатильны, и *вместе с рыночной доходность* таких инструментов инвестор получает и *рыночные риски*. Если не заниматься риск-менеджментом для такого типа вложений, то шансы на получение прибыли, в лучшем случае, 50/50.
131 |
132 | Список криптовалют со свободным курсом зависит от цели инвестиционного портфеля: чем больше толерантность к риску, тем больше процент таких валют.
133 |
134 | ### Стейблкоин
135 |
136 | Стейблкоин (Stablecoin) - криптовалюта, чей курс привязан к *базовому активу*: доллару, евро, золоту, долговые обязательства правительства США (вообще чему угодно, что имеет высокую ликвидность и низкую волатильность).
137 |
138 | Выделяют *классические* стейблкоины или *алгоритмические* стейблкоины.
139 |
140 | Классические стейблкоины (`USDT`, `USDC`, [список](lists.md#stablecoins)):
141 |
142 | - обеспечены (но на практике не всегда так) базовым активом, поэтому имеют низкие риски просадки цены
143 | - в основном имеют одного эмитента или нескольких эмитентов (гипер-централизованы), поэтому имеют высокие риски мошенничества с стороны эмитента, блокировки аккаунтов эмитентом и т.п.
144 | - в некоторые стейблкоины механизм блокировки зашит прям в протокол/смарт-контракт, поэтому, где бы вы их не хранили, эмитент сможет заблокировать их.
145 |
146 | Алгоритмические стейблкоины (`UST`, `sUSD`, [список](lists.md#stablecoins)):
147 |
148 | - обеспечены частично (иногда очень частично), балансировка цена происходит за счет специального алгоритма, поэтому риски просадки цены выше, чем у классических стейблкоинов
149 | - регулируются комьюнити (децентрализованы), поэтому имеют низкие риски управления.
150 |
151 | Сравнительные характеристики типичных представителей:
152 |
153 | | Характеристика | Криптовалюта с плавающим курсов | Классический стейблкоин | Алгоритмический стейблкоины |
154 | |--|--|--|--|
155 | | Риски потери средств | Высокие | Самая низкие* | Низкие |
156 | | Потенциальная доходность | Высокая | Нулевая* | Низкая |
157 | | **Риски блокировки средств** | Чаще низкие | Самые высокие | Низкие |
158 | | Риски взлома | Чаще низкие | Самая низкие | Самые высокие |
159 |
160 | \* Зависит от базового актива. Показатель приведен, когда базовый актив - `USD`.
161 |
162 | ### :pushpin: Что хранить... а что не стоит
163 |
164 | Риск блокировки средств высокий для всех блокчейнов/проектов, которые:
165 |
166 | - :-1: сильно централизованы и
167 | - :-1: находятся в американской юрисдикции или
168 | - :-1: выполняли блокировку средств по требованию американских властей.
169 |
170 | К таким проектам относятся:
171 |
172 | - :warning: Tether (стейблкоин `USDT`) уже ["морозил" приличные суммы средств ($160M) на кошельках своих клиентов по требованию регулятора](https://www.coindesk.com/markets/2022/01/13/tether-freezes-160m-of-usdt-stablecoin-on-ethereum-blockchain/), но [**отклонил** просьбу Украины заблокировать и прекратить обслуживать транзакции резидентами РФ](https://cointelegraph.com/news/cexs-refuse-blanket-asset-freeze-of-all-russian-users-though-questions-linger).
173 | - :warning: Circle (стейблкоин `USDC`) уже [блокировал $100K на кошельках своих клиентов по требованию властей США](https://www.coindesk.com/markets/2020/07/08/circle-confirms-freezing-100k-in-usdc-at-law-enforcements-request/) и уже [заблокировал ввод фиата (но не кошельков) из России](https://support.usdc.circle.com/hc/en-us/articles/4486692088468-Circle-Complies-with-New-Sanctions-Requirements)
174 | - :warning: Ripple (токен `XRP`) сильно централизован и имеет [долгие и дорогие судебные тяжбы с SEC](https://www.sec.gov/news/press-release/2020-338)
175 | - :warning: Binance Coin (токен `BNB`) - сильно централизован, блокирует аккаунты под американскими санкционными списками OFAC [4] (но **отказался** блокировать аккаунты по национальной принадлежности).
176 |
177 | ## 2. Где хранить?
178 |
179 | Для частного инвестора есть минимум две альтернативы: *криптобиржи* или *криптовалютные кошельки*.
180 |
181 | ### Биржи
182 |
183 | На крипторынках существует два типа бирж: *централизованные* (CEX) и *децентрализованные* биржи (DEX).
184 |
185 | **CEX** - торговая площадка, где во главу угла ставится *скорость движка биржи*. CEX впитали в себя все плюсы и минусы классических финансовых (фиатны) бирж. [Топ CEX бирж по капитализации](https://coinmarketcap.com/rankings/exchanges/).
186 |
187 | **DEX** - торговая площадки, где во главу угла ставится *контроль над ключами своих кошельков* и раскрываемыми личными данными. [Топ DEX бирж по капитализации](https://coinmarketcap.com/rankings/exchanges/dex/).
188 |
189 | Сравнительные характеристики типичных CEX и DEX:
190 |
191 | | Характеристика | CEX | DEX |
192 | | -- | -- | -- |
193 | | Ликвидность | Высокая | Средняя или низкая |
194 | | Скорость исполнения ордеров | Высокая | Средняя |
195 | | Проверки на вшивость эмитентов | Да, но scam иногда просачивается | Слабая |
196 | | ~~Проверки на вшивость трейдеров~~ KYC | + | - |
197 | | Богатый набор фич (такие как открытый API) | + | - |
198 | | Богатый набор инструментов (такие как фьючерсы) | + | Нет, но есть DeFi и NFT |
199 | | **Контроль над приватными ключами кошелька** | + | - |
200 | | Риски взлома | Низкие | Умеренные |
201 |
202 | *CEX контролирует приватные ключи* и с ними кошельки трейдера: нарушение правил биржи или законов юрисдикции биржи (в т.ч. из-за санкций) влечет за собой *риск потери контроля над средствами* нарушающей стороной. *DEX почти лишены такого риска*.
203 |
204 | ### Кошельки
205 |
206 | Криптовалютный кошелек (сryptocurrency wallet), далее Кошелек - устройство (физическое, программное или в виде удаленного сервиса), хранящее публичные и/или приватные ключи для криптовалютных транзакций.
207 |
208 | Кошельки в зависимости от стороны владеющие ключами разделяют на *кастодиальные* и *некастодиальные*.
209 |
210 | **Кастодиальный кошелек** - сервис/софт/устройство, которому a) доверяется генерация и безопасное хранение публичного и приватного ключей, b) который требует хранения приватного ключа на своей стороне для осуществления нужных Вам криптовалютных транзакций.
211 |
212 | Кастодиальные кошельки открывают CEX биржи.
213 |
214 | **Некастодиальный кошелек** - сервис/софт/устройство, который a) не хранит приватный ключ за пределами Вашего устройства и не хранит seed фразу, b) который не требует хранения приватного ключа на своей стороне для осуществления нужных Вам криптовалютных транзакций.
215 |
216 | Некастодиальные кошельки открывают DEX биржи и [специальные сервисы-кошельки](https://www.cryptowisser.com/wallets/).
217 |
218 | Сравнительные характеристики типичных кастодиальных и некастодиальных кошельков:
219 |
220 | | Характеристика | Кастодиальный | Некастодиальный |
221 | | -- | -- | -- |
222 | | Создание кошелька (генерация пар ключей) | Удаленно (на стороне сервиса) | Локально (на стороне приложения) |
223 | | **Контроль приватного ключа** | У сервиса | У вас |
224 | | **Знание seed фразы** | Только у сервиса | Только у вас |
225 | | Восстановление доступа к кошельку | Через процедуры сервиса | Только с помощью seed фразы |
226 |
227 | *Кастодиальные кошельки под полным контролем кастодиана*: любые нарушения правил кастодиана или законов юрисдикции кастодиана (в т.ч. из-за санкций) влечет за собой *риск потери контроля над средствами* нарушающей стороной. *Некастодиальные кошельки почти лишены такого риска*.
228 |
229 | ### :pushpin: Где хранить... а где не стоит
230 |
231 | Примем риск блокировки средств как высокий для всех бирж/кошельков, которые:
232 |
233 | - :-1: находятся в американской юрисдикции или
234 | - :-1: выполняли блокировку средств по требованию американских властей.
235 |
236 | Прецеденты:
237 |
238 | - :warning: Биржа Binance:
239 | - невозможно ввести/вывести деньги на карту с российских банков
240 | - P2P переводы для [неподсанкционных бакнков](lists.md#банки-под-санкциями) доступны
241 | - [блокируют пользователей только из санкционных списков OFAC](https://www.binance.com/en/blog/leadership/ukraine-russia-sanctions-and-crypto-421499824684903532), но не всех подряд с резиденством РФ
242 | - 2022-04-21 вступили в силу ограничения для резидентов РФ, чья сумма баланса в совокупности превышает €10 000: [доступен будет только вывод средства, торговля и депозиты будут заблокированы](https://www.binance.com/en/support/announcement/4887e569afdf4b1e89e024371d3a49b9).
243 | - :warning: Американская биржа Coinbase [объявила о блокировке более 25 тыс. кошельков](https://twitter.com/brian_armstrong/status/1499621509651787782?s=20&t=zGROkm-WKH5Ja6f6LR7BwA), связанных с российскими гражданами и компаниями из американских санкционных списков OFAC [4]
244 | - :warning: Американская биржа Kraken, несмотря на [просьбы со стороны украинских властей, **отказалась** блокировать российские аккаунты](https://twitter.com/jespow/status/1498112741684363265?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1498112741684363265%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fcryptocurrency.tech%2Famerikanskaya-kriptobirzha-kraken-my-zablokiruem-scheta-rossiyan-v-sluchae-polucheniya-yuridicheskogo-trebovaniya%2F) без юридических оснований на это.
245 | - :no_entry: Биржа [Kuna](https://t.me/michaelchobanian/1439), [BTC Alpha](https://btc-alpha.com/en/news/important-message-for-btc-alpha-users-from-all-the), [Qmall](https://twitter.com/QmallExchange/status/1497957646531444738?ref_src=twsrc%5Etfw%7Ctwcamp%5Etweetembed%7Ctwterm%5E1497957646531444738%7Ctwgr%5E%7Ctwcon%5Es1_&ref_url=https%3A%2F%2Fforklog.com%2Fplatformy-kuna-whitebit-i-cex-io-vveli-ogranicheniya-dlya-rossijskih-polzovatelej%2F) заблокировали счета жителей России, а также заморозили их активы на своей платформе.
246 |
247 | - :warning: Представители биржи EXMO пообещали не блокировать доступ для всех российских пользователей, а только для лиц из санкционных списков.
248 | - :no_entry: Крупнейшие южнокорейские криптовалютные биржи Upbit, Bithumb и Korbit закрыли доступ к своим торговым платформам для россиян.
249 | - :no_entry_sign: Биржа CEX.io [прекратила регистрацию новых пользователей](https://t.me/CEXIO_Annoucements/201).
250 | - :warning: Крупнейшая NFT-биржа OpenSea, использующая для расчетов кошелек MetaMask, подтвердила, что [заблокировала и удалила аккаунты, попавшие в санкционные списки](https://fortune.com/2022/03/04/opensea-metamask-block-users-sanctions/)
251 | - :warning: Кошелек Metamask [недоступен в санкционных юрисдикциях Крым, Л/ДНР](https://metamask.zendesk.com/hc/en-us/articles/360059386712-Why-MetaMask-and-Infura-cannot-serve-certain-areas).
252 |
253 | ## Итак
254 |
255 | В сухом остатке:
256 |
257 | | Где | Что | Цель | Горизонт | Аналог на классических финансовых рынков | Риски просадки стоимости | Риски hack'ов | Риски блокировки средств (текущие) | Риски блокировки в случае санкций |
258 | | -- | -- | -- | -- | -- | -- | -- | -- | -- |
259 | | **CEX** биржа (кастодиальный кошелек) | Криптовалюты с плавающей стоимостью | Краткосрочные и высокорискованные инвестиции | Внутридневная торговля | Спекулятивная торговля на бирже | Самые высокие | Низкие | Умеренные | Самые высокие |
260 | | **DEX** биржа (некастодиальный кошелек) | Криптовалюты с плавающей стоимостью | Среднесрочные инвестиции | 1-3 года | Инвестиции в акции | Высокие | Умеренные | Низкие | Умеренные |
261 | | **Приложение-кошелек** ([некастодиальный кошелек](lists.md#некастодиальные-кошельки)) | Криптовалютные портфели с плавающей стоимостью | Средне- или долгосрочные инвестиции | ~3 года | Инвестиции в акции и ETF | Умеренные* | Низкие | Низкие | Низкие |
262 | | **DEX** биржа (некастодиальный кошелек) | Стейкинг пар с криптовалютой | Сбережения в валюте с защитой от инфляции | - | **Валютный депозит в банке** | Низкие | Умеренные | Низкие | Умеренные |
263 | | **Приложение-кошелек** (некастодиальный кошелек) | [Алгоритмические стейблкоины](lists.md#stablecoins) | Хэджирование валютных рисков | - | **Счет в долларах в банке** | Низкие | Низкие | Низкие | Низкие |
264 | | **Холодный кошелек** (некастодиальный) | BTC и ETH (не более 10%), алгоритмические стейблкоины | Надежно спрятать сбережения | от 3 лет | Банковская ячейка с долларами, золотом, акциями FAANG | Низкие** | Самые низкие | Самые низкие | Самые низкие |
265 |
266 | \* На горизонте 3 лет с ребалансировкой портфеля.
267 |
268 | \** Инфляция "ест" сбержения.
269 |
270 |
271 | ## :link: Полезные ссылки
272 |
273 | 1. **[Этот пост и обсуждения](https://habr.com/ru/post/655735/) на Habr**.
274 | 2. [Senators Say Cryptocurrencies Could Help Russia Evade Sanctions](https://www.wsj.com/livecoverage/russia-ukraine-latest-news-2022-03-02/card/senators-say-cryptocurrencies-could-help-russia-evade-sanctions-7dQ5pvPEwJ1xcSfCnoxI?mod=article_inline), The Wall Street Journal.
275 | 2. [EU seeks to prevent use of crypto to avoid Russia sanctions](https://www.ft.com/content/325864c5-01c5-4373-bdd2-aaa56400b30b), Financial Times.
276 | 3. [Justice Department Announces First Director of National Cryptocurrency Enforcement Team](https://www.justice.gov/opa/pr/justice-department-announces-first-director-national-cryptocurrency-enforcement-team), justice.gov.
277 | 4. [OFAC sanctions list](https://sanctionssearch.ofac.treas.gov/), OFAC.
278 |
--------------------------------------------------------------------------------
/src/binance_open_data.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Binance Open Data lab"
8 | ]
9 | },
10 | {
11 | "cell_type": "markdown",
12 | "metadata": {},
13 | "source": [
14 | "[Binance Open Data](https://github.com/binance/binance-public-data/#klines) and analyze it.\n",
15 | "\n",
16 | "### Stet 1. Download data \n",
17 | "\n",
18 | "Downloading __1-minute candles__ for `BTC/USDT` and `BTC/UDSC` using `bash` or `powershell` scripts:"
19 | ]
20 | },
21 | {
22 | "cell_type": "code",
23 | "execution_count": null,
24 | "metadata": {
25 | "vscode": {
26 | "languageId": "shellscript"
27 | }
28 | },
29 | "outputs": [],
30 | "source": [
31 | "#!/bin/sh\n",
32 | "\n",
33 | "# create dir for data\n",
34 | "!mkdir ../data\n",
35 | "\n",
36 | "# download data using GET request\n",
37 | "!wget -N -P ../data https://data.binance.vision/data/spot/daily/klines/BTCUSDT/1m/BTCUSDT-1m-2022-06-21.zip\n",
38 | "!wget -N -P../data https://data.binance.vision/data/spot/daily/klines/BTCUSDC/1m/BTCUSDC-1m-2022-06-21.zip\n",
39 | "\n",
40 | "# unzip\n",
41 | "!unzip -o -d ../data ../data/BTCUSDT-1m-2022-06-21.zip \n",
42 | "!unzip -o -d ../data ../data/BTCUSDC-1m-2022-06-21.zip"
43 | ]
44 | },
45 | {
46 | "cell_type": "markdown",
47 | "metadata": {},
48 | "source": [
49 | "### Step 2: Import data to Dataframe \n",
50 | "\n",
51 | "Import packages for data analysis:"
52 | ]
53 | },
54 | {
55 | "cell_type": "code",
56 | "execution_count": null,
57 | "metadata": {},
58 | "outputs": [],
59 | "source": [
60 | "import numpy as np\n",
61 | "import pandas as pd\n",
62 | "\n",
63 | "import httpx\n",
64 | "\n",
65 | "from datetime import datetime"
66 | ]
67 | },
68 | {
69 | "cell_type": "markdown",
70 | "metadata": {},
71 | "source": [
72 | "Import data from CSV file to Pandas DataFrame:"
73 | ]
74 | },
75 | {
76 | "cell_type": "code",
77 | "execution_count": null,
78 | "metadata": {},
79 | "outputs": [],
80 | "source": [
81 | "def get_data(pair: str) -> pd.DataFrame:\n",
82 | " return pd.read_csv(f'../data/{pair}-1m-2022-06-21.csv', header = None)\n",
83 | "\n",
84 | "btcusdt_df = get_data('BTCUSDT')\n",
85 | "btcusdt_df.head()"
86 | ]
87 | },
88 | {
89 | "cell_type": "markdown",
90 | "metadata": {},
91 | "source": [
92 | "Set names to columns:"
93 | ]
94 | },
95 | {
96 | "cell_type": "code",
97 | "execution_count": null,
98 | "metadata": {},
99 | "outputs": [],
100 | "source": [
101 | "def set_column_names(df: pd.DataFrame) -> pd.DataFrame:\n",
102 | " column_names_mapping = {\n",
103 | " 0: 'Open_time',\n",
104 | " 1: 'Open',\n",
105 | " 2: 'High',\n",
106 | " 3: 'Low',\n",
107 | " 4: 'Close',\n",
108 | " 5: 'Volume',\n",
109 | " 6: 'Close_time',\n",
110 | " 7: 'Quote_asset_volume',\n",
111 | " 8: 'Number_of_trades',\n",
112 | " 9: 'Taker_buy_base_asset_volume',\n",
113 | " 10: 'Taker_buy_quote_asset_volume',\n",
114 | " 11: 'Ignore'\n",
115 | " }\n",
116 | " return df.rename(columns=column_names_mapping)\n",
117 | "\n",
118 | "btcusdt_df = set_column_names(btcusdt_df)\n",
119 | "btcusdt_df.head()"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "Convert timestamp to human-readable date and time format:"
127 | ]
128 | },
129 | {
130 | "cell_type": "code",
131 | "execution_count": null,
132 | "metadata": {},
133 | "outputs": [],
134 | "source": [
135 | "btcusdt_df['Open_time'] = btcusdt_df.iloc[:, 0].apply(lambda t: datetime.fromtimestamp(t/1000))\n",
136 | "btcusdt_df['Close_time'] = btcusdt_df.iloc[:, 6].apply(lambda t: datetime.fromtimestamp(t/1000))\n",
137 | "\n",
138 | "btcusdt_df.head()"
139 | ]
140 | },
141 | {
142 | "cell_type": "markdown",
143 | "metadata": {},
144 | "source": [
145 | "Let's take a look at _Descriptive statistics_ (min, mean, max, standard deviation):"
146 | ]
147 | },
148 | {
149 | "cell_type": "code",
150 | "execution_count": null,
151 | "metadata": {},
152 | "outputs": [],
153 | "source": [
154 | "btcusdt_df.describe(datetime_is_numeric=True)"
155 | ]
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "metadata": {},
160 | "source": [
161 | "### Step 2: Transform data\n",
162 | "\n",
163 | "Calculate __1-hour OHLCV__ candles:"
164 | ]
165 | },
166 | {
167 | "cell_type": "code",
168 | "execution_count": null,
169 | "metadata": {},
170 | "outputs": [],
171 | "source": [
172 | "def calculate_ohclv(df: pd.DataFrame) -> pd.DataFrame:\n",
173 | " df['hour'] = df['Close_time'].apply(lambda t: t.hour)\n",
174 | "\n",
175 | " return (\n",
176 | " df\n",
177 | " .groupby(['hour'])\n",
178 | " .agg(\n",
179 | " {\n",
180 | " 'Open': 'first',\n",
181 | " 'High': max,\n",
182 | " 'Low': min,\n",
183 | " 'Close': 'last',\n",
184 | " 'Volume': sum,\n",
185 | " 'Close_time': max\n",
186 | " }\n",
187 | " )\n",
188 | " .reset_index()\n",
189 | " .drop(columns=['hour'])\n",
190 | " )\n",
191 | "\n",
192 | "btcusdt_1h_df = calculate_ohclv(btcusdt_df)\n",
193 | "\n",
194 | "btcusdt_1h_df"
195 | ]
196 | },
197 | {
198 | "cell_type": "markdown",
199 | "metadata": {},
200 | "source": [
201 | "Data validation is very important. Let's write domain-driven asserts:"
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": null,
207 | "metadata": {},
208 | "outputs": [],
209 | "source": [
210 | "assert(\n",
211 | " isinstance(btcusdt_1h_df, pd.DataFrame)\n",
212 | " and btcusdt_1h_df.shape == (24, 6)\n",
213 | " and not btcusdt_1h_df.isnull().any().any()\n",
214 | " and btcusdt_1h_df.iloc[:, 0:5].ge(0).all().all()\n",
215 | " )"
216 | ]
217 | },
218 | {
219 | "cell_type": "markdown",
220 | "metadata": {},
221 | "source": [
222 | "### Step 3: Expand the dataset with information about `BTC/USDC` \n",
223 | "\n",
224 | "Download `BTC/USDC` 1-minute candles and transform it to 1-hour candles:"
225 | ]
226 | },
227 | {
228 | "cell_type": "code",
229 | "execution_count": null,
230 | "metadata": {},
231 | "outputs": [],
232 | "source": [
233 | "btcusdc_df = get_data('BTCUSDC') # download data\n",
234 | "btcusdc_df = set_column_names(btcusdc_df) # set column names\n",
235 | "btcusdc_df['Close_time'] = btcusdc_df.iloc[:, 6].apply(lambda t: datetime.fromtimestamp(t/1000)) # convert timestamp to date+time\n",
236 | "\n",
237 | "btcusdc_1h_df = calculate_ohclv(btcusdc_df) # calculate 1h OHCLV candles\n",
238 | "btcusdc_1h_df"
239 | ]
240 | },
241 | {
242 | "cell_type": "markdown",
243 | "metadata": {},
244 | "source": [
245 | "Join altogether:"
246 | ]
247 | },
248 | {
249 | "cell_type": "code",
250 | "execution_count": null,
251 | "metadata": {},
252 | "outputs": [],
253 | "source": [
254 | "btcusdt_1h_df['pair'] = 'BTC-USDT'\n",
255 | "btcusdc_1h_df['pair'] = 'BTC-USDC'\n",
256 | "\n",
257 | "# Join datasets\n",
258 | "candles_1h_df = pd.concat([btcusdt_1h_df, btcusdc_1h_df])\n",
259 | "\n",
260 | "# Validate result\n",
261 | "assert(\n",
262 | " isinstance(candles_1h_df, pd.DataFrame)\n",
263 | " and candles_1h_df.shape == (48, 7)\n",
264 | " and (candles_1h_df['pair'].unique() == ['BTC-USDT', 'BTC-USDC']).all()\n",
265 | ")\n",
266 | "\n",
267 | "# Sort output by Close_time\n",
268 | "candles_1h_df.sort_values('Close_time')"
269 | ]
270 | },
271 | {
272 | "cell_type": "markdown",
273 | "metadata": {},
274 | "source": [
275 | "### (Optional) Use Binance API"
276 | ]
277 | },
278 | {
279 | "cell_type": "markdown",
280 | "metadata": {},
281 | "source": [
282 | "# %%\n",
283 | "import pandas as pd \n",
284 | "from binance.client import Client\n",
285 | "\n",
286 | "\n",
287 | "# %%\n",
288 | "api_key = \"****\"\n",
289 | "secret_key = \"***\"\n",
290 | "\n",
291 | "client = Client(api_key, secret_key)\n",
292 | "\n",
293 | "\n",
294 | "# %%\n",
295 | "coins_response = client.get_all_coins_info()\n",
296 | "coins_df = pd.DataFrame.from_dict(coins_response, orient='columns')\n",
297 | "\n",
298 | "\n",
299 | "# %%\n",
300 | "pairs_list = coins_df.coin.apply(lambda x: f\"{x}USDT\") \n",
301 | "client.get_historical_klines(\n",
302 | " 'BTCUSDT', \n",
303 | " interval=Client.KLINE_INTERVAL_1HOUR,\n",
304 | " start_str='2022-04-21', \n",
305 | " end_str='2022-04-22'\n",
306 | ")"
307 | ]
308 | }
309 | ],
310 | "metadata": {
311 | "kernelspec": {
312 | "display_name": "Python 3.9.13 ('base')",
313 | "language": "python",
314 | "name": "python3"
315 | },
316 | "language_info": {
317 | "codemirror_mode": {
318 | "name": "ipython",
319 | "version": 3
320 | },
321 | "file_extension": ".py",
322 | "mimetype": "text/x-python",
323 | "name": "python",
324 | "nbconvert_exporter": "python",
325 | "pygments_lexer": "ipython3",
326 | "version": "3.9.12"
327 | },
328 | "orig_nbformat": 4,
329 | "vscode": {
330 | "interpreter": {
331 | "hash": "6fd7ff10be7e3a66c1b3745c4cbc00041a2589eb74ab4be46a3698a7b56001aa"
332 | }
333 | }
334 | },
335 | "nbformat": 4,
336 | "nbformat_minor": 2
337 | }
338 |
--------------------------------------------------------------------------------
/src/cryptocurrency_portfolio__assets_selection.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 |
4 | """Crypto Currency Portfolio: Assets Selection.
5 |
6 | Description:
7 | Crypto Currency Selection using monte Carlo simulation.
8 | """
9 |
10 | # %% Import dependencies ----
11 | # core
12 | import os
13 | import gc
14 |
15 | # data science
16 | import pandas as pd
17 | import numpy as np
18 | from scipy.stats import norm
19 |
20 | # Cloud integration
21 | from azureml.core import Workspace, Dataset, VERSION as aml_version
22 | print(f'Azure ML SDK v{aml_version}')
23 |
24 | # network
25 | import ssl
26 | ssl._create_default_https_context = ssl._create_unverified_context
27 |
28 | # plots
29 | import matplotlib.pyplot as plt
30 | import seaborn as sns
31 |
32 | # show info about python env
33 | from IPython import sys_info
34 | print(sys_info())
35 |
36 | import warnings
37 | warnings.filterwarnings("ignore")
38 |
39 |
40 | # %% Set params ----
41 | symbols = ['BTCUSDT', 'ETHUSDT', 'BNBUSDT', 'SOLUSDT', 'MATICUSDT', 'UNIUSDT']
42 |
43 | n_days = int(252) # US market has 252 trading days in a year
44 | n_iterations = int(1e4)
45 |
46 |
47 |
48 | # %% Load quotes ----
49 | def get_quotes(symbol: str) -> pd.DataFrame:
50 | df = pd.read_csv(f'https://www.cryptodatadownload.com/cdd/Binance_{symbol}_d.csv', skiprows=[0])
51 | df = df.set_index('date')
52 | df = df.sort_values(by = 'date')
53 |
54 | return df[['symbol', 'open', 'high', 'low', 'close']]
55 |
56 | quotes_data = [get_quotes(s) for s in symbols]
57 | # row-wise union:
58 | # pd.concat([get_quotes(s) for s in symbols])
59 | # column-wise:
60 | # pd.concat(list1, axis=1, ignore_index=False)
61 |
62 |
63 | btcusdt_df = quotes_data[0]
64 |
65 | pd.concat([
66 | btcusdt_df['close'].head(5),
67 | btcusdt_df['close'].tail(5)
68 | ])
69 |
70 |
71 |
72 | # %% Calculate Return
73 | def get_returns(close_prices) -> pd.Series:
74 | return (close_prices/close_prices.shift()) - 1
75 |
76 |
77 | btcusdt_df['diff'] = btcusdt_df['close'].diff()
78 | btcusdt_df['return'] = get_returns(btcusdt_df['close'])
79 |
80 | btcusdt_df[['close', 'diff', 'return']].tail(10)
81 |
82 |
83 |
84 | # %% Calculate LogReturn
85 | def get_log_returns(return_prices) -> pd.Series:
86 | return np.log(1 + return_prices)
87 |
88 | btcusdt_df['log_return'] = btcusdt_df['return'].apply(lambda x: get_log_returns(x))
89 | btcusdt_df[['close', 'diff', 'return', 'log_return']].tail(10)
90 |
91 |
92 |
93 | # %% Simulate possible LogReturns
94 |
95 | def get_simulated_returns(log_returns: pd.Series, n_days: int, n_iterations: int) -> pd.Series:
96 | u = log_returns.mean()
97 | var = log_returns.var()
98 | stdev = log_returns.std()
99 |
100 | drift = u - (0.5*var)
101 | Z = norm.ppf(np.random.rand(n_days, n_iterations))
102 |
103 | return np.exp(drift + stdev*Z)
104 |
105 |
106 | btcusd_logreturns = btcusdt_df['log_return'].dropna()
107 | btcusd_simulated_returns = get_simulated_returns(btcusd_logreturns, n_days, n_iterations)
108 |
109 | assert(
110 | btcusd_simulated_returns.shape == (n_days, n_iterations)
111 | )
112 |
113 |
114 |
115 | # %% Monte carlo simulation functions ----
116 | def get_breakeven_prob(predicted, threshold = 0):
117 | """
118 | This function calculated the probability of a stock being above a certain threshhold, which can be defined as a value (final stock price) or return rate (percentage change)
119 | """
120 | predicted0 = predicted.iloc[0,0]
121 | predicted = predicted.iloc[-1]
122 | predList = list(predicted)
123 |
124 | over = [(i*100)/predicted0 for i in predList if ((i-predicted0)*100)/predicted0 >= threshold]
125 | less = [(i*100)/predicted0 for i in predList if ((i-predicted0)*100)/predicted0 < threshold]
126 |
127 | return (len(over)/(len(over) + len(less)))
128 |
129 |
130 | def monte_carlo_simulation(simulated_returns: pd.Series, last_actual_price: float, n_days: int, plot=True):
131 | # Create empty matrix
132 | price_list = np.zeros_like(simulated_returns)
133 |
134 | # Put the last actual price in the first row of matrix
135 | price_list[0] = last_actual_price
136 |
137 | # Calculate the price of each day
138 | for t in range(1, n_days):
139 | price_list[t] = price_list[t-1]*simulated_returns[t]
140 |
141 | # Plot
142 | if plot == True:
143 | x = pd.DataFrame(price_list).iloc[-1]
144 | fig, ax = plt.subplots(1, 2, figsize=(14,4))
145 | sns.distplot(x, ax=ax[0])
146 | sns.distplot(x, hist_kws={'cumulative': True}, kde_kws={'cumulative': True}, ax=ax[1])
147 | plt.xlabel('Stock Price')
148 | plt.show()
149 |
150 |
151 | print(f"Investment period: {n_days-1}")
152 | print(f"Expected Value: ${round(pd.DataFrame(price_list).iloc[-1].mean(),2)}")
153 | print(f"Return: {round(100*(pd.DataFrame(price_list).iloc[-1].mean()-price_list[0,1])/pd.DataFrame(price_list).iloc[-1].mean(),2)}%")
154 | print(f"Probability of Breakeven: {get_breakeven_prob(pd.DataFrame(price_list))}")
155 |
156 | return pd.DataFrame(price_list)
157 |
158 |
159 | # %% Run Monte carlo simulation and estimate result
160 |
161 | simulated_prices_df = monte_carlo_simulation(
162 | btcusd_simulated_returns,
163 | quotes_data[0]['close'].tail(1),
164 | n_days)
165 |
166 |
167 | plt.figure(figsize=(10,6))
168 | plt.plot(simulated_prices_df.iloc[:, 1:10])
169 | plt.show()
170 |
171 |
172 |
173 | # %% Monte Carlo simulation pipeline for multiple tokens ----
174 |
175 | n_iterations = int(1e4) #! WARN: set simulations number
176 |
177 | returns_data = [get_returns(df['close']) for df in quotes_data]
178 | log_returns_data = [get_log_returns(r) for r in returns_data]
179 | simulated_returns_data = [get_simulated_returns(lr, n_days, n_iterations) for lr in log_returns_data]
180 |
181 |
182 | for i in range(len(simulated_returns_data)):
183 | print(f'Starting Monte-Carlo simulation for {symbols[i]} symbol...')
184 | prices_ms = monte_carlo_simulation(simulated_returns_data[i], quotes_data[i]['close'].tail(1), n_days, plot=True)
185 |
186 | plt.figure(figsize=(10,6))
187 | plt.plot(prices_ms.iloc[:, 1:50])
188 | plt.show()
189 |
--------------------------------------------------------------------------------
/src/fx_currencies_analysis.Rmd:
--------------------------------------------------------------------------------
1 | ---
2 | title: "Currencies Analysis"
3 | date: "`r format(Sys.time(), '%d %B, %Y')`"
4 | output:
5 | github_document:
6 | toc: false
7 | toc_depth: 2
8 | fig_width: 9
9 | fig_height: 9
10 | ---
11 |
12 | ```{r setup, include=FALSE}
13 | knitr::opts_chunk$set(echo = T, warning = F)
14 | ```
15 |
16 | ***Analysis price of the my list of currencies.***
17 |
18 | ## Prepare
19 |
20 | Install packages and set environment :earth_asia:
21 |
22 | `install.packages("azuremlsdk")`
23 |
24 | ```{r set_envinroment, message=FALSE}
25 | options(max.print = 1e3, scipen = 999, width = 1e2)
26 | options(stringsAsFactors = F)
27 |
28 | suppressPackageStartupMessages({
29 | library(dplyr)
30 | library(tidyr)
31 |
32 | library(lubridate)
33 | library(stringr)
34 |
35 | library(gt)
36 | library(tidyverse)
37 | library(glue)
38 |
39 | library(ggplot2)
40 |
41 | library(azuremlsdk)
42 | })
43 | ```
44 |
45 |
46 | ```{r set_params}
47 | .azureml_dataset_name <- "Currencies"
48 | ```
49 |
50 |
51 | Connect to Azure ML workspace:
52 |
53 | ```{r azureml_connect}
54 | ws <- azuremlsdk::load_workspace_from_config()
55 | sprintf(
56 | "%s workspace located in %s region", ws$name, ws$location
57 | )
58 | ```
59 |
60 |
61 | ## Load dataset
62 |
63 | WARNING: I used `currency exchange rates` data from [Kaggle Dataset](https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates):
64 |
65 | ```{r get_azure_dataset}
66 | currencies_ds <- azuremlsdk::get_dataset_by_name(ws, name = .azureml_dataset_name)
67 |
68 | sprintf(
69 | "Dataset name: %s. %s",
70 | currencies_ds$name,
71 | currencies_ds$description
72 | )
73 | ```
74 |
75 | Get `USD/RUB` top higher rates:
76 |
77 | ```{r prepare_dataframe}
78 | quotes_df <- currencies_ds$to_pandas_dataframe()
79 |
80 | # ~ 20 years, 150 currencies and 1.5M rows
81 |
82 | quotes_df %>%
83 | filter(slug == "USD/RUB") %>%
84 | select(-slug) %>%
85 | top_n(10) %>%
86 |
87 | gt() %>%
88 | tab_header(
89 | title = "USD/RUB Rate",
90 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
91 | ) %>%
92 | fmt_date(
93 | columns = date,
94 | date_style = 6
95 | ) %>%
96 | fmt_number(
97 | columns = c(open, high, low, close)
98 | )
99 | ```
100 |
101 | ## Preprocessing data
102 |
103 | Calculate `Return` and `Log Return` for last 10 years:
104 |
105 | ```{r preprocessing}
106 | quotes_df %<>%
107 | transmute(
108 | symbol = slug,
109 | price = close,
110 | date
111 | ) %>%
112 |
113 | filter(
114 | str_detect(symbol, "USD/") &
115 | date > max(date) - lubridate::years(10)
116 | ) %>%
117 |
118 | filter(!(symbol == "USD/RUB" & price < 1)) %>%
119 |
120 | arrange(date) %>%
121 | group_by(symbol) %>%
122 |
123 | mutate(
124 | return = c(NA_real_, diff(price))/lag(price),
125 | log_return = log(1 + return)
126 | ) %>%
127 | na.omit
128 | ```
129 |
130 | ## Discover Data
131 |
132 | Calculate statistics and `volatility`:
133 |
134 | ```{r discover}
135 | quotes_stats <- quotes_df %>%
136 |
137 | summarise(
138 | max_price = max(price),
139 | min_price = min(price),
140 | last_price = last(price),
141 | max_min_rate = max(price)/min(price),
142 | volatility = sd(log_return)
143 | )
144 |
145 | quotes_stats %>%
146 | mutate(
147 | `100x Volatility` = volatility*100
148 | ) %>%
149 | arrange(volatility) %>%
150 | select(-volatility) %>%
151 |
152 | gt() %>%
153 | tab_header(
154 | title = "The Least and The Most Volatile Currencies",
155 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
156 | ) %>%
157 | fmt_number(
158 | columns = c(max_price, min_price, max_min_rate, last_price, `100x Volatility`)
159 | )
160 | ```
161 | My broker trades the following pairs:
162 |
163 | ```{r}
164 | symbols <- c(
165 | 'RUB',
166 | 'EUR', 'GBP', 'CHF', 'CNY', 'HKD', 'JPY', 'SEK', 'SGD', 'AUD',
167 | 'AED', 'KZT', 'BYN', 'TRY', 'MXN'
168 | )
169 |
170 | symbols <- str_c("USD", symbols, sep = "/")
171 |
172 |
173 | quotes_stats %>%
174 | filter(
175 | symbol %in% symbols
176 | ) %>%
177 | mutate(
178 | `100x Volatility` = volatility*100
179 | ) %>%
180 | arrange(volatility) %>%
181 | select(-volatility) %>%
182 |
183 | gt() %>%
184 | tab_header(
185 | title = "The Most Promised Currencies",
186 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
187 | ) %>%
188 | fmt_number(
189 | columns = c(max_price, min_price, last_price, max_min_rate, `100x Volatility`)
190 | )
191 |
192 | ```
193 | Plot exchange rate for out favorites:
194 |
195 | Define low risk symbols:
196 |
197 | ```{r}
198 | usdrub_vol <- quotes_stats %>% filter(symbol == "USD/RUB") %>% pull(volatility)
199 |
200 | low_risk_symbols <- quotes_stats %>%
201 | filter(
202 | symbol %in% symbols &
203 | volatility <= usdrub_vol
204 | ) %>%
205 | pull(symbol) %>%
206 | unique
207 |
208 | cat(
209 | sprintf(
210 | "['%s']",
211 | paste(low_risk_symbols, collapse = "', '")
212 | ))
213 | ```
214 |
215 |
216 | ```{r}
217 | jumper_symbols <- quotes_stats %>% filter(max_min_rate > 2) %>% pull(symbol)
218 |
219 | quotes_df %>%
220 | filter(symbol %in% low_risk_symbols) %>%
221 | mutate(
222 | jumper = if_else(symbol %in% jumper_symbols, "High risk currencies", "Low risk currencies")
223 | ) %>%
224 | group_by(symbol) %>%
225 | mutate(R = cumsum(return)) %>%
226 |
227 | ggplot +
228 | geom_line(aes(x = date, y = R, color = symbol)) +
229 | scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
230 |
231 | facet_grid(jumper ~ ., scales = "free") +
232 |
233 | labs(
234 | title = "Currencies Exchange Rates", subtitle = "Return of Investment for last 10 years",
235 | x = "", y = "Return of Investment",
236 | caption = currencies_ds$description) +
237 | theme_minimal() +
238 |
239 | theme(
240 | legend.position = "top", legend.title = element_blank(),
241 | plot.caption = element_text(size = 8)
242 | )
243 | ```
244 |
245 |
246 |
247 |
248 |
249 |
--------------------------------------------------------------------------------
/src/fx_currencies_analysis.md:
--------------------------------------------------------------------------------
1 | Currencies Analysis
2 | ================
3 | 04 April, 2022
4 |
5 | ***Analysis price of the my list of currencies.***
6 |
7 | ## Prepare
8 |
9 | Install packages and set environment :earth asia:
10 |
11 | `install.packages("azuremlsdk")`
12 |
13 | ``` r
14 | options(max.print = 1e3, scipen = 999, width = 1e2)
15 | options(stringsAsFactors = F)
16 |
17 | suppressPackageStartupMessages({
18 | library(dplyr)
19 | library(tidyr)
20 |
21 | library(lubridate)
22 | library(stringr)
23 |
24 | library(gt)
25 | library(tidyverse)
26 | library(glue)
27 |
28 | library(ggplot2)
29 |
30 | library(azuremlsdk)
31 | })
32 | ```
33 |
34 | ``` r
35 | .azureml_dataset_name <- "Currencies"
36 | ```
37 |
38 | Connect to Azure ML workspace:
39 |
40 | ``` r
41 | ws <- azuremlsdk::load_workspace_from_config()
42 | sprintf(
43 | "%s workspace located in %s region", ws$name, ws$location
44 | )
45 | ```
46 |
47 | ## [1] "portf-opt-ws workspace located in westeurope region"
48 |
49 | ## Load dataset
50 |
51 | WARNING: I used `currency exchange rates` data from [Kaggle
52 | Dataset](https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates):
53 |
54 | ``` r
55 | currencies_ds <- azuremlsdk::get_dataset_by_name(ws, name = .azureml_dataset_name)
56 |
57 | sprintf(
58 | "Dataset name: %s. %s",
59 | currencies_ds$name,
60 | currencies_ds$description
61 | )
62 | ```
63 |
64 | ## [1] "Dataset name: Currencies. Source: https://www.kaggle.com/datasets/dhruvildave/currency-exchange-rates"
65 |
66 | Get `USD/RUB` top higher rates:
67 |
68 | ``` r
69 | quotes_df <- currencies_ds$to_pandas_dataframe()
70 |
71 | # ~ 20 years, 150 currencies and 1.5M rows
72 |
73 | quotes_df %>%
74 | filter(slug == "USD/RUB") %>%
75 | select(-slug) %>%
76 | top_n(10) %>%
77 |
78 | gt() %>%
79 | tab_header(
80 | title = "USD/RUB Rate",
81 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
82 | ) %>%
83 | fmt_date(
84 | columns = date,
85 | date_style = 6
86 | ) %>%
87 | fmt_number(
88 | columns = c(open, high, low, close)
89 | )
90 | ```
91 |
92 | ## Selecting by close
93 |
94 |
95 |
96 |
104 |
105 |
106 | date |
107 | open |
108 | high |
109 | low |
110 | close |
111 |
112 |
113 |
114 | Jan 21, 2016 |
115 | 82.06 |
116 | 85.82 |
117 | 82.06 |
118 | 81.82 |
119 | Jan 22, 2016 |
120 | 80.61 |
121 | 81.26 |
122 | 77.94 |
123 | 82.90 |
124 | Jan 26, 2016 |
125 | 81.54 |
126 | 82.16 |
127 | 78.33 |
128 | 79.84 |
129 | Feb 3, 2016 |
130 | 79.56 |
131 | 79.75 |
132 | 77.87 |
133 | 79.71 |
134 | Feb 10, 2016 |
135 | 79.39 |
136 | 79.49 |
137 | 77.65 |
138 | 79.59 |
139 | Feb 12, 2016 |
140 | 79.36 |
141 | 79.74 |
142 | 78.59 |
143 | 79.77 |
144 | Mar 19, 2020 |
145 | 80.92 |
146 | 82.07 |
147 | 79.24 |
148 | 80.92 |
149 | Mar 23, 2020 |
150 | 79.72 |
151 | 81.34 |
152 | 79.49 |
153 | 79.84 |
154 | Mar 31, 2020 |
155 | 79.59 |
156 | 79.69 |
157 | 77.66 |
158 | 79.59 |
159 | Nov 3, 2020 |
160 | 80.55 |
161 | 80.57 |
162 | 79.05 |
163 | 80.52 |
164 |
165 |
166 |
167 |
168 |
169 |
170 | ## Preprocessing data
171 |
172 | Calculate `Return` and `Log Return` for last 10 years:
173 |
174 | ``` r
175 | quotes_df %<>%
176 | transmute(
177 | symbol = slug,
178 | price = close,
179 | date
180 | ) %>%
181 |
182 | filter(
183 | str_detect(symbol, "USD/") &
184 | date > max(date) - lubridate::years(10)
185 | ) %>%
186 |
187 | filter(!(symbol == "USD/RUB" & price < 1)) %>%
188 |
189 | arrange(date) %>%
190 | group_by(symbol) %>%
191 |
192 | mutate(
193 | return = c(NA_real_, diff(price))/lag(price),
194 | log_return = log(1 + return)
195 | ) %>%
196 | na.omit
197 | ```
198 |
199 | ## Discover Data
200 |
201 | Calculate statistics and `volatility`:
202 |
203 | ``` r
204 | quotes_stats <- quotes_df %>%
205 |
206 | summarise(
207 | max_price = max(price),
208 | min_price = min(price),
209 | last_price = last(price),
210 | max_min_rate = max(price)/min(price),
211 | volatility = sd(log_return)
212 | )
213 |
214 | quotes_stats %>%
215 | mutate(
216 | `100x Volatility` = volatility*100
217 | ) %>%
218 | arrange(volatility) %>%
219 | select(-volatility) %>%
220 |
221 | gt() %>%
222 | tab_header(
223 | title = "The Least and The Most Volatile Currencies",
224 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
225 | ) %>%
226 | fmt_number(
227 | columns = c(max_price, min_price, max_min_rate, last_price, `100x Volatility`)
228 | )
229 | ```
230 |
231 |
232 |
233 |
241 |
242 |
243 | symbol |
244 | max_price |
245 | min_price |
246 | last_price |
247 | max_min_rate |
248 | 100x Volatility |
249 |
250 |
251 |
252 | USD/AED |
253 | 3.67 |
254 | 3.67 |
255 | 3.67 |
256 | 1.00 |
257 | 0.01 |
258 | USD/HKD |
259 | 7.85 |
260 | 7.75 |
261 | 7.79 |
262 | 1.01 |
263 | 0.03 |
264 | USD/KWD |
265 | 0.31 |
266 | 0.27 |
267 | 0.30 |
268 | 1.16 |
269 | 0.16 |
270 | USD/CNY |
271 | 7.18 |
272 | 6.03 |
273 | 6.47 |
274 | 1.19 |
275 | 0.23 |
276 | USD/DJF |
277 | 177.72 |
278 | 172.00 |
279 | 177.50 |
280 | 1.03 |
281 | 0.28 |
282 | USD/SGD |
283 | 1.46 |
284 | 1.20 |
285 | 1.34 |
286 | 1.21 |
287 | 0.33 |
288 | USD/SAR |
289 | 3.77 |
290 | 3.30 |
291 | 3.75 |
292 | 1.14 |
293 | 0.39 |
294 | USD/GTQ |
295 | 7.89 |
296 | 7.04 |
297 | 7.73 |
298 | 1.12 |
299 | 0.41 |
300 | USD/ILS |
301 | 4.07 |
302 | 3.13 |
303 | 3.20 |
304 | 1.30 |
305 | 0.45 |
306 | USD/TTD |
307 | 6.78 |
308 | 5.93 |
309 | 6.76 |
310 | 1.14 |
311 | 0.47 |
312 | USD/CAD |
313 | 1.46 |
314 | 0.97 |
315 | 1.26 |
316 | 1.51 |
317 | 0.47 |
318 | USD/MYR |
319 | 4.49 |
320 | 2.96 |
321 | 4.16 |
322 | 1.52 |
323 | 0.50 |
324 | USD/DKK |
325 | 7.15 |
326 | 5.18 |
327 | 6.30 |
328 | 1.38 |
329 | 0.51 |
330 | USD/EUR |
331 | 0.96 |
332 | 0.70 |
333 | 0.85 |
334 | 1.38 |
335 | 0.51 |
336 | USD/CRC |
337 | 619.70 |
338 | 478.54 |
339 | 619.70 |
340 | 1.29 |
341 | 0.53 |
342 | USD/PHP |
343 | 54.23 |
344 | 39.75 |
345 | 49.71 |
346 | 1.36 |
347 | 0.54 |
348 | USD/INR |
349 | 77.57 |
350 | 45.70 |
351 | 73.29 |
352 | 1.70 |
353 | 0.54 |
354 | USD/RON |
355 | 4.54 |
356 | 2.93 |
357 | 4.18 |
358 | 1.55 |
359 | 0.55 |
360 | USD/JPY |
361 | 125.63 |
362 | 75.74 |
363 | 109.90 |
364 | 1.66 |
365 | 0.55 |
366 | USD/GBP |
367 | 0.87 |
368 | 0.58 |
369 | 0.73 |
370 | 1.49 |
371 | 0.55 |
372 | USD/JMD |
373 | 153.88 |
374 | 83.37 |
375 | 150.53 |
376 | 1.85 |
377 | 0.56 |
378 | USD/MKD |
379 | 58.92 |
380 | 42.07 |
381 | 51.98 |
382 | 1.40 |
383 | 0.58 |
384 | USD/MDL |
385 | 20.31 |
386 | 11.09 |
387 | 17.58 |
388 | 1.83 |
389 | 0.61 |
390 | USD/BDT |
391 | 84.72 |
392 | 72.39 |
393 | 84.72 |
394 | 1.17 |
395 | 0.62 |
396 | USD/AUD |
397 | 1.74 |
398 | 0.93 |
399 | 1.37 |
400 | 1.88 |
401 | 0.63 |
402 | USD/SEK |
403 | 10.44 |
404 | 6.29 |
405 | 8.62 |
406 | 1.66 |
407 | 0.64 |
408 | USD/CHF |
409 | 1.03 |
410 | 0.79 |
411 | 0.92 |
412 | 1.31 |
413 | 0.64 |
414 | USD/CZK |
415 | 26.03 |
416 | 16.75 |
417 | 21.67 |
418 | 1.55 |
419 | 0.64 |
420 | USD/BWP |
421 | 12.19 |
422 | 6.58 |
423 | 11.12 |
424 | 1.85 |
425 | 0.66 |
426 | USD/NZD |
427 | 1.78 |
428 | 1.13 |
429 | 1.43 |
430 | 1.57 |
431 | 0.66 |
432 | USD/THB |
433 | 36.43 |
434 | 28.07 |
435 | 32.45 |
436 | 1.30 |
437 | 0.67 |
438 | USD/LKR |
439 | 199.43 |
440 | 106.22 |
441 | 199.43 |
442 | 1.88 |
443 | 0.67 |
444 | USD/KRW |
445 | 1,262.93 |
446 | 999.83 |
447 | 1,165.89 |
448 | 1.26 |
449 | 0.70 |
450 | USD/RSD |
451 | 118.47 |
452 | 70.05 |
453 | 99.29 |
454 | 1.69 |
455 | 0.70 |
456 | USD/UYU |
457 | 45.31 |
458 | 18.08 |
459 | 42.53 |
460 | 2.51 |
461 | 0.71 |
462 | USD/PLN |
463 | 4.28 |
464 | 2.87 |
465 | 3.86 |
466 | 1.49 |
467 | 0.72 |
468 | USD/HUF |
469 | 338.26 |
470 | 188.61 |
471 | 294.66 |
472 | 1.79 |
473 | 0.74 |
474 | USD/MUR |
475 | 42.55 |
476 | 26.50 |
477 | 42.55 |
478 | 1.61 |
479 | 0.79 |
480 | USD/MXN |
481 | 25.34 |
482 | 11.98 |
483 | 20.14 |
484 | 2.11 |
485 | 0.80 |
486 | USD/NIO |
487 | 35.13 |
488 | 22.05 |
489 | 35.00 |
490 | 1.59 |
491 | 0.84 |
492 | USD/KZT |
493 | 454.34 |
494 | 174.15 |
495 | 427.18 |
496 | 2.61 |
497 | 0.84 |
498 | USD/QAR |
499 | 3.90 |
500 | 3.00 |
501 | 3.64 |
502 | 1.30 |
503 | 0.95 |
504 | USD/TRY |
505 | 8.78 |
506 | 1.71 |
507 | 8.38 |
508 | 5.12 |
509 | 0.97 |
510 | USD/ZAR |
511 | 19.25 |
512 | 6.98 |
513 | 14.66 |
514 | 2.76 |
515 | 0.99 |
516 | USD/RUB |
517 | 82.90 |
518 | 28.79 |
519 | 73.50 |
520 | 2.88 |
521 | 1.05 |
522 | USD/ZMW |
523 | 22.64 |
524 | 5.11 |
525 | 15.82 |
526 | 4.43 |
527 | 1.06 |
528 | USD/BRL |
529 | 5.89 |
530 | 1.58 |
531 | 5.19 |
532 | 3.72 |
533 | 1.08 |
534 | USD/ARS |
535 | 97.70 |
536 | 4.10 |
537 | 97.70 |
538 | 23.85 |
539 | 1.11 |
540 | USD/TND |
541 | 3.06 |
542 | 1.37 |
543 | 2.79 |
544 | 2.23 |
545 | 1.17 |
546 | USD/BGN |
547 | 1.87 |
548 | 1.21 |
549 | 1.66 |
550 | 1.55 |
551 | 1.28 |
552 | USD/EGP |
553 | 19.60 |
554 | 5.83 |
555 | 15.65 |
556 | 3.37 |
557 | 1.29 |
558 | USD/NOK |
559 | 11.76 |
560 | 5.36 |
561 | 8.66 |
562 | 2.19 |
563 | 1.31 |
564 | USD/PEN |
565 | 4.11 |
566 | 2.38 |
567 | 4.07 |
568 | 1.72 |
569 | 1.34 |
570 | USD/BYN |
571 | 3.08 |
572 | 0.51 |
573 | 2.51 |
574 | 6.04 |
575 | 1.37 |
576 | USD/MAD |
577 | 10.29 |
578 | 7.89 |
579 | 8.95 |
580 | 1.30 |
581 | 1.43 |
582 | USD/UAH |
583 | 33.50 |
584 | 7.80 |
585 | 26.92 |
586 | 4.30 |
587 | 1.83 |
588 | USD/SDG |
589 | 451.00 |
590 | 1.39 |
591 | 440.03 |
592 | 324.46 |
593 | 5.96 |
594 | USD/BND |
595 | 1.43 |
596 | 0.66 |
597 | 1.34 |
598 | 2.18 |
599 | 6.29 |
600 | USD/XOF |
601 | 647.00 |
602 | 58.00 |
603 | 555.47 |
604 | 11.16 |
605 | 6.44 |
606 | USD/IDR |
607 | 16,504.80 |
608 | 892.00 |
609 | 14,370.00 |
610 | 18.50 |
611 | 6.58 |
612 | USD/HNL |
613 | 24.90 |
614 | 3.00 |
615 | 23.83 |
616 | 8.30 |
617 | 8.14 |
618 | USD/MZN |
619 | 78.49 |
620 | 3.30 |
621 | 63.11 |
622 | 23.78 |
623 | 8.77 |
624 | USD/ETB |
625 | 45.23 |
626 | 1.00 |
627 | 45.06 |
628 | 45.23 |
629 | 9.26 |
630 | USD/TWD |
631 | 33.73 |
632 | 1.80 |
633 | 27.77 |
634 | 18.72 |
635 | 9.86 |
636 | USD/PKR |
637 | 168.15 |
638 | 2.00 |
639 | 165.63 |
640 | 84.07 |
641 | 12.69 |
642 | USD/UZS |
643 | 10,653.20 |
644 | 83.00 |
645 | 10,646.89 |
646 | 128.35 |
647 | 12.93 |
648 | USD/GHS |
649 | 573.00 |
650 | 1.00 |
651 | 5.98 |
652 | 573.00 |
653 | 13.74 |
654 | USD/ISK |
655 | 147.04 |
656 | 2.00 |
657 | 126.65 |
658 | 73.52 |
659 | 16.09 |
660 | USD/PGK |
661 | 3.51 |
662 | 0.29 |
663 | 3.51 |
664 | 11.89 |
665 | 16.18 |
666 | USD/MMK |
667 | 1,642.00 |
668 | 6.23 |
669 | 1,642.00 |
670 | 263.65 |
671 | 16.59 |
672 | USD/CLP |
673 | 867.50 |
674 | 5.00 |
675 | 782.21 |
676 | 173.50 |
677 | 18.70 |
678 | USD/SZL |
679 | 1,189.00 |
680 | 1.07 |
681 | 14.91 |
682 | 1,111.21 |
683 | 18.79 |
684 | USD/XPF |
685 | 119.35 |
686 | 1.00 |
687 | 100.90 |
688 | 119.35 |
689 | 19.32 |
690 | USD/SOS |
691 | 1,670.00 |
692 | 6.00 |
693 | 571.00 |
694 | 278.33 |
695 | 29.77 |
696 | USD/MWK |
697 | 812.43 |
698 | 1.00 |
699 | 804.55 |
700 | 812.43 |
701 | 30.83 |
702 | USD/NGN |
703 | 412.50 |
704 | 1.00 |
705 | 411.00 |
706 | 412.50 |
707 | 31.65 |
708 | USD/VND |
709 | 23,631.00 |
710 | 21.00 |
711 | 22,775.00 |
712 | 1,125.29 |
713 | 34.09 |
714 | USD/COP |
715 | 4,174.75 |
716 | 3.67 |
717 | 3,805.25 |
718 | 1,136.67 |
719 | 37.09 |
720 | USD/IQD |
721 | 1,578.00 |
722 | 10.00 |
723 | 1,458.00 |
724 | 157.80 |
725 | 37.10 |
726 | USD/MGA |
727 | 3,931.18 |
728 | 0.30 |
729 | 3,808.00 |
730 | 12,910.29 |
731 | 46.29 |
732 | USD/SLL |
733 | 10,250.50 |
734 | 1.00 |
735 | 10,250.50 |
736 | 10,250.50 |
737 | 47.59 |
738 |
739 |
740 |
741 |
742 |
743 |
744 | My broker trades the following pairs:
745 |
746 | ``` r
747 | symbols <- c(
748 | 'RUB',
749 | 'EUR', 'GBP', 'CHF', 'CNY', 'HKD', 'JPY', 'SEK', 'SGD', 'AUD',
750 | 'AED', 'KZT', 'BYN', 'TRY', 'MXN'
751 | )
752 |
753 | symbols <- str_c("USD", symbols, sep = "/")
754 |
755 |
756 | quotes_stats %>%
757 | filter(
758 | symbol %in% symbols
759 | ) %>%
760 | mutate(
761 | `100x Volatility` = volatility*100
762 | ) %>%
763 | arrange(volatility) %>%
764 | select(-volatility) %>%
765 |
766 | gt() %>%
767 | tab_header(
768 | title = "The Most Promised Currencies",
769 | subtitle = glue("{min(quotes_df$date)} to {max(quotes_df$date)}")
770 | ) %>%
771 | fmt_number(
772 | columns = c(max_price, min_price, last_price, max_min_rate, `100x Volatility`)
773 | )
774 | ```
775 |
776 |
777 |
778 |
779 |
787 |
788 |
789 | symbol |
790 | max_price |
791 | min_price |
792 | last_price |
793 | max_min_rate |
794 | 100x Volatility |
795 |
796 |
797 |
798 | USD/AED |
799 | 3.67 |
800 | 3.67 |
801 | 3.67 |
802 | 1.00 |
803 | 0.01 |
804 | USD/HKD |
805 | 7.85 |
806 | 7.75 |
807 | 7.79 |
808 | 1.01 |
809 | 0.03 |
810 | USD/CNY |
811 | 7.18 |
812 | 6.03 |
813 | 6.47 |
814 | 1.19 |
815 | 0.23 |
816 | USD/SGD |
817 | 1.46 |
818 | 1.20 |
819 | 1.34 |
820 | 1.21 |
821 | 0.33 |
822 | USD/EUR |
823 | 0.96 |
824 | 0.70 |
825 | 0.85 |
826 | 1.38 |
827 | 0.51 |
828 | USD/JPY |
829 | 125.63 |
830 | 75.74 |
831 | 109.90 |
832 | 1.66 |
833 | 0.55 |
834 | USD/GBP |
835 | 0.87 |
836 | 0.58 |
837 | 0.73 |
838 | 1.49 |
839 | 0.55 |
840 | USD/AUD |
841 | 1.74 |
842 | 0.93 |
843 | 1.37 |
844 | 1.88 |
845 | 0.63 |
846 | USD/SEK |
847 | 10.44 |
848 | 6.29 |
849 | 8.62 |
850 | 1.66 |
851 | 0.64 |
852 | USD/CHF |
853 | 1.03 |
854 | 0.79 |
855 | 0.92 |
856 | 1.31 |
857 | 0.64 |
858 | USD/MXN |
859 | 25.34 |
860 | 11.98 |
861 | 20.14 |
862 | 2.11 |
863 | 0.80 |
864 | USD/KZT |
865 | 454.34 |
866 | 174.15 |
867 | 427.18 |
868 | 2.61 |
869 | 0.84 |
870 | USD/TRY |
871 | 8.78 |
872 | 1.71 |
873 | 8.38 |
874 | 5.12 |
875 | 0.97 |
876 | USD/RUB |
877 | 82.90 |
878 | 28.79 |
879 | 73.50 |
880 | 2.88 |
881 | 1.05 |
882 | USD/BYN |
883 | 3.08 |
884 | 0.51 |
885 | 2.51 |
886 | 6.04 |
887 | 1.37 |
888 |
889 |
890 |
891 |
892 |
893 |
894 | Plot exchange rate for out favorites:
895 |
896 | Define low risk symbols:
897 |
898 | ``` r
899 | usdrub_vol <- quotes_stats %>% filter(symbol == "USD/RUB") %>% pull(volatility)
900 |
901 | low_risk_symbols <- quotes_stats %>%
902 | filter(
903 | symbol %in% symbols &
904 | volatility <= usdrub_vol
905 | ) %>%
906 | pull(symbol) %>%
907 | unique
908 |
909 | cat(
910 | sprintf(
911 | "['%s']",
912 | paste(low_risk_symbols, collapse = "', '")
913 | ))
914 | ```
915 |
916 | ## ['USD/AED', 'USD/AUD', 'USD/CHF', 'USD/CNY', 'USD/EUR', 'USD/GBP', 'USD/HKD', 'USD/JPY', 'USD/KZT', 'USD/MXN', 'USD/RUB', 'USD/SEK', 'USD/SGD', 'USD/TRY']
917 |
918 | ``` r
919 | jumper_symbols <- quotes_stats %>% filter(max_min_rate > 2) %>% pull(symbol)
920 |
921 | quotes_df %>%
922 | filter(symbol %in% low_risk_symbols) %>%
923 | mutate(
924 | jumper = if_else(symbol %in% jumper_symbols, "High risk currencies", "Low risk currencies")
925 | ) %>%
926 | group_by(symbol) %>%
927 | mutate(R = cumsum(return)) %>%
928 |
929 | ggplot +
930 | geom_line(aes(x = date, y = R, color = symbol)) +
931 | scale_y_continuous(labels = scales::percent_format(accuracy = 1)) +
932 |
933 | facet_grid(jumper ~ ., scales = "free") +
934 |
935 | labs(
936 | title = "Currencies Exchange Rates", subtitle = "Return of Investment for last 10 years",
937 | x = "", y = "Return of Investment",
938 | caption = currencies_ds$description) +
939 | theme_minimal() +
940 |
941 | theme(
942 | legend.position = "top", legend.title = element_blank(),
943 | plot.caption = element_text(size = 8)
944 | )
945 | ```
946 |
947 | 
948 |
--------------------------------------------------------------------------------
/src/fx_currencies_analysis_files/figure-gfm/unnamed-chunk-3-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/codez0mb1e/resistance/6e505a526a559c5111686efe8b2430a713e3c070/src/fx_currencies_analysis_files/figure-gfm/unnamed-chunk-3-1.png
--------------------------------------------------------------------------------
/src/fx_currency_portfolio__assets_selection.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/python3
2 |
3 | """Currency Portfolio: Assets Selection.
4 |
5 | Description:
6 | Currency Selection in anti-crisis portfolio using Monte Carlo simulation.
7 | """
8 |
9 | # %% Import dependencies ----
10 | # core
11 | import sys
12 | import warnings
13 | import gc
14 | from IPython import sys_info
15 |
16 | # data science
17 | import pandas as pd
18 | import numpy as np
19 | from scipy.stats import norm
20 |
21 | # Cloud integration
22 | from azureml.core import Workspace, Dataset, ComputeTarget, VERSION as aml_version
23 | print(f'Azure ML SDK v{aml_version}')
24 | # plots
25 | import matplotlib.pyplot as plt
26 | import seaborn as sns
27 |
28 | # show info about python env
29 | print(sys_info())
30 | warnings.filterwarnings("ignore")
31 |
32 |
33 | # %% Set params ----
34 | n_days = int(252) # US market has 252 trading days in a year
35 | n_simulations = int(1e4) # number of Monte-Carlo simulations
36 |
37 | # The most promised currencies (copy this list from fx_currencies_analysis.Rmd)
38 | symbols = [
39 | 'USD/AED', 'USD/AUD', 'USD/CHF', 'USD/CNY', 'USD/EUR', 'USD/GBP',
40 | 'USD/HKD', 'USD/JPY', 'USD/KZT', 'USD/MXN', 'USD/RUB', 'USD/SEK', 'USD/SGD'
41 | ]
42 |
43 |
44 | # %% Connect to Azure ML workspace ----
45 | ws = Workspace.from_config()
46 | print(f"Connected to *{ws.get_details()['friendlyName']}* workspace in *{ws.get_details()['location']}*.")
47 |
48 | print('Compute Targets:')
49 | for compute_name in ws.compute_targets:
50 | compute = ws.compute_targets[compute_name]
51 | print('\t', compute.name, ':', compute.type)
52 |
53 | # > htop
54 |
55 |
56 | # %% Load dateset ----
57 | currencies_ds = Dataset.get_by_name(ws, name='Currencies')
58 | currencies_ds.to_pandas_dataframe()
59 |
60 | print(f'Dataset name: {currencies_ds.name}. Description: {currencies_ds.description}.')
61 | print(f'Size of Azure ML dataset object: {sys.getsizeof(currencies_ds)} bytes.')
62 |
63 |
64 | # %% Preprocessing ----
65 | quotes_df = (currencies_ds
66 | # materialize
67 | .to_pandas_dataframe()
68 | # define format
69 | .rename(columns={'slug': 'symbol'})
70 | .loc[:, ['symbol', 'date', 'close']]
71 | # filter
72 | .query("symbol in @symbols")
73 | .query("date > '2012-01-01'")
74 | # set time index
75 | .set_index('date')
76 | .sort_values(by='date'))
77 |
78 | quotes_df
79 |
80 |
81 | # %% Discover data ----
82 | quotes_df.groupby('symbol')['close'].agg(['count', 'last'])
83 |
84 |
85 | # %% USD/RUB dataset ----
86 | usdrub_df = quotes_df[quotes_df.symbol == 'USD/RUB']
87 | usdrub_df
88 |
89 |
90 | # %% Calculate Return ----
91 | def calc_returns(close_prices: pd.Series) -> pd.Series:
92 | """Calculate Investment Return"""
93 | return (close_prices/close_prices.shift()) - 1
94 |
95 |
96 | usdrub_df['diff'] = usdrub_df['close'].diff()
97 | usdrub_df['return'] = calc_returns(usdrub_df['close'])
98 |
99 | usdrub_df[['close', 'diff', 'return']].tail(10)
100 |
101 |
102 | # %% Calculate LogReturn ----
103 | def calc_log_returns(return_prices: pd.Series) -> pd.Series:
104 | """Calculate Log Return"""
105 | return np.log(1 + return_prices)
106 |
107 | usdrub_df['log_return'] = usdrub_df['return'].apply(lambda x: calc_log_returns(x))
108 |
109 | usdrub_df[['close', 'diff', 'return', 'log_return']].tail(10)
110 |
111 |
112 | # %% Simulate possible LogReturns ----
113 |
114 | def calc_simulated_returns(log_returns: pd.Series, n_days: int, n_iterations: int) -> pd.Series:
115 | """Calculate Simulated Return"""
116 |
117 | u = log_returns.mean()
118 | var = log_returns.var()
119 | stdev = log_returns.std()
120 |
121 | drift = u - (0.5*var)
122 | Z = norm.ppf(np.random.rand(n_days, n_iterations))
123 |
124 | return np.exp(drift + stdev*Z)
125 |
126 |
127 | usdrub_simulated_returns = calc_simulated_returns(
128 | usdrub_df['log_return'].dropna(),
129 | n_days,
130 | n_simulations)
131 |
132 | assert(
133 | usdrub_simulated_returns.shape == (n_days, n_simulations)
134 | and (usdrub_simulated_returns > 0).all()
135 | and (usdrub_simulated_returns < 2).all()
136 | )
137 |
138 |
139 | # %% Monte carlo simulation evaluation ----
140 |
141 | def get_breakeven_prob(pred, risk_free_rate: float = 0.02) -> pd.Series:
142 | """
143 | Calculation of the probability of a stock being above a certain threshold,
144 | which can be defined as a value (final stock price) or return rate (percentage change).
145 | """
146 |
147 | init_pred = pred.iloc[0, 0]
148 |
149 | last_pred = pred.iloc[-1]
150 | pred_list = list(last_pred)
151 |
152 | over = [(p*100)/init_pred for p in pred_list if ((p-init_pred)*100)/init_pred >= risk_free_rate]
153 | less = [(p*100)/init_pred for p in pred_list if ((p-init_pred)*100)/init_pred < risk_free_rate]
154 |
155 | return len(over)/(len(over) + len(less))
156 |
157 |
158 | def evaluate_simulation(simulated_returns: pd.Series, last_actual_price: float, n_days: int, plot: bool = True) -> pd.DataFrame:
159 | """
160 | Evaluate Monte-Carlo simulations result
161 | """
162 |
163 | # Create empty matrix
164 | price_list = np.zeros_like(simulated_returns)
165 |
166 | # Put the last actual price in the first row,
167 | # and calculate the price of each day
168 | price_list[0] = last_actual_price
169 | for t in range(1, n_days):
170 | price_list[t] = price_list[(t - 1)]*simulated_returns[t]
171 |
172 | # convert to temp dataframe
173 | price_df = pd.DataFrame(price_list)
174 |
175 | # Plot
176 | if plot == True:
177 | x = price_df.iloc[-1]
178 | fig, ax = plt.subplots(1, 2, figsize=(14, 4))
179 | sns.distplot(x, ax=ax[0])
180 | sns.distplot(x, hist_kws={'cumulative': True}, kde_kws={'cumulative':True}, ax=ax[1])
181 | plt.xlabel('Stock Price')
182 | plt.show()
183 |
184 | print('Results:')
185 | print(f'\tInvestment period: {n_days-1} days')
186 | print(f'\tExpected Value: {round(price_df.iloc[-1].mean(), 2)} per USD')
187 | print(f'\tReturn: {round(100*(price_df.iloc[-1].mean() - price_list[0,1])/price_df.iloc[-1].mean(), 2)}%')
188 | print(f'\tProbability of Breakeven: {get_breakeven_prob(price_df)}')
189 |
190 | return price_df
191 |
192 |
193 | # %% Run Monte carlo simulation and estimate result ----
194 |
195 | usdrub_mc_simulation_df = evaluate_simulation(
196 | usdrub_simulated_returns,
197 | last_actual_price=usdrub_df['close'].tail(1),
198 | n_days=n_days)
199 |
200 |
201 | plt.figure(figsize=(10, 6))
202 | plt.plot(usdrub_mc_simulation_df.sample(10, axis='columns'))
203 | plt.title('USD/RUB Price Simulation')
204 | plt.xlabel('Days')
205 | plt.ylabel('RUB per $1')
206 | plt.ylim(10, 300)
207 | plt.show()
208 |
209 |
210 | # %% Monte Carlo simulation pipeline for multiple tokens ----
211 |
212 | # 1. prepare
213 | quotes_data = [quotes_df.query('symbol == @s') for s in quotes_df.symbol.unique()]
214 | symbols_list = [df.symbol.unique() for df in quotes_data]
215 |
216 | # 2. simulate
217 | returns_data = [calc_returns(df['close']) for df in quotes_data]
218 | log_returns_data = [calc_log_returns(r) for r in returns_data]
219 | simulated_returns_data = [calc_simulated_returns(lr, n_days, n_simulations) for lr in log_returns_data]
220 |
221 | assert(
222 | len(quotes_data) > 0
223 | and len(quotes_data) == len(symbols_list) == len(returns_data) == len(log_returns_data) == len(simulated_returns_data)
224 | )
225 |
226 | # 3. evaluate
227 | for i in range(len(symbols_list)):
228 | print(f'---- Starting Monte-Carlo simulation for {symbols_list[i]} symbol ----')
229 |
230 | prices_ms = evaluate_simulation(simulated_returns_data[i], quotes_data[i]['close'].tail(1), n_days, plot=False)
231 |
232 | plt.figure(figsize=(10, 6))
233 | plt.plot(prices_ms.sample(50, axis='columns'))
234 | plt.title(f'{symbols_list[i]} Price Simulation')
235 | plt.xlabel('Days')
236 | plt.ylabel('Amount per $1')
237 | plt.show()
238 |
239 |
240 | # %% Completed ----
241 | gc.collect()
242 |
243 |
--------------------------------------------------------------------------------