
時系列とは、連続した等間隔の時間間隔で取得されたデータのシーケンスです。定量投資では、これらのデータは主に、追跡されている投資対象の価格の動きとデータ ポイントとして表されます。たとえば、株価など、一定期間にわたって定期的に記録された時系列データは、次の図に示すようになり、読者の理解が深まります。

ご覧のとおり、日付は x 軸にあり、価格は y 軸にあります。この場合、「連続した間隔」とは、X 軸上の日数が 14 日離れていることを意味します。2005 年 3 月 7 日と次のポイントである 2005 年 3 月 31 日と 2005 年 4 月 5 日と 2005 年 4 月 19 日の違いに注意してください。
ただし、時系列データを扱う場合、日付や価格の列以外のものも表示されることがよくあります。ほとんどの場合、データ期間、始値、高値、安値、終値の 5 つの列を含むデータを操作します。つまり、データ期間が日次レベルに設定されている場合、その日の高値、始値、安値、終値の変化がこの時系列のデータに反映されます。
ティックデータは取引所における最も詳細な取引データ構造です。これは、上記の時系列データの拡張形式でもあり、始値、最高値、最低値、最新価格、取引量、取引金額などが含まれます。取引データを川に例えると、ティックデータは川の特定の断面におけるデータです。

上の図に示すように、外国為替のすべてのアクションはリアルタイムで市場にプッシュされます。国内取引所は 1 秒に 2 回チェックします。この期間中に何らかのアクションがあった場合、スナップショットが生成され、プッシュされます。比較すると、データ プッシュはせいぜい OnTime としかみなされず、OnTick と呼ぶことはできません。
このチュートリアルのすべてのコードと時系列データは、Inventor Quantitative Platform から取得されます。
国内のティック データは実際のティックではありませんが、このデータをバックテストに使用すると、少なくとも現実に限りなく近づき、それを復元することができます。各ティックは、その時点での市場における商品の主なパラメータを表示し、実際の市場では、当社のコードは 1 秒あたり 2 回の理論的なティック レートに従って計算されます。

それだけでなく、Inventor Quantification では、1 時間のデータをロードする場合でも、データの粒度を 1 分に調整するなど、データの粒度を調整できます。現時点では、1 時間の K ラインは 1 分間のデータで構成されています。もちろん、粒子サイズが小さいほど、精度は高くなります。さらに強力なのは、データをリアルタイムティックに切り替えると、リアルタイム環境をシームレスに復元できることです。つまり、交換の実際のデータは 1 秒あたり 2 回刻まれます。

これで、このチュートリアルを完了するために知っておく必要のある基本的な概念を理解できました。これらの概念については後ほど詳しく説明します。このチュートリアルの後半でさらに詳しく説明します。
この部分の詳細については、https://www.fmz.com/bbs-topic/1651 をご覧ください。
仕事をうまくこなすには、まずツールを磨かなければなりません。Inventor Quantitative Platformにカストディアンをデプロイする必要があります。カストディアンの概念については、プログラミング経験のある読者は、公式にパッケージ化されたDockerシステムと考えることができます。このシステムにはさまざまな主流の取引所のパブリック API インターフェースと、戦略の作成およびバックテストのための詳細な技術的詳細をカプセル化しました。このシステムを確立した当初の目的は、Inventor Quantitative Platformを使用する際に、定量的トレーダーが戦略の記述と設計に集中する必要がなくなるようにすることです。これらの技術的な詳細は、戦略作成者にパッケージ形式で提示され、多くの手間を省きます。時間とエネルギー。
ホストを展開するには 2 つの方法があります。
方法 A: ユーザーが自分でサーバーをレンタルまたは購入し、AWS、Alibaba Cloud、Digital Ocean、Google Cloud などの主要なクラウド コンピューティング プラットフォームに展開します。利点は、戦略セキュリティとシステム セキュリティの両方が保証されることです。Inventor Quantitative Platform の場合、ユーザーはこの方法を使用することをお勧めします。このような分散展開により、サーバー攻撃のリスクが排除されます (顧客またはプラットフォーム自体に対する攻撃)。
この部分については、次のサイトを参照してください: https://www.fmz.com/bbs-topic/2848
方法 B: Inventor Quantitative Platform のパブリック サーバー展開を使用します。このプラットフォームは、香港、ロンドン、杭州での展開を提供しています。ユーザーは、取引したい取引所の場所に基づいて、近接原則に従って展開できます。この側面の利点は、シンプルで簡単で、ワンクリックで完了できることです。特に初心者ユーザーに適しています。Linuxサーバーを購入する際に多くの問題を理解する必要がなく、時間とエネルギーも節約できます。 Linux コマンドの学習に最適です。価格も比較的安価で、資金が少ないユーザーに適しています。ユーザーには、この展開方法の使用をプラットフォームが推奨しています。

初心者の理解に配慮するため、この記事では方法 B を採用します。
具体的な操作は、FMZ.COM にログインし、コントロール センター、ホストをクリックし、ホスト ページでホストのワンクリック レンタルをクリックします。
パスワードを入力します。展開が成功すると、次の図が表示されます。

上で述べたように、ホストはDockerシステムのようなもので、Dockerシステムは標準セットのようなものです。この標準セットを展開した後、この標準の「インスタンス」を生成する必要があります。この「インスタンス」はロボット。
ロボットの作成は非常に簡単です。ホストをデプロイした後、左側のロボット列をクリックし、「ロボットの作成」をクリックして、ラベル名に名前を入力し、ホスティング ホストでデプロイしたホストを選択します。以下のダイアログボックスのパラメータ選択と K ライン期間は、主に取引戦略の選択と連携して、特定の状況に応じて選択できます。

この時点で、作業環境がセットアップされました。ご覧のとおり、非常にシンプルで効果的であり、各機能が独自の機能を実行します。次に、定量戦略の作成を開始します。
上記では、時系列データとティックデータの概念について説明しました。次に、単純移動平均戦略を使用して、これら 2 つの概念をリンクします。
7 日移動平均などの低周期移動平均と 3 日移動平均などの高速移動平均を通じて。これらを同じ K ライン チャートに適用すると、高速移動平均が低速移動平均を横切る場合、これをゴールデン クロスと呼び、低速移動平均が高速移動平均を横切る場合、これをデッド クロスと呼びます。
ポジションを開く基本は、ゴールデンクロスが現れたときにロング注文を開き、ゴールデンクロスが現れたときにショート注文を開くことです。ポジションを閉じる場合も同じ原則が適用されます。
FMZ.COM を開き、アカウントにログインし、コントロール センター、戦略ライブラリに移動して、新しい戦略を作成し、左上隅の戦略作成言語で Python を選択しましょう。以下はこの戦略のコードです。各行には非常に詳細なコメントがあります。時間をかけてじっくりとご覧ください。この戦略は実際の戦略ではないので、実際のお金で実験しないでください。主に、戦略の書き方と学習テンプレートの一般的なアイデアをすべての人に提供するためのものです。
import types # 导入Types模块库,这是为了应对代码中将要用到的各种数据类型
def main(): # 主函数,策略逻辑从这里开始
STATE_IDLE = -1 # 标记持仓状态变量
state = STATE_IDLE # 标记当前持仓状态
initAccount = ext.GetAccount() #这里用到了现货数字货币交易类库(python版),编写策略时记得勾选上,作用是获得账户初始信息
while True: # 进入循环
if state == STATE_IDLE : # 这里开始开仓逻辑
n = ext.Cross(FastPeriod,SlowPeriod) # 这里用到了指标交叉函数,详情请查看https://www.fmz.com/strategy/21104
if abs(n) >= EnterPeriod : # 如果n大于等于入市观察期,这里的入市观察期是为了防止一开盘就胡乱开仓。
opAmount = _N(initAccount.Stocks * PositionRatio,3) # 开仓量,关于_N的用法,请查看官方API文档
Dict = ext.Buy(opAmount) if n > 0 else ext.Sell(opAmount) # 建立一个变量,用于存储开仓状态,并执行开仓操作
if Dict : # 查看dict变量的情况,为下面的日志输出做准备
opAmount = Dict['amount']
state = PD_LONG if n > 0 else PD_SHORT # PD_LONG和PD_SHORT均为全局常量,分别用来表示多头和空头仓位。
Log("开仓详情",Dict,"交叉周期",n) # 日志信息
else: # 这里开始平仓逻辑
n = ext.Cross(ExitFastPeriod,ExitSlowPeriod) # 指标交叉函数,
if abs(n) >= ExitPeriod and ((state == PD_LONG and n < 0) or (state == PD_SHORT and n > 0)) : # 如果经过了离市观察期且当前账户状态为持仓状态,进而判断金叉或者死叉
nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
Dict2 = ext.Sell(nowAccount.Stocks - initAccount.Stocks) if state == PD_LONG else ext.Buy(initAccount.Stocks - nowAccount.Stocks) # 平仓逻辑,是多头就平多头,是空头就平空头。
state = STATE_IDLE # 标记平仓后持仓状态。
nowAccount = ext.GetAccount() # 再次刷新和获取账户信息
LogProfit(nowAccount.Balance - initAccount.Balance,'钱:',nowAccount.Balance,'币:',nowAccount.Stocks,'平仓详情:',Dict2,'交叉周期:',n) # 日志信息
Sleep(Interval * 1000) # 循环暂停一秒,防止API访问频率过快导致账户被限制。
戦略編集ページでは、戦略の記述が完了しました。次に、この戦略をバックテストして、過去の市場状況でのパフォーマンスを確認する必要があります。バックテストは、定量戦略の開発において重要な役割を果たしますが、それだけではありません。重要な参考資料として役立ちます。バックテストは利益の保証を意味するものではありません。市場は常に変化しているからです。バックテストは後知恵の行為に過ぎず、依然として帰納法の範疇に属します。市場は演繹的です。
シミュレーションされたバックテストをクリックすると、多くの調整可能なパラメータがあり、直接変更できることがわかります。戦略がますます複雑になり、パラメータの数が増えるにつれて、この変更方法により、ユーザーはコード内で 1 つずつ変更します。変更プロセスは手間がかからず、迅速かつ簡単で、明確に整理されています。

後続のチューニング オプションにより、設定されたパラメータが自動的に最適化されます。システムはさまざまな最適なパラメータを試して、戦略開発者が最適な選択を見つけられるようにします。
上記の例から、定量取引の基礎は時系列データの分析とティックデータのバックテストの相互作用であることがわかります。ロジックがどれだけ複雑であっても、これら 2 つの基本要素から切り離すことはできません。違いは次元だけです。たとえば、高頻度取引には、より詳細なデータ セクションとより豊富な時系列データが必要です。たとえば、裁定取引では、バックテスト サンプルに比較的大量のデータが必要です。金利スプレッドの拡大と縮小の統計結果を見つけるには、2 つの取引対象について 10 年以上にわたる詳細な継続データが必要になる場合があります。今後の記事では、高頻度取引や裁定取引の戦略を紹介していきますので、お楽しみに。