{"id":19812721,"url":"https://github.com/devonfulcher/cryptopricepredictor","last_synced_at":"2026-01-19T12:32:48.485Z","repository":{"id":95923293,"uuid":"174045095","full_name":"DevonFulcher/CryptoPricePredictor","owner":"DevonFulcher","description":"Temporal Convolutional Neural Network on Cryptocurrency data. Based off of https://github.com/philipperemy/keras-tcn","archived":false,"fork":false,"pushed_at":"2022-02-22T20:35:14.000Z","size":3224,"stargazers_count":2,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-05T08:12:43.594Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/DevonFulcher.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-03-06T01:02:29.000Z","updated_at":"2023-03-04T12:36:10.000Z","dependencies_parsed_at":"2023-04-03T11:32:43.352Z","dependency_job_id":null,"html_url":"https://github.com/DevonFulcher/CryptoPricePredictor","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/DevonFulcher/CryptoPricePredictor","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevonFulcher%2FCryptoPricePredictor","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevonFulcher%2FCryptoPricePredictor/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevonFulcher%2FCryptoPricePredictor/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevonFulcher%2FCryptoPricePredictor/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/DevonFulcher","download_url":"https://codeload.github.com/DevonFulcher/CryptoPricePredictor/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/DevonFulcher%2FCryptoPricePredictor/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28567896,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-19T08:53:44.001Z","status":"ssl_error","status_checked_at":"2026-01-19T08:52:40.245Z","response_time":67,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-12T09:32:10.209Z","updated_at":"2026-01-19T12:32:48.464Z","avatar_url":"https://github.com/DevonFulcher.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Read Cryptocurrency_Price_Predictor.pdf to learn more about our reasearch. The following documentation is from https://github.com/philipperemy/keras-tcn.\n\n# Keras TCN\n\n```bash\npip install keras-tcn\n```\n\n*Keras Temporal Convolutional Network*\n\n   * [Keras TCN](#keras-tcn)\n      * [Why Temporal Convolutional Network?](#why-temporal-convolutional-network)\n      * [API](#api)\n         * [Arguments](#arguments)\n         * [Input shape](#input-shape)\n         * [Output shape](#output-shape)\n         * [Receptive field](#receptive-field)\n         * [Non-causal TCN](#non-causal-tcn)\n      * [Installation](#installation)\n      * [Run](#run)\n      * [Tasks](#tasks)\n         * [Adding Task](#adding-task)\n            * [Explanation](#explanation)\n            * [Implementation results](#implementation-results)\n         * [Copy Memory Task](#copy-memory-task)\n            * [Explanation](#explanation-1)\n            * [Implementation results (first epochs)](#implementation-results-first-epochs)\n         * [Sequential MNIST](#sequential-mnist)\n            * [Explanation](#explanation-2)\n            * [Implementation results](#implementation-results-1)\n      * [References](#references)\n\n## Why Temporal Convolutional Network?\n\n- TCNs exhibit longer memory than recurrent architectures with the same capacity.\n- Constantly performs better than LSTM/GRU architectures on a vast range of tasks (Seq. MNIST, Adding Problem, Copy Memory, Word-level PTB...).\n- Parallelism, flexible receptive field size, stable gradients, low memory requirements for training, variable length inputs...\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"misc/Dilated_Conv.png\"\u003e\n  \u003cb\u003eVisualization of a stack of dilated causal convolutional layers (Wavenet, 2016)\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n## API\n\nThe usual way is to import the TCN layer and use it inside a Keras model. I provide a snippet below to illustrate it on a regression task (cf. `tasks/` for other examples):\n\n```python\nfrom keras.layers import Dense\nfrom keras.models import Input, Model\n\nfrom tcn import TCN\n\nbatch_size, timesteps, input_dim = None, 20, 1\n\n\ndef get_x_y(size=1000):\n    import numpy as np\n    pos_indices = np.random.choice(size, size=int(size // 2), replace=False)\n    x_train = np.zeros(shape=(size, timesteps, 1))\n    y_train = np.zeros(shape=(size, 1))\n    x_train[pos_indices, 0] = 1.0\n    y_train[pos_indices, 0] = 1.0\n    return x_train, y_train\n\n\ni = Input(batch_shape=(batch_size, timesteps, input_dim))\n\no = TCN(return_sequences=False)(i)  # The TCN layers are here.\no = Dense(1)(o)\n\nm = Model(inputs=[i], outputs=[o])\nm.compile(optimizer='adam', loss='mse')\n\nx, y = get_x_y()\nm.fit(x, y, epochs=10, validation_split=0.2)\n```\n\nIn the example above, TCNs can also be stacked together, like this:\n\n```python\no = TCN(return_sequences=True)(i)\no = TCN(return_sequences=False)(o)\n```\n\nI also provide a ready to use TCN model that can be imported and used this way (cf. `tasks/` for the full code):\n\n```python\nfrom tcn import compiled_tcn\n\nmodel = compiled_tcn(...)\nmodel.fit(x, y) # Keras model.\n```\n\n### Arguments\n\n`TCN(nb_filters=64, kernel_size=2, nb_stacks=1, dilations=[1, 2, 4, 8, 16, 32], padding='causal', use_skip_connections=True, dropout_rate=0.0, return_sequences=True, name='tcn')`\n\n- `nb_filters`: Integer. The number of filters to use in the convolutional layers.\n- `kernel_size`: Integer. The size of the kernel to use in each convolutional layer.\n- `dilations`: List. A dilation list. Example is: [1, 2, 4, 8, 16, 32, 64].\n- `nb_stacks`: Integer. The number of stacks of residual blocks to use.\n- `padding`: String. The padding to use in the convolutions. 'causal' for a causal network (as in the original implementation) and 'same' for a non-causal network.\n- `use_skip_connections`: Boolean. If we want to add skip connections from input to each residual block.\n- `return_sequences`: Boolean. Whether to return the last output in the output sequence, or the full sequence.\n- `dropout_rate`: Float between 0 and 1. Fraction of the input units to drop.\n- `name`: Name of the model. Useful when having multiple TCN.\n\n### Input shape\n\n3D tensor with shape `(batch_size, timesteps, input_dim)`.\n\n`timesteps` can be None. This can be useful if each sequence is of a different length: [Multiple Length Sequence Example](tasks/multi_length_sequences.py).\n\n### Output shape\n\nIt depends on the task (cf. below for examples):\n\n- Regression (Many to one) e.g. adding problem\n- Classification (Many to many) e.g. copy memory task\n- Classification (Many to one) e.g. sequential mnist task\n\nFor a Many to Many regression, a cheap fix for now is to change the [number of units of the final Dense layer](https://github.com/philipperemy/keras-tcn/blob/8151b4a87f906fd856fd1c113c48392d542d0994/tcn/tcn.py#L90).\n\n### Receptive field\n\n- Receptive field = **nb_stacks_of_residuals_blocks * kernel_size * last_dilation**.\n- If a TCN has only one stack of residual blocks with a kernel size of 2 and dilations [1, 2, 4, 8], its receptive field is 2 * 1 * 8 = 16. The image below illustrates it:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/40159126/41830054-10e56fda-7871-11e8-8591-4fa46680c17f.png\"\u003e\n  \u003cb\u003eks = 2, dilations = [1, 2, 4, 8], 1 block\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n- If the TCN has now 2 stacks of residual blocks, wou would get the situation below, that is, an increase in the receptive field to 32:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/40159126/41830618-a8f82a8a-7874-11e8-9d4f-2ebb70a31465.jpg\"\u003e\n  \u003cb\u003eks = 2, dilations = [1, 2, 4, 8], 2 blocks\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n\n- If we increased the number of stacks to 3, the size of the receptive field would increase again, such as below:\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://user-images.githubusercontent.com/40159126/41830628-ae6e73d4-7874-11e8-8ecd-cea37efa33f1.jpg\"\u003e\n  \u003cb\u003eks = 2, dilations = [1, 2, 4, 8], 3 blocks\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\nThanks a lot to [@alextheseal](https://github.com/alextheseal) for providing such visuals.\n\n### Non-causal TCN\n\nMaking the TCN architecture non-causal allows it to take the future into consideration to do its prediction as shown in the figure below.\n\nHowever, it is not anymore suitable for real-time applications.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"misc/Non_Causal.png\"\u003e\n  \u003cb\u003eNon-Causal TCN - ks = 3, dilations = [1, 2, 4, 8], 1 block\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\nSpecial thanks to: [@qlemaire22](https://github.com/qlemaire22)\n\n## Installation (Python 3)\n\n```bash\ngit clone git@github.com:philipperemy/keras-tcn.git\ncd keras-tcn\nvirtualenv -p python3.6 venv\nsource venv/bin/activate\npip install -r requirements.txt # change to tensorflow if you dont have a gpu.\npip install . --upgrade # install it as a package.\n```\n\nNote: Only compatible with Python 3 at the moment. Should be almost compatible with python 2.\n\n## Run\n\nOnce `keras-tcn` is installed as a package, you can take a glimpse of what's possible to do with TCNs. Some tasks examples are  available in the repository for this purpose:\n\n```bash\ncd adding_problem/\npython main.py # run adding problem task\n\ncd copy_memory/\npython main.py # run copy memory task\n\ncd mnist_pixel/\npython main.py # run sequential mnist pixel task\n```\n\n## Tasks\n\n### Adding Task\n\nThe task consists of feeding a large array of decimal numbers to the network, along with a boolean array of the same length. The objective is to sum the two decimals where the boolean array contain the two 1s.\n\n#### Explanation\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"misc/Adding_Task.png\"\u003e\n  \u003cb\u003eAdding Problem Task\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n#### Implementation results\n\nThe model takes time to learn this task. It's symbolized by a very long plateau (could take ~8 epochs on some runs).\n\n```\n200000/200000 [==============================] - 293s 1ms/step - loss: 0.1731 - val_loss: 0.1662\n200000/200000 [==============================] - 289s 1ms/step - loss: 0.1675 - val_loss: 0.1665\n200000/200000 [==============================] - 287s 1ms/step - loss: 0.1670 - val_loss: 0.1665\n200000/200000 [==============================] - 288s 1ms/step - loss: 0.1668 - val_loss: 0.1669\n200000/200000 [==============================] - 285s 1ms/step - loss: 0.1085 - val_loss: 0.0019\n200000/200000 [==============================] - 285s 1ms/step - loss: 0.0011 - val_loss: 4.1667e-04\n200000/200000 [==============================] - 282s 1ms/step - loss: 6.0470e-04 - val_loss: 6.7708e-04\n200000/200000 [==============================] - 282s 1ms/step - loss: 4.3099e-04 - val_loss: 7.3898e-04\n200000/200000 [==============================] - 282s 1ms/step - loss: 3.9102e-04 - val_loss: 1.8727e-04\n200000/200000 [==============================] - 280s 1ms/step - loss: 3.1040e-04 - val_loss: 0.0010\n200000/200000 [==============================] - 281s 1ms/step - loss: 3.1166e-04 - val_loss: 2.2333e-04\n200000/200000 [==============================] - 281s 1ms/step - loss: 2.8046e-04 - val_loss: 1.5194e-04\n```\n\n### Copy Memory Task\n\nThe copy memory consists of a very large array:\n- At the beginning, there's the vector x of length N. This is the vector to copy.\n- At the end, N+1 9s are present. The first 9 is seen as a delimiter.\n- In the middle, only 0s are there.\n\nThe idea is to copy the content of the vector x to the end of the large array. The task is made sufficiently complex by increasing the number of 0s in the middle.\n\n#### Explanation\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"misc/Copy_Memory_Task.png\"\u003e\n  \u003cb\u003eCopy Memory Task\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n#### Implementation results (first epochs)\n\n```\n30000/30000 [==============================] - 30s 1ms/step - loss: 0.1174 - acc: 0.9586 - val_loss: 0.0370 - val_acc: 0.9859\n30000/30000 [==============================] - 26s 874us/step - loss: 0.0367 - acc: 0.9859 - val_loss: 0.0363 - val_acc: 0.9859\n30000/30000 [==============================] - 26s 852us/step - loss: 0.0361 - acc: 0.9859 - val_loss: 0.0358 - val_acc: 0.9859\n30000/30000 [==============================] - 26s 872us/step - loss: 0.0355 - acc: 0.9859 - val_loss: 0.0349 - val_acc: 0.9859\n30000/30000 [==============================] - 25s 850us/step - loss: 0.0339 - acc: 0.9864 - val_loss: 0.0291 - val_acc: 0.9881\n30000/30000 [==============================] - 26s 856us/step - loss: 0.0235 - acc: 0.9896 - val_loss: 0.0159 - val_acc: 0.9944\n30000/30000 [==============================] - 26s 872us/step - loss: 0.0169 - acc: 0.9929 - val_loss: 0.0125 - val_acc: 0.9966\n```\n\n### Sequential MNIST\n\n#### Explanation\n\nThe idea here is to consider MNIST images as 1-D sequences and feed them to the network. This task is particularly hard because sequences are 28*28 = 784 elements. In order to classify correctly, the network has to remember all the sequence. Usual LSTM are unable to perform well on this task.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"misc/Sequential_MNIST_Task.png\"\u003e\n  \u003cb\u003eSequential MNIST\u003c/b\u003e\u003cbr\u003e\u003cbr\u003e\n\u003c/p\u003e\n\n#### Implementation results\n\n```\n60000/60000 [==============================] - 118s 2ms/step - loss: 0.2348 - acc: 0.9265 - val_loss: 0.1308 - val_acc: 0.9579\n60000/60000 [==============================] - 116s 2ms/step - loss: 0.0973 - acc: 0.9698 - val_loss: 0.0645 - val_acc: 0.9798\n[...]\n60000/60000 [==============================] - 112s 2ms/step - loss: 0.0075 - acc: 0.9978 - val_loss: 0.0547 - val_acc: 0.9894\n60000/60000 [==============================] - 111s 2ms/step - loss: 0.0093 - acc: 0.9968 - val_loss: 0.0585 - val_acc: 0.9895\n```\n\n\n## References\n- https://github.com/locuslab/TCN/ (TCN for Pytorch)\n- https://arxiv.org/pdf/1803.01271.pdf (An Empirical Evaluation of Generic Convolutional and Recurrent Networks\nfor Sequence Modeling)\n- https://arxiv.org/pdf/1609.03499.pdf (Original Wavenet paper)\n\n### Repo views (since 2018/10/30)\n[![HitCount](http://hits.dwyl.io/philipperemy/keras-tcn.svg)](http://hits.dwyl.io/philipperemy/keras-tcn)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevonfulcher%2Fcryptopricepredictor","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdevonfulcher%2Fcryptopricepredictor","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdevonfulcher%2Fcryptopricepredictor/lists"}