3

У меня есть куча биржевых данных в CSV, по которым я тестирую торговые стратегии. Проблема в том, что моя стратегия покупает цену на открытом рынке, если сигнал был найден вчера, к сожалению, мои данные публикуются только в конце дня, что означает, что я не знаю, должен ли я войти в сделку до закрытия рынка, когда данные выпущены. Но поскольку моя стратегия торгует исключительно по вчерашним данным, я думаю, что обходной путь - просто добавить в конец моих данных запись, представляющую следующий торговый день, и просто показать цену дня как закрытие вчерашнего дня, чтобы не связываться с потерей прибыли. Например, скажем, что один из моих csv выглядит следующим образом (хотя и не в этом формате, реальные файлы не имеют заголовков и разделены запятыми)

Date     |   Open  |   High  |   Low   |   Close  |  Volume  |
20121228 |  12.23  |  12.80  |  12.23  |   12.60  |  129690  |
20121231 |  13.16  |  13.20  |  12.83  |   13.10  |  141290  |
20130102 |  13.03  |  13.42  |  12.97  |   13.23  |  112390  |
20130103 |  13.23  |  13.80  |  12.23  |   12.60  |  100990  |
20130104 |  12.83  |  12.84  |  12.23  |   12.40  |   89690  |

Я хотел бы добавить следующую запись:

20130105 |  12.40  |  12.40  |  12.40  |   12.40  |   89690  |

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

4 ответа4

1

Это может быть проще, чем вы думали, или я, возможно, слишком упростил вашу потребность, но я прочитал ваш вопрос, так как вы хотите добавить файл CSV в существующий файл, а также в Windows и большинстве систем командной оболочки команда будет выглядеть так:

типа кота на UNIX, LINUX и OSX NEWCSVFILENAME >> EXISTINGCSVFILE

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

@ эхо выключено

title = Оценка данных Appender выполняется в% date% в% time% by username%

Копия EXISTINGCSVFILE EXISTINGCSVFILE.% DATE% _bak && Attrib + г EXISTINGCSVFILE.% Дата% _bak

тип cat в UNIX, LINUX и OSX NEWCSVFILENAME >> ** EXISTINGCSVFILE *

title = App Data Data Price ЗАПОЛНЕН на% date% на% time% на% username%

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

Если вы подвергаетесь SarBox или любым другим правилам, которые даже затрагивают мелких бутиковых трейдеров, есть несколько других команд, которые будут записывать независимую запись в ваш системный журнал событий этого процесса, как того требует SarbaneOxley Section 404 и закон Додда-Франка. разделение должностных обязанностей.

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

0

Если вы знакомы с C++, то вы, вероятно, можете справиться с некоторым C #.

Нет проверки ошибок, она изменяет ваш CSV-файл без создания резервной копии, и если CSV-файл имеет большой размер, он не особенно эффективен (так как считывает весь файл в память), но должен дать вам общее представление.

Если у вас Windows 7, то у вас уже должна быть среда dotnet, так что вы можете скопировать ее в файл и скомпилировать ее из командной строки, используя csc filename.cs, и она должна создать filename.exe.

using System.Collections.Generic;
using System;
using System.Linq;

public class Sample
{

    public static void Main()
    {
        string path = @"c:\temp\temp.csv";

        var lines     = System.IO.File.ReadAllLines(path).ToList();
        var lastLine = lines[lines.Count-1];
        var sections = lastLine.Split(new char[] { ','});

        DateTime lastDate = DateTime.ParseExact(sections[0], "yyyyMMdd" , null );
        DateTime newDate  = lastDate.AddDays(1);
        string newLine    = String.Format("{0},{1},{1},{1},{1},{2}", 
                    newDate.ToString("yyyyMMdd"), sections[4] , sections[5]);
        lines.Add(newLine);

        System.IO.File.WriteAllLines(path, lines.ToArray());

    }

}

Однако, поскольку вам понадобится немного отредактировать, я бы порекомендовал загрузить LinqPad и просто скопировать в него метод main (и выбрать C # Program) и нажать run, который должен скомпилировать и запустить его.

0

Если Data.csv содержит:

20121228,12.23,12.80,12.23,12.60,129690
20121231,13.16,13.20,12.83,13.10,141290
20130102,13.03,13.42,12.97,13.23,112390
20130103,13.23,13.80,12.23,12.60,100990
20130104,12.83,12.84,12.23,12.40,89690

и вы хотите добавить следующую строку к нему при каждом запуске скрипта:

20130117,12.40,12.40,12.40,12.40,89690

(т. е. « Текущая дата (ГГГГММДД), Пред. закрытие, Пред. закрытие, Пред. закрытие, Пред. закрытие, Пред. громкость »)

Попробуйте что-то вроде этого, сохраненного как Update.bat:

@echo off
for /f "usebackq tokens=1,5,6 delims=," %%i in (Data.csv) do (
    REM set /a date=%%i+1 // Wrong way to increment a date!
    set close=%%j
    set volume=%%k
)
echo %date:~6%%date:~3,2%%date:~0,2%,%close%,%close%,%close%,%close%,%volume%>>Data.csv

Если вы хотите запустить это на нескольких CSV-файлах в каталоге, замените оба экземпляра Data.csv выше на % 1. Теперь, чтобы обновить один файл, т.е. Data.csv, вы должны использовать команду:

update Data.csv

Чтобы обновить несколько CSV, вы должны использовать команду:

for %f in (*.csv) do @update "%f"

Примечание № 1: Точный формат даты зависит от того, что вы указали в апплете « Регион и язык» . Смотрите здесь для деталей.

Примечание № 2: Я полагаю, что логику приращения даты и проверки достоверности (включая расчет високосного года и т.д.) Можно было бы также реализовать в партии (да, возможно, если бы пистолет был направлен в мою голову!), Но в этот момент я бы начал задавать вопросы здравомыслие спрашивающего (помимо сомнений в моем собственном) и всерьез предположить, что для этого нужно использовать лучший (читай реальный) язык программирования.

0

Если вы работаете в Windows 7 (об этом свидетельствует тег вопроса), вы могли бы добиться этого гораздо проще с PowerShell. Попробуйте посмотреть команды Import-Csv и Export-Csv (последний имеет параметр -Append который очень полезен.

Если хотите, посмотрите документацию по командам:

Импорт-CSV: https://technet.microsoft.com/en-us/library/ee176874.aspx

Экспорт-CSV: https://technet.microsoft.com/pt-br/library/ee176825.aspx

Это было бы что-то вроде этого:

$Path = "C:\PathToFile"
$Objects = Import-Csv $Path
# Here $Objects will be an array of objects, which you can access its 
# properties by the same name in the header of your csv
# you can then do whatever you want in the list:
foreach ($Object in $Objects){
    $Object.Date = $SomeDate
}
# or you can add a new object to the list
$NewObject = [pscustomobject]@{
     Date = Get-Date;
     Open = "12.58";
}
$Objects += $NewObject
# and then finally save it with:
$Objects | Export-csv $Path -Force -NoTypeInformation
# Alternatively, you can add just the object at the end with append, like this
$NewObject | Export-Csv $Path -Append

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .